树分治,对于每个分治结构,维护两棵线段树。

第一棵按dfs序维护所有点到重心的距离,第二棵维护每个分支的最长链。

那么当前结构对答案的贡献就是第二棵线段树的最大值$+$次大值。

对于操作$0$,如果是激活某个点,则直接把它距离$+=inf$,隐藏某个点则是$-=inf$。

对于操作$1$,相当于子树全部加上一个值,进行区间加即可。

时间复杂度$O(n\log^2n)$。

#include<cstdio>
#include<algorithm>
using 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){char c;bool f=0;a=0;while(!((((c=getchar())>='0')&&(c<='9'))||(c=='-')));if(c!='-')a=c-'0';else f=1;while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';if(f)a=-a;
}
inline void umax(int&a,int b){if(a<b)a=b;}
void build(int x,int a,int b){tag[x]=-inf;if(a==b)return;int mid=(a+b)>>1;build(x<<1,a,mid),build(x<<1|1,mid+1,b);
}
void change(int x,int a,int b,int c,int d,int p){if(c<=a&&b<=d){umax(tag[x],p);return;}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){if(a==b){if(q[a][0]==2){if(ans[a]==1)puts("Nothing..Nothing!");else if(ans[a]==2)puts("Only one baby!");else printf("%d\n",tag[x]);}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){v[++ed]=y;w[ed]=z;ok[ed]=1;nxt[ed]=g[x];g[x]=ed;}
inline void ADD(int x,int y){NXT[y]=G[x];G[x]=y;}
void findroot(int x,int y){son[x]=1;f[x]=0;for(int i=g[x];i;i=nxt[i])if(ok[i]&&v[i]!=y){findroot(v[i],x);son[x]+=son[v[i]];if(son[v[i]]>f[x])f[x]=son[v[i]];}if(all-son[x]>f[x])f[x]=all-son[x];if(f[x]<f[now])now=x;
}
int tmp,cur,edge[N],from[N],vis[N];
int d[N],st[N],en[N],dfn,ST[N],EN[N],cp,pool[N];
namespace Node{
int q[N],v[M],tag[M];
inline void tag1(int x,int p){v[x]+=p;tag[x]+=p;}
inline void pb(int x){if(tag[x])tag1(x<<1,tag[x]),tag1(x<<1|1,tag[x]),tag[x]=0;}
inline void up(int x){v[x]=max(v[x<<1],v[x<<1|1]);}
void build(int x,int a,int b){tag[x]=0;if(a==b){v[x]=q[a];return;}int mid=(a+b)>>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){if(c<=a&&b<=d){tag1(x,p);return;}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){if(c<=a&&b<=d)return v[x];pb(x);int mid=(a+b)>>1,t=-inf;if(c<=mid)t=ask(x<<1,a,mid,c,d);if(d>mid)umax(t,ask(x<<1|1,mid+1,b,c,d));up(x);return t;
}
}
namespace Sub{
int q[N],fir[M],sec[M];
inline void up(int x){if(fir[x<<1]>fir[x<<1|1]){fir[x]=fir[x<<1];sec[x]=max(sec[x<<1],fir[x<<1|1]);}else{fir[x]=fir[x<<1|1];sec[x]=max(fir[x<<1],sec[x<<1|1]);}
}
void build(int x,int a,int b){if(a==b){fir[x]=q[a];sec[x]=-inf;return;}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){if(a==b){fir[x]=p;return;}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){from[x]=cur;vis[x]=now;ex[x]=1;for(int i=G[x];i;i=NXT[i])pool[++cp]=i;
}
void dfs(int x,int y,int z,int dep){umax(tmp,z);d[x]=dep;st[x]=++dfn;Node::q[dfn]=z;init(x);for(int i=g[x];i;i=nxt[i])if(ok[i]&&v[i]!=y)edge[i>>1]=w[i],dfs(v[i],x,z+w[i],dep+1);en[x]=dfn;
}
inline void update(int l,int r){if(l>r)return;int t=Sub::sec[1];if(ex[now])umax(t,0);change(1,1,m,l,r,Sub::fir[1]+t);
}
void solve(int x){int i;cur=cp=dfn=d[x]=0;init(x);for(i=g[x];i;i=nxt[i])if(ok[i]){edge[i>>1]=w[i];cur++;tmp=-inf;ST[cur]=dfn+1;dfs(v[i],x,w[i],1);EN[cur]=dfn;Sub::q[cur]=tmp;}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++){int A=q[pool[i]][0],B=q[pool[i]][1],C=q[pool[i]][2];if(!A){if(B==now){ex[now]^=1;update(pool[i],pool[i+1]-1);continue;}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{if(vis[e[B][0]]!=now||vis[e[B][1]]!=now){update(pool[i],pool[i+1]-1);continue;}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]){ok[i^1]=0;f[0]=all=son[v[i]];findroot(v[i],now=0);solve(now);}
}
int main(){read(n);for(ed=i=1;i<n;i++){for(j=0;j<3;j++)read(e[i][j]);add(e[i][0],e[i][1],e[i][2]);add(e[i][1],e[i][0],e[i][2]);}read(m);for(i=1;i<=n;i++)ex[i]=1;for(active=n,i=1;i<=m;i++){read(q[i][0]);if(q[i][0]<2)read(q[i][1]);if(q[i][0]==1)read(q[i][2]);if(!q[i][0]){if(ex[q[i][1]])active--;else active++;ex[q[i][1]]^=1;ADD(q[i][1],i);}if(q[i][0]==1)ADD(e[q[i][1]][0],i);if(q[i][0]==2){if(active==0)ans[i]=1;if(active==1)ans[i]=2;}}build(1,1,m);f[0]=all=n;findroot(1,now=0);solve(now);print(1,1,m);return 0;
}

  

BZOJ1841 : 蚂蚁搬家相关推荐

  1. try…except…finally…_用先……再……然后……描写蚂蚁搬家的动作?

    展开全部 写作思路:可以写蚂蚁先一2113只只走出洞口,再5261搬食物,然4102后的扶着弱小的伙伴.正在蚂蚁大部1653队里跑来跑去--"我"看到这一幕,赶紧给它们让路. 正文 ...

  2. 计算机 蚂蚁搬家 教案,《观察蚂蚁搬家》教学设计

    --三年级上册第四单元教学设计(一) 目标定位: 1.培养学生的观察能力,在观察中体验生活的乐趣. 2.激发学生观察的欲望.写的兴趣. 3.了解人与自然的关系. ●要点阐述: 通过创设情境.口语交际. ...

  3. 【蚂蚁链学习3】蚂蚁搬家(蚂蚁链智能合约实战solidity)

    文章目录 第一章 生成蚂蚁的房子 实战 第二章 mapping+identity Mapping(映射) Identity(标识) 实战 第三章 msg.sender全局函数 实战 第四章 requi ...

  4. 计算机 蚂蚁搬家 教案,小班体育活动-蚂蚁搬家

    文章来源 教师范文吧课件 小班体育活动:蚂蚁搬家 [主题背景] 小班幼儿年龄小,动手能力差,加上现在的父母.祖辈们样样事情都已给他们包办,导致他们的自理能力差,样样事情都想依赖别人,没有为别人服务的意 ...

  5. 深圳蚂蚁搬家公司 深圳搬家

    每个人都应该具备一种精神――锲而不舍.有了这种意志,有了这种不达目的不罢休的信念,那么一定会走向成功.0755-88851659 http://www.xinantbj.com 深圳搬家 公司哪家好? ...

  6. 计算机 蚂蚁搬家 教案,幼儿园大班数学活动教案《蚂蚁搬家》

    屈教授提供最新幼儿园大班数学教案,大班数学活动教案,大班数学公开课教案以及大班数学优质课教案,幼儿园优秀语文教案等. 幼儿园大班数学活动教案:蚂蚁搬家 教师:屈教授 活动目标: 1.通过观察比较.归纳 ...

  7. 计算机 蚂蚁搬家 教案,幼儿园小班《蚂蚁搬家》教案

    活动目标: 1.创设情景,体验爬山坡.独木桥的不同感受,提高幼儿对爬行运动的兴趣. 2.鼓励幼儿互相协作.克服困难,体验劳动的快乐. 3.提高动作的协调性与灵敏性. 4.增强合作精神,提高竞争意识. ...

  8. 计算机 蚂蚁搬家 教案,幼儿园中班教案《蚂蚁搬家》含反思

    中班教案<蚂蚁搬家>含反思适用于中班的美术主题教学活动当中,让幼儿尝试用剪刀剪圆形和波浪线的情况,幼儿对此活动的兴奋点,幼儿进行对应地并间隔一定距离粘贴的情况,快来看看幼儿园中班<蚂 ...

  9. 计算机 蚂蚁搬家 教案,小班蚂蚁搬家的教案

    教师在写教案时,一定从实际出发,要充分考虑从实际需要出发,要考虑教案的可行性和可操作性,小班体育教案小蚂蚁搬家.该简就简,该繁就繁,要简繁得当.下面有关小班体育教案小蚂蚁搬家,希望对大家有帮助!活动目 ...

最新文章

  1. python中outside loop_Python: 'break' outside loop
  2. npm:can not find module 'xxx'
  3. OSChina 周一乱弹 ——程序员用代码写的爱情
  4. 如何解决Ubuntu 12.04(64位)系统在virtualbox环境下无法开机自动挂载共享目录的问题
  5. unity声音组件AudioSource的使用
  6. Tomcat常用面试题
  7. c语言编程软件开机自动启动,C语言实现程序开机自启动
  8. iOS Xcode7上真机调试
  9. 从文档流角度理解浏览器页面渲染引擎对元素定位的解析
  10. html5介绍 之亮点特性
  11. 3月3日 单灭点、双灭点、单应矩阵求解相机姿态,世界坐标-相机坐标-图像坐标-像素坐标四个坐标系的变换关系,通过Vanishing Points计算焦距和像心
  12. signature=cc8d613f503e9b933c233da06afc0fc6,襄阳市公安局交通警察支队违法车辆信息公告20210118...
  13. numpy.arccos详解
  14. linux如何注销远程用户登录,Linux无法被远程登录;用户的关机, 重启,注销,新增用户,删除用户...
  15. Android 之 Activity 的生命周期(PS:文章多图,流量警告)
  16. Compose 页面切换动画
  17. Spring Cloud 项目实战 Jenkins 实现 CI/CD 你需要的这里都有
  18. 让你不再害怕指针——C指针详解(经典,非常详细)
  19. 【Java】Java方法详解篇
  20. 无线网调优案例分享,很实用

热门文章

  1. Python----面试题(二)
  2. C#操作SQL Server数据库
  3. CentOS6.5安装nginx1.5.8时出现“cp: conf/koi-win 与/usr/local/nginx/conf/koi-win 为同一文件”的解决方法...
  4. 使用Maven搭建Struts2框架的开发环境
  5. Bootstrap页面布局10 - BS表格
  6. zoj1095 Humble Numbers(DP)
  7. 如何设置mysql远程访问
  8. Kafka将逐步弃用对zookeeper的依赖
  9. m6000查看端口状态_M6000常用命令
  10. Java基本数据类型和String类型的转化