樹分治,對於每個分治結構,維護兩棵線段樹。
第一棵按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 ...