BZOJ1841 螞蟻搬家

2021-09-08 19:17:22 字數 2816 閱讀 8231

樹分治,對於每個分治結構,維護兩棵線段樹。

第一棵按dfs序維護所有點到重心的距離,第二棵維護每個分支的最長鏈。

那麼當前結構對答案的貢獻就是第二棵線段樹的最大值$+$次大值。

對於操作$0$,如果是啟用某個點,則直接把它距離$+=inf$,隱藏某個點則是$-=inf$。

對於操作$1$,相當於子樹全部加上乙個值,進行區間加即可。

時間複雜度$o(n\log^2n)$。

#include#includeusing namespace std;

const int n=100010,m=262150,inf=1000000000;

int n,m,i,j,e[n][3],ex[n],active,q[n][3],ans[n],tag[m];

int g[n],v[n<<1],w[n<<1],ok[n<<1],nxt[n<<1],ed,g[n],nxt[n];

int son[n],f[n],all,now;

inline void read(int&a)

inline void umax(int&a,int b)

void change(int x,int a,int b,int c,int d,int p)

int mid=(a+b)>>1;

if(c<=mid)change(x<<1,a,mid,c,d,p);

if(d>mid)change(x<<1|1,mid+1,b,c,d,p);

}void print(int x,int a,int b)

return;

} int mid=(a+b)>>1;

umax(tag[x<<1],tag[x]);

umax(tag[x<<1|1],tag[x]);

print(x<<1,a,mid),print(x<<1|1,mid+1,b);

}inline void add(int x,int y,int z)

inline void add(int x,int y)

void findroot(int x,int y)

if(all-son[x]>f[x])f[x]=all-son[x];

if(f[x]>1;

build(x<<1,a,mid),build(x<<1|1,mid+1,b),up(x);

}void add(int x,int a,int b,int c,int d,int p)

pb(x);

int mid=(a+b)>>1;

if(c<=mid)add(x<<1,a,mid,c,d,p);

if(d>mid)add(x<<1|1,mid+1,b,c,d,p);

up(x);

}int ask(int x,int a,int b,int c,int d)

}namespace subelse

}void build(int x,int a,int b)

int mid=(a+b)>>1;

build(x<<1,a,mid),build(x<<1|1,mid+1,b),up(x);

}void change(int x,int a,int b,int c,int p)

int mid=(a+b)>>1;

if(c<=mid)change(x<<1,a,mid,c,p);else change(x<<1|1,mid+1,b,c,p);

up(x);}}

inline void init(int x)

void dfs(int x,int y,int z,int dep)

inline void update(int l,int r)

void solve(int x)

if(!cur)return;

node::build(1,1,dfn);

sub::build(1,1,cur);

sort(pool+1,pool+cp+1);

pool[cp+1]=m+1;

update(1,pool[1]-1);

for(i=1;i<=cp;i++)

if(ex[b])node::add(1,1,dfn,st[b],st[b],-inf);

else node::add(1,1,dfn,st[b],st[b],inf);

sub::change(1,1,cur,from[b],node::ask(1,1,dfn,st[from[b]],en[from[b]]));

ex[b]^=1;

}else

int z=d[e[b][0]]>d[e[b][1]]?e[b][0]:e[b][1];

node::add(1,1,dfn,st[z],en[z],c-=edge[b]);

sub::change(1,1,cur,from[z],node::ask(1,1,dfn,st[from[z]],en[from[z]]));

edge[b]+=c;

}update(pool[i],pool[i+1]-1);

} for(i=g[x];i;i=nxt[i])if(ok[i])

}int main()

read(m);

for(i=1;i<=n;i++)ex[i]=1;

for(active=n,i=1;i<=m;i++)

if(q[i][0]==1)add(e[q[i][1]][0],i);

if(q[i][0]==2)

} build(1,1,m);

f[0]=all=n;findroot(1,now=0);solve(now);

print(1,1,m);

return 0;

}

18 4比薩店作業

class pizza models.model pizza的名稱 name models.charfield max length 50 date added models.datetimefield auto now add true def str self 返回模型的字串表示 return ...

lintcode練習 184 最大數

給出一組非負整數,重新排列他們的順序把他們組成乙個最大的整數。最後的結果可能很大,所以我們返回乙個字串來代替這個整數。您在真實的面試中是否遇到過這個題?是 給出 1,20,23,4,8 返回組合最大的整數應為8423201。在 o nlogn 的時間複雜度內完成。實現 注意 python3中內建函式...

Django 18 4建立其他網頁

在index.html的目錄中建立乙個名為base.html的父模板,讓每個網頁都繼承這個模板,而不必在沒有網頁中都重複修改這些通用元素。目前每個網頁中都只有頂端的標題。base.html learning log 現在重新編寫index.html,使其繼承base.html index.html ...