BZOJ 4129 樹上帶修莫隊 線段樹

2021-07-27 18:14:01 字數 1694 閱讀 6415

思路:

可以先做做bzoj3585 是序列上的mex

考慮莫隊的轉移 如果當前數字出現過 線段樹上把它置成1

對於詢問 二分ans 線段樹上查 0到ans的和 是不是ans+1

本題就是把它搞到了序列上 帶了個修改…

麻煩一點 本質上是一樣的

//by siriusren

#include

#include

#include

#include

using namespace std;

const int n=55555;

int n,m,cnt=1,block,block[n],op,xx,yy,a[n],vis[n],last[n],sum[n],tree[n*8];

int first[n],next[n*2],v[n*2],tot,s[n],top,fa[n][20],cnt1,cnt2,deep[n],ans[n];

void add(int

x,int

y)void dfs(intx)}

struct ask

ask(int t,int i,int l,int r)

friend bool operator<(ask a,ask b)

change(int l,int p,int nn)

}change[n];

void insert(int l,int r,int

pos,int num,int f)

int mid=(l+r)>>1,lson=pos

<<1,rson=pos

<<1|1;

if(mid1,r,rson,num,f);

else insert(l,mid,lson,num,f);

tree[pos]=tree[lson]+tree[rson];

}int query(int l,int r,int

pos,int l,int r)

void reverse(int

x) else

}}void change_color(int

x,int

y)void work(int

x,inty)}

int lca(int

x,int

y)bool check(int

x)int main()

else change[++cnt2]=change(last[xx],xx,yy),last[xx]=yy;

}sort(ask+1,ask+1+cnt1);

for(int i=1,t=0;i<=cnt1;i++)

for(;t>ask[i].time;t--)

if(i!=1)work(ask[i-1].l,ask[i].l),work(ask[i-1].r,ask[i].r);

else work(ask[i].l,ask[i].r);

reverse(lca(ask[i].l,ask[i].r));

int l=0,r=n,ans=0;

while(l<=r)

ans[ask[i].id]=ans;

reverse(lca(ask[i].l,ask[i].r));

}for(int i=1;i<=cnt1;i++)printf("%d\n",ans[i]);

}

BZOJ 4129 樹上帶修莫隊 線段樹

思路 可以先做做bzoj3585 是序列上的mex 考慮莫隊的轉移 如果當前數字出現過 線段樹上把它置成1 對於詢問 二分ans 線段樹上查 0到ans的和 是不是ans 1 本題就是把它搞到了序列上 帶了個修改 麻煩一點 本質上是一樣的 by siriusren include include i...

F Machine Learning(帶修莫隊)

f.machine learning 思路 統計每個數字出現的次數numi,記錄次數numi出現的次數cnti。然後就是帶修莫隊的事情了。注意 不要用node x,y,z 這種方式,不然就是錯,很迷。include include include include include includeusi...

帶修莫隊 bzoj2120 數顏色

塊大小為n2 3。把詢問和修改分開。每次兩個詢問之間的修改進行暴力轉移,如果修改在上一次詢問的區間裡,就會對當前狀態形成影響。好慢。include include include includeusing namespace std define n 10001 int num n n,m,b n ...