博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
并不对劲的bzoj1095:p2056:[ZJOI2007]捉迷藏
阅读量:4952 次
发布时间:2019-06-12

本文共 2728 字,大约阅读时间需要 9 分钟。

题目大意

给一\(n\)(\(n\leq10^5\))个点的一棵树,每个点有可能是黑色或白色,一开始所有点都是黑色,支持以下两种操作:

1.改变一个点的颜色
2.询问最远的黑色点对的距离

题解

据说是动态点分治板板题

考虑点分治,发现容斥略有难想
所以考虑边分治,用可删堆维护重心边两侧到重心边最远的黑点到重心边的距离

代码
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define rep(i,x,y) for(register int i=(x);i<=(y);++i)#define dwn(i,x,y) for(register int i=(x);i>=(y);--i)#define view(u,k) for(int k=fir[u];~k;k=nxt[k])#define pb push_back#define ls (u<<1)#define rs (u<<1|1)#define maxn 100010#define maxnd (maxn<<1)#define maxm (maxnd<<1) using namespace std;int read(){ int x=0,f=1;char ch=getchar(); while(!isdigit(ch)&&ch!='-')ch=getchar(); if(ch=='-')f=-1,ch=getchar(); while(isdigit(ch))x=(x<<1)+(x<<3)+ch-'0',ch=getchar(); return x*f;}void write(int x){ if(x==0){putchar('0'),putchar('\n');return;} int f=0;char ch[20]; if(x<0)putchar('-'),x=-x; while(x)ch[++f]=x%10+'0',x/=10; while(f)putchar(ch[f--]); putchar('\n'); return;}int siz[maxnd],tot,n,fir[maxnd],nxt[maxm],v[maxm],cntrd,m,d[20][maxn],maxd[maxnd<<2];int sumsiz,wt,minsiz,w[maxm],vis[maxm],lens[maxn],wtk[maxnd<<2],bacn[maxn],stat[maxn]; vector
to[maxn];struct deq{ priority_queue
yes,no; void push(int x){yes.push(x);} void del(int x){no.push(x);} int top(){while(!no.empty()&&yes.top()==no.top())yes.pop(),no.pop();return yes.top();} int size(){return yes.size()-no.size();}}q[maxnd<<2];void ade(int u1,int v1,int w1){v[cntrd]=v1,nxt[cntrd]=fir[u1],w[cntrd]=w1,fir[u1]=cntrd++;}void get2(int u,int fa){ int lim=to[u].size()-1,lst=u,f=0; rep(i,0,lim)if(to[u][i]!=fa) { if(f){tot++,ade(lst,tot,0),ade(tot,lst,0),lst=tot;} ade(lst,to[u][i],1),ade(to[u][i],lst,1);f=1; } rep(i,0,lim)if(to[u][i]!=fa)get2(to[u][i],u);}void getsiz(int u,int fa){ siz[u]=1; view(u,k)if(v[k]!=fa&&!vis[k]) { getsiz(v[k],u),siz[u]+=siz[v[k]]; int nowmax=max(sumsiz-siz[v[k]],siz[v[k]]); if(nowmax
siz[vv]?nowsiz-siz[vv]:siz[uu],sv=siz[vv]>siz[uu]?nowsiz-siz[uu]:siz[vv]; vis[wt]=vis[wt^1]=1;wtk[u]=wt; getdis(uu,0,ls,len,0),getdis(vv,0,rs,len,0); getwt(ls,uu,su,len+1),getwt(rs,vv,sv,len+1); pu(u);}char S[5];void chg(int x){ int u=bacn[x],len=lens[x],fa=u>>1; while(fa) { if(stat[x])q[u].push(d[len-1][x]); else q[u].del(d[len-1][x]); pu(fa); u>>=1,len--,fa=(u>>1); }stat[x]^=1;}int main(){ n=read();memset(fir,-1,sizeof(fir));tot=n; rep(i,1,n-1){int x=read(),y=read();to[x].pb(y),to[y].pb(x);} get2(1,0),getwt(1,1,tot,0); m=read(); while(m--) { int x; scanf("%s",S); if(S[0]=='C'){x=read();chg(x);} else write(maxd[1]); } return 0;}
一些感想

时隔一年,终于正式切了 (之前是照着题解敲) 这道题

相比于去年,我这个弱智猎人还是有一些进步的,至少也得是弱智猎人G

祝我在明天的紧急任务中狩猎愉快!

转载于:https://www.cnblogs.com/xzyf/p/10738438.html

你可能感兴趣的文章
hdu1398
查看>>
[android] 网络断开的监听
查看>>
156.Binary Tree Upside Down
查看>>
MongoDB在windows下安装配置
查看>>
Upselling promotion stored procedure
查看>>
mysql编码配置
查看>>
KVM地址翻译流程及EPT页表的建立过程
查看>>
sigar
查看>>
iOS7自定义statusbar和navigationbar的若干问题
查看>>
c++ 网络编程(一)TCP/UDP windows/linux 下入门级socket通信 客户端与服务端交互代码...
查看>>
程序员如何提高影响力:手把手教你塑造个人品牌
查看>>
身份证校验原理和PHP实现
查看>>
[Locked] Wiggle Sort
查看>>
deque
查看>>
Ext JS学习第十三天 Ext基础之 Ext.Element
查看>>
python--迭代器与生成器
查看>>
SQL之case when then用法详解
查看>>
STL 排序函数
查看>>
Microsoft Dynamics CRM 2011 面向Internet部署 (IFD) ADFS虚拟机环境搭建的步骤(CRM与ADFS装在同一台服务器上) 摘自网络...
查看>>
Setting up a Passive FTP Server in Windows Azure VM(ReplyCode: 227, Entering Passive Mode )
查看>>