bzoj1095[ZJOI2007]捉迷藏
来源:互联网 发布:cv用录音软件 编辑:程序博客网 时间:2024/05/22 02:21
这题的题解就不说了,网上到处是。
但是,我一开始样例RE了,而且是改成调试模式就不RE了,真是难受(可能是windows的问题?)。
然后q234rty大爷用linux机子帮我调试,发现在我进行pop操作后,原先的point_iterator
就失效了。我好菜啊,这都看不出。
#include<cstdio>#include<vector>#include<cctype>#include<ext/pb_ds/priority_queue.hpp>#include<cstring>using namespace std;inline char read() { static const int IN_LEN = 1000000; static char buf[IN_LEN], *s, *t; if (s == t) { t = (s = buf) + fread(buf, 1, IN_LEN, stdin); if (s == t) return -1; } return *s++;}template<class T>inline void read(T &x) { static bool iosig; static char c; for (iosig = false, c = read(); !isdigit(c); c = read()) { if (c == '-') iosig = true; if (c == -1) return; } for (x = 0; isdigit(c); c = read()) x = (x + (x << 2) << 1) + (c ^ '0'); if (iosig) x = -x;}const int OUT_LEN = 10000000;char obuf[OUT_LEN], *oh = obuf;inline void print(char c) { if (oh == obuf + OUT_LEN) fwrite(obuf, 1, OUT_LEN, stdout), oh = obuf; *oh++ = c;}template<class T>inline void print(T x) { static int buf[30], cnt; if (x == 0) { print('0'); } else { if (x < 0) print('-'), x = -x; for (cnt = 0; x; x /= 10) buf[++cnt] = x % 10 + 48; while (cnt) print((char)buf[cnt--]); }}inline void flush() { fwrite(obuf, 1, oh - obuf, stdout);}typedef __gnu_pbds::priority_queue<int> pq;typedef __gnu_pbds::priority_queue<pair<int,int> > pq2;typedef pq::point_iterator IT;typedef pq2::point_iterator IT2;const int N=100005;inline void up(int&a,int b){if(a<b)a=b;}inline int max(int a,int b){return a>b?a:b;}__gnu_pbds::priority_queue<int> ans;bool col[N];struct tree{ struct edge{int to,next;}e[N<<1]; int xb,h[N],rt,sum,sz[N],f[N],dep[N],dfn[N],n,dd[N]; struct node{ int fa,dis; IT it; }; vector<node> a[N]; __gnu_pbds::priority_queue<int> d1[N]; __gnu_pbds::priority_queue<pair<int,int> > d2[N]; IT2 it2[N]; IT it3[N],null; bool b[N]; inline void addedge(int u,int v){ e[++xb]=(edge){v,h[u]};h[u]=xb; e[++xb]=(edge){u,h[v]};h[v]=xb; } void dfs(int x,int fa){ f[dfn[++xb]=x]=sz[x]=1; for(int i=h[x];i;i=e[i].next) if(e[i].to!=fa && !b[e[i].to])dfs(e[i].to,x),sz[x]+=sz[e[i].to],up(f[x],sz[e[i].to]); up(f[x],sum-sz[x]); if(f[rt]>f[x])rt=x; } void getdis(int x,int f,int d){ if(d)a[x].back().dis=d; for(int i=h[x];i;i=e[i].next)if(e[i].to!=f && !b[e[i].to])getdis(e[i].to,x,d+1); } void getC(int x){ for(register int j=1;j<=xb;++j){ a[dfn[j]].push_back((node){x,0,0}); if(x!=dfn[j])dd[dfn[j]]=x; } getdis(x,0,0); b[x]=1;int i=h[x]; for(;i;i=e[i].next)if(sz[e[i].to]>sz[x])sz[e[i].to]=sum-sz[x]; for(i=h[x];i;i=e[i].next) if(!b[e[i].to]){ sum=sz[e[i].to];xb=rt=0; dfs(e[i].to,x); getC(rt); } } inline void calc(int x){ static int v;v=0; static pair<int,int> u; if(!d2[x].empty()){ if(d2[x].size()>1)u=d2[x].top(),d2[x].pop(),v=d2[x].top().first+u.first,it2[u.second]=d2[x].push(u); if(col[x])up(v,d2[x].top().first); it3[x]=ans.push(v); } } inline void ins(int x){ static int i,y,z; for(i=a[x].size()-1;i;--i){ y=a[x][i].fa,z=a[x][i-1].fa; if(d1[y].empty() || a[x][i-1].dis>d1[y].top()){ if(it2[y]!=0)d2[z].modify(it2[y],make_pair(a[x][i-1].dis,y)); else it2[y]=d2[z].push(make_pair(a[x][i-1].dis,y)); if(it3[z]!=null) ans.erase(it3[z]),it3[z]=null; calc(z); } a[x][i].it=d1[y].push(a[x][i-1].dis); } } inline void del(int x){ static int i,y,z,v; for(i=a[x].size()-1;i;--i){ y=a[x][i].fa,z=a[x][i-1].fa;v=d1[y].top(); d1[y].erase(a[x][i].it); a[x][i].it=null; if(d1[y].empty() || v>d1[y].top()){ if(it2[y]!=0){ d2[z].erase(it2[y]); it2[y]=0; } if(!d1[y].empty())it2[y]=d2[z].push(make_pair(d1[y].top(),y)); if(it3[z]!=null)ans.erase(it3[z]),it3[z]=null,calc(z); } } } inline void prepare(){ register int i;null=d1[0].push(0); *f=1<<30,sum=n;xb=0,dfs(1,0); getC(rt);memset(b+1,0,n); register unsigned int j;for(i=1;i<=n;++i)it3[i]=null; for(i=1;i<=n;++i) for(j=a[i].size()-1;j;--j)a[i][j].it=d1[a[i][j].fa].push(a[i][j-1].dis); for(i=1;i<=n;++i) if(dd[i] && !d1[i].empty()) it2[i]=d2[dd[i]].push(make_pair(d1[i].top(),i)); for(i=1;i<=n;++i)if(!d2[i].empty())calc(i); }}t;int n,a,b,i,q;char c;int main(){ read(n);for(i=1;i<n;++i)read(a),read(b),t.addedge(a,b);t.n=n; for(i=1;i<=n;++i)col[i]=1; t.prepare(); read(q);a=n; while(q--){ c=read();while(!isalpha(c))c=read(); if(c=='C'){ read(i); if(col[i])--a,t.del(i); else ++a,t.ins(i);col[i]^=1; }else print(a?ans.top():-1),print('\n'); } return flush(),0;}
阅读全文
0 0
- bzoj1095: [ZJOI2007]Hide 捉迷藏
- BZOJ1095: [ZJOI2007]Hide 捉迷藏
- BZOJ1095: [ZJOI2007]Hide 捉迷藏
- BZOJ1095 [ZJOI2007]Hide 捉迷藏
- bzoj1095[ZJOI2007]捉迷藏
- 【ZJOI2007】bzoj1095 捉迷藏【解法一】
- 【ZJOI2007】bzoj1095 捉迷藏【解法二】
- [BZOJ1095][ZJOI2007][线段树]Hide捉迷藏
- BZOJ1095 [ZJOI2007]捉迷藏 动态点分治
- 【BZOJ1095】[ZJOI2007]Hide 捉迷藏【动态树分治】
- [动态点分治] BZOJ1095: [ZJOI2007]Hide 捉迷藏
- [BZOJ1095][ZJOI2007]Hide捉迷藏-动态树分治
- 【BZOJ1095】【ZJOI2007】捉迷藏 括号序列+线段树维护
- 括号序列 || 动态树分治 bzoj1095【ZJOI2007】Hide 捉迷藏
- spoj2666 Qtree4(类似于bzoj1095: [ZJOI2007]Hide 捉迷藏)详解
- spoj2666 Qtree4(类似于bzoj1095: [ZJOI2007]Hide 捉迷藏)详解
- spoj2666 Qtree4(类似于bzoj1095: [ZJOI2007]Hide 捉迷藏)详解
- [bzoj1095][ZJOI2007]Hide 捉迷藏(动态点分治)
- 你可能会因为关键字选取错误造成损失
- 字面量(literal)与 C 语言复合字面量(compound literals)
- php --ini 可查看当前使用的php版本以及 php.ini所在的目录
- pandas处理各种表格数据
- C-NOIP1998P3 二的幂次方
- bzoj1095[ZJOI2007]捉迷藏
- 网页加载进度条--6种
- 数据加载存储和文件格式
- java中switch语句的用法
- 数据规整化:清理、转换、合并、重塑
- POJ刷题列表——正在进行
- 运用numpy进行数组、向量、矩阵运算
- 如何读取CSV文件,格式化数据,统计生日出现的次数
- windows下安装scikit_learn