[块状树] BZOJ 3731 Gty的超级妹子树
2016-07-12 19:32
375 查看
3720的升级版
就是加了删边 把块拆开重建
然后卡内存 开vector
然后块的大小开大点 但也不能太大 不然询问太多T飞
就是加了删边 把块拆开重建
然后卡内存 开vector
然后块的大小开大点 但也不能太大 不然询问太多T飞
#include<cstdio> #include<cstdlib> #include<algorithm> #include<cmath> #include<vector> #define dprintf(...) fprintf(stderr,__VA_ARGS__) using namespace std; inline char nc() { static char buf[100000],*p1=buf,*p2=buf; if (p1==p2) { p2=(p1=buf)+fread(buf,1,100000,stdin); if (p1==p2) return EOF; } return *p1++; } inline void read(int &x) { char c=nc(),b=1; for (;!(c>='0' && c<='9');c=nc()) if (c=='-') b=-1; for (x=0;c>='0' && c<='9';x=x*10+c-'0',c=nc()); x*=b; } const int N=200005; struct Block{ vector<int>a; inline void insert(int x){ a.insert(lower_bound(a.begin(),a.end(),x+1),x); } inline void erase(int x){ a.erase(lower_bound(a.begin(),a.end(),x)); } inline void modify(int x,int y){ erase(x);insert(y); } inline int query(int x){ return a.size()-(upper_bound(a.begin(),a.end(),x)-a.begin()+1)+1; } inline int size(){ return a.size(); } }Blo[200005]; int cnt; struct edge{ int u,v,next; }; edge G[N<<2]; int head ,first ,inum; inline void add(int *head,int u,int v,int p){ G[p].u=u; G[p].v=v; G[p].next=head[u]; head[u]=p; } int n,B,a ; int fat ,belong ; int bat ; #define V G[p].v inline void dfs(int u,int fa){ fat[u]=fa; if (u==1 || Blo[belong[fa]].size()==B) Blo[belong[u]=++cnt].insert(a[u]),add(first,belong[fa],belong[u],++inum),bat[cnt]=belong[fa]; else Blo[belong[u]=belong[fa]].insert(a[u]); for (int p=head[u];p;p=G[p].next) if (V!=fa) dfs(V,u); } int Y; int ans=0; inline void block_dfs(int u){ ans+=Blo[u].query(Y); for (int p=first[u];p;p=G[p].next) if (bat[V]==u) block_dfs(V); } inline void find(int u,int fa){ if (a[u]>Y) ans++; for (int p=head[u];p;p=G[p].next) if (V!=fa && fat[V]==u) if (belong[V]==belong[u]) find(V,u); else block_dfs(belong[V]); } int c ; int d ; inline void cont(int u,int fa){ c[++*c]=u; for (int p=head[u];p;p=G[p].next) if (V!=fa && fat[V]==u) { if (belong[V]==belong[u]) cont(V,u); else d[++*d]=belong[V]; } } int main() { int Q,order,iu,iv,lastans=0; freopen("t.in","r",stdin); freopen("t.out","w",stdout); read(n); B=sqrt(10*n*log2(n)); for (int i=1;i<n;i++) read(iu),read(iv),add(head,iu,iv,++inum),add(head,iv,iu,++inum); for (int i=1;i<=n;i++) read(a[i]); dfs(1,0); read(Q); while (Q--) { // for (int i=1;i<=cnt;i++,dprintf("\n")) for (int j=0;j<(signed)Blo[i].a.size();j++) dprintf("%d ",Blo[i].a[j]); read(order); if (order==3) { read(iu); // iu^=lastans; if (belong[iu]!=belong[fat[iu]]){ fat[iu]=0; bat[belong[iu]]=0; continue; } cont(iu,fat[iu]); belong[iu]=++cnt; for (int i=1;i<=*c;i++) { Blo[belong[fat[iu]]].erase(a[c[i]]); Blo[cnt].insert(a[c[i]]); belong[c[i]]=cnt; } for (int i=1;i<=*d;i++) add(first,cnt,d[i],++inum),bat[d[i]]=cnt; fat[iu]=0; *c=*d=0; } else { read(iu); read(iv); // iu^=lastans; iv^=lastans; if (order==0) { Y=iv; ans=0; find(iu,fat[iu]); printf("%d\n",lastans=ans); } else if (order==1) { Blo[belong[iu]].modify(a[iu],iv); a[iu]=iv; } else if (order==2) { a[++n]=iv; add(head,iu,n,++inum),add(head,n,iu,++inum); fat =iu; if (Blo[belong[iu]].size()==B) Blo[belong =++cnt].insert(a ),add(first,belong[iu],belong ,++inum),bat[cnt]=belong[iu]; else Blo[belong =belong[iu]].insert(a ); } } } return 0; }
相关文章推荐
- Class类源码浅析
- unity3d优化总结篇
- 启动apache 出现undefined symbol: apr_ldap_ssl_init
- jquery ajax提交表单从action传值到jsp实现小结
- 数据结构---图---邻接矩阵
- Android 5.X 之 Notification的使用
- Twisted源码分析1
- Mybatis使用接口用户的增删改查
- 数据仓库基础理论笔记
- CVPR 2016 有什么值得关注的亮点?
- Unity Reading Notes
- MFC学习第七节:见文件与数据库连接
- 长得好看,但没有男朋友是怎样的体验?
- 金字塔原理
- http://www.blogjava.net/xylz/category/45607.html
- JZOJ 4612 游戏【NOIP2016模拟7.12】
- 记一次基于Unity的Profiler性能分析
- 下面的函数哪个是系统调用而不是库函数()?----阿里巴巴2015校招研发在线笔试题
- hdu 5110 Alexandra and COS(分块,DP,预处理)
- Redis学习手册(服务器管理)