好迷啊。。。感觉动态点分治就是个玄学,蜜汁把树的深度缩到logn

(静态)点分治大概是递归的时候分类讨论:

  1.答案经过当前点,暴力(雾)算

  2.答案不经过当前点,继续递归

由于原树可以长的奇形怪状(菊花啊、、链啊、、扫把啊、、)这就导致各种方法都会被卡

于是通过每次找重心保证最大深度

动态怎么解决呢?

不妨考虑线段树是二分的固态版本(只可意会),那么我们把每次找到的重心固定下来长成一棵树就可以把点分治凝固(不可言传)

原来点分治该维护什么现在就维护什么。。。

(事实上我并没有写过静态点分治。。。好气啊╮(╯▽╰)╭)

我居然一度认为新建的树的节点要连到所在子树外一定要经过该子树的根。。。太思博了

实现细节:

  1.有一个带删堆,直接拉了板子(拉了才知道实现那么简单,本来以为手打)

  2.lca以前习惯rmq(复杂度优异就是自信),现在改成倍增了(可能是之前写了个长链剖分的缘故)

 #include<bits/stdc++.h>
using namespace std;
const int Mn=;
int cnt=,h[Mn],n,m,vst[Mn],maxx,tg,s[Mn],sz,prt[Mn];
int d[Mn],p[Mn][],co[Mn];
struct Priority_Queue{
priority_queue<int> q,del;
void push(int x)
{q.push(x);}
void erase(int x){del.push(x);}
int top()
{
while(del.size()&&del.top()==q.top())
{del.pop();q.pop();}
return q.top();
}
void Pop()
{
while(del.size()&&del.top()==q.top())
del.pop(),q.pop();
q.pop();
}
int sec_top()
{
int tmp=top();Pop();
int se=top();push(tmp);
return se;
}
int size()
{
return q.size()-del.size();
}
}c[Mn],f[Mn],ans;
struct Edge{int to,next;}w[Mn*];
void add(int x,int y)
{w[++cnt]=(Edge){y,h[x]};h[x]=cnt;}
void build(int x,int fa)
{
p[x][]=fa;d[x]=d[fa]+;
for(int i=;p[x][i-];i++)
p[x][i]=p[p[x][i-]][i-];
for(int i=h[x];i;i=w[i].next)
if(w[i].to!=fa)
build(w[i].to,x);
}
void Insert(Priority_Queue &s){
if(s.size()>)ans.push(s.top()+s.sec_top());
}
void Erase(Priority_Queue &s){
if(s.size()>)ans.erase(s.top()+s.sec_top());
}
void DP(int x,int fa)
{
int j,y;s[x]=;
for(j=h[x];j;j=w[j].next)
{
y=w[j].to;
if(y==fa||vst[y])continue;
DP(y,x);
s[x]+=s[y];
}
}
void Biggest(int x,int fa){
int j,y,mx=;
for(j=h[x];j;j=w[j].next){
y=w[j].to;
if(y==fa||vst[y])continue;
Biggest(y,x);
mx=max(mx,s[y]);
}
if(maxx>max(mx,sz-s[x])){
maxx=max(mx,sz-s[x]);
tg=x;
}
}
int gg(int x)//get G
{
maxx=n+;tg=;
DP(x,);
sz=s[x];
Biggest(x,);
return tg;
}
int LCA(int x,int y){
int j;
if(d[x]<d[y])swap(x,y);
for(j=;j>=;j--)
if(d[p[x][j]]>=d[y])x=p[x][j];
if(x==y)return x;
for(j=;j>=;j--)
if(p[x][j]!=p[y][j])
{x=p[x][j];y=p[y][j];}
return p[x][];
}
int Dis(int x,int y){return d[x]+d[y]-*d[LCA(x,y)];}
void work(int x,int fa,int Gra){
int j,y;
f[Gra].push(Dis(x,prt[Gra]));
for(j=h[x];j;j=w[j].next){
y=w[j].to;
if(y==fa||vst[y])continue;
work(y,x,Gra);
}
}
int mzz(int x,int fa)
{
int j,y,G,Gy;
G=gg(x);prt[G]=fa;
work(G,,G);
vst[G]=;
c[G].push();
for(j=h[G];j;j=w[j].next)
{
y=w[j].to;
if(!vst[y]){
Gy=mzz(y,G);
c[G].push(f[Gy].top());
}
}
Insert(c[G]);
return G;
}
void Light(int x){
Erase(c[x]);
c[x].erase();
Insert(c[x]);
for(int y=x;prt[y];y=prt[y]){
Erase(c[prt[y]]);
if(f[y].size())c[prt[y]].erase(f[y].top());
f[y].erase(Dis(x,prt[y]));
if(f[y].size())c[prt[y]].push(f[y].top());
Insert(c[prt[y]]);
}
}
void LiOut(int x){
Erase(c[x]);
c[x].push();
Insert(c[x]);
for(int y=x;prt[y];y=prt[y]){
Erase(c[prt[y]]);
if(f[y].size())c[prt[y]].erase(f[y].top());
f[y].push(Dis(x,prt[y]));
if(f[y].size())c[prt[y]].push(f[y].top());
Insert(c[prt[y]]);
}
}
void solve(){
int i,x;char ch[];
cnt=n;
scanf("%d",&m);
for(i=;i<=m;i++){
scanf("%s",ch);
if(ch[]=='G'){
if(cnt<=)printf("%d\n",cnt-);
else printf("%d\n",ans.top());
}
else{
scanf("%d",&x);
if(!co[x]){cnt--;Light(x);co[x]=;}
else{cnt++;LiOut(x);co[x]=;}
}
}
}
int main()
{
scanf("%d",&n);int x,y;
for(int i=;i<n;i++)
scanf("%d%d",&x,&y),
add(x,y),add(y,x);
build(,);mzz(,);
solve();
return ;
}

最新文章

  1. JQuery EasyUI datagrid 复杂表头处理
  2. 如何将List&lt;string&gt;转化为string
  3. 让ASP.NET Web API支持POST纯文本格式(text/plain)的数据
  4. The illustrated guide to a Ph.D.
  5. access数据库密码破解
  6. pointer-events属性
  7. linux上网络配置不生效的怪异现象处理
  8. zabbix 添加主机接口
  9. JS 从一个字符串中截取两个字符串之间的字符串
  10. 基于MFC的学生成绩管理系统的设计与实现
  11. [数学笔记Mathematical Notes]2-一个带对数的积分不等式
  12. 【转】iOS-浅谈revoke证书对App的影响
  13. 版本控制Git使用最佳实践
  14. 【Core Swagger】.NET Core中使用swagger
  15. Java并发编程总结2——慎用CAS
  16. 一个简单的增强型PHP curl函数
  17. WideCharToMultiByte和MultiByteToWideChar函数的用法(转)
  18. 最新版Intellij IDEA插件JRebel 7.0.7官方免费激活
  19. Kubernetes网络模型概念
  20. Java23种设计模式学习笔记【目录总贴】

热门文章

  1. C#多线程编程介绍——使用thread、threadpool、timer
  2. hdu5776sum
  3. ACM学习历程—HDU2222 Keywords Search(字典树)
  4. linux历史及基本知识
  5. 解决CentOS 7安装zabbix 3.0 无法启动zabbix-server的问题[segfault at 18 ip 00007f78842b4bd0 sp 00007fff1995a818 error 4 in libpthread-2.17.so[7f78842ab000+16000]]
  6. HL7 Event Type
  7. 【转】Android Menu
  8. 【转】android adb常用指令
  9. 点阵字体显示系列之一:ASCII码字库的显示
  10. 怎么解决sublime的插件自动被禁用