Luogu U16325小奇的花園(樹鏈剖分)

2022-05-01 01:15:12 字數 1807 閱讀 7796

題目鏈結

學了學動態開點的樹鏈剖分,其實跟動態開點的線段樹差不多啦

查詢的時候別ssbb地動態開點,如果沒這個點果斷返回0就行

只要注意花的種類能到intmax就行qwq!!!!

#include#include

#include

#include

#include

#include

#define mid ((l+r)>>1)

#define maxn 100010

#define check(x) if(x==0) x=++tot;

using

namespace

std;

inline

long

long

read()

while

(isdigit(ch))

return num*f;

}int

tot;

maproot;

int ls[maxn*100

];int rs[maxn*100

];int

q[maxn];

intsize[maxn];

inttop[maxn];

intson[maxn];

intfather[maxn];

intdfn[maxn];

intdeep[maxn];

intback[maxn],cnt;

intn,m;

struct

edgeedge[maxn*3

];int

head[maxn],num;

inline

void add(int

from,int

to);

head[

from]=num;

}void find(int x,int

fa)}

void unionn(int x,int

top)

return;}

inline

void pushup(int rt)

void update(int o,int num,int l,int r,int &rt)

if(o<=mid) update(o,num,l,mid,ls[rt]);

else update(o,num,mid+1

,r,rs[rt]);

pushup(rt);

}int query(int

from,int to,int l,int r,int &rt)

inline

void addcol(int pos,int

val)

int ask(int

from,int to,int

val)

if(deep[from]>deep[to]) swap(from

,to);

ans+=query(dfn[from],dfn[to],1

,n,root[val]);

return

ans;

}int

main()

find(

1,1);

unionn(

1,1);

for(int i=1;i<=n;++i) update(dfn[i],1,1

,n,root[q[i]]);

int last=0

;

for(int i=1;i<=m;++i)

else

}return0;

}

小奇的數列

題目 背景 小奇總是在數學課上思考奇怪的問題。問題描述 給定乙個長度為 n 的數列,以及 m 次詢問,每次給出三個數 l,r 和 p,詢問 a l a l 1 a r mod p 的最小值。其中 l l r r。即模意義下的區間子串和最小值。輸入格式 第一行包含兩個正整數 n 和 m,表示數列的長度...

BZOJ 4548 小奇的糖果

有 n 個彩色糖果在平面上。小奇想在平面上取一條水平的線段,並拾起它上方或下方的所有糖果。求出最多能夠拾 起多少糖果,使得獲得的糖果並不包含所有的顏色。包含多組測試資料,第一行輸入乙個正整數 t 表示測試資料組數。接下來 t 組測試資料,對於每組測試資料,第一行輸入兩個正整數 n k,分別表示點數和...

JZOJ5228 小奇的集合

題意 有乙個大小為n的可重集s,小奇每次操作可以加入乙個數a b a,b均屬於s 求k次操作後它可獲得的s的和的最大值。資料保證這個值為非負數 輸出乙個整數,表示和的最大值。答案對10000007取模。對於30 的資料,有 n 105,k 105,ai 105。對於100 的資料,有 n 105,k...