bzoj 4448: [Scoi2015]情报传递 dfs序列&树状数组
来源:互联网 发布:重生之网络霸主txt 编辑:程序博客网 时间:2024/06/05 20:39
首先遍历得到dfs序列,离线后按照C排序再从小到大插入和查询,每一次相当于单点修改和链上查询,然后用树状数组来维护区间修改单点查询就好了。(根本不需要用什么树链剖分)。O(NlogN)+常数小,成功用小号刷到rank2。
这道题目其实是可以在线的,C相当于一个颜色,然后把dfs序列改成括号序列(这样就不会有多次修改重复用一个东西了)。使用带修改的主席树(树状数组套可持久化线段树)或者权值线段树套平衡树即可。不过主席树很可能会MLE。
另外,树剖求lca真心好用。(感觉比倍增块)
AC代码如下:
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#define N 200005using namespace std;int n,m,cnt,tot,dfsclk,fst[N],pnt[N],nxt[N],sz[N],fa[N],d[N],son[N],anc[N];int pos[N][2],c[N]; struct node{ int x,y,z,id,k; }a[N],ans[N];int read(){int x=0; char ch=getchar();while (ch<'0' || ch>'9') ch=getchar();while (ch>='0' && ch<='9'){ x=x*10+ch-'0'; ch=getchar(); }return x;}void add(int x,int y){pnt[++tot]=y; nxt[tot]=fst[x]; fst[x]=tot;}void dfs(int x){int p; sz[x]=1;for (p=fst[x]; p; p=nxt[p]){int y=pnt[p];if (y!=fa[x]){fa[y]=x; d[y]=d[x]+1;dfs(y); sz[x]+=sz[y];if (sz[y]>sz[son[x]]) son[x]=y;}}}void divide(int x,int tp){int p; pos[x][0]=pos[x][1]=++dfsclk; anc[x]=tp;if (son[x]){ divide(son[x],tp); pos[x][1]=pos[son[x]][1]; }for (p=fst[x]; p; p=nxt[p]){int y=pnt[p];if (y!=son[x] && y!=fa[x]){divide(y,y); pos[x][1]=pos[y][1];}}}void ins(int x,int t){for (; x<=n; x+=x&-x) c[x]+=t;}int getsum(int x){int t=0; for (; x; x-=x&-x) t+=c[x]; return t;}int lca(int x,int y){for (; anc[x]!=anc[y]; x=fa[anc[x]])if (d[anc[x]]<d[anc[y]]) swap(x,y);return (d[x]<d[y])?x:y;}bool cmp(node u,node v){return u.z<v.z || u.z==v.z && u.k<v.k;}int main(){n=read(); int i,x;for (i=1; i<=n; i++){x=read(); if (x) add(x,i);}d[1]=1; dfs(1); divide(1,1);m=read();for (i=1; i<=m; i++){a[i].k=read();if (a[i].k==1){a[i].x=read(); a[i].y=read();a[i].z=i-read(); a[i].id=++cnt;} else{a[i].x=read(); a[i].z=i;}}sort(a+1,a+m+1,cmp);for (i=1; i<=m; i++)if (a[i].k==1){int u=lca(a[i].x,a[i].y),v=fa[u];ans[a[i].id].x=d[a[i].x]+d[a[i].y]-d[u]-d[v];ans[a[i].id].y=getsum(pos[a[i].x][0])+getsum(pos[a[i].y][0])-getsum(pos[u][0])-getsum(pos[v][0]);} else{ins(pos[a[i].x][0],1); ins(pos[a[i].x][1]+1,-1);}for (i=1; i<=cnt; i++) printf("%d %d\n",ans[i].x,ans[i].y);return 0;}
by lych
2016.4.5
0 0
- bzoj 4448: [Scoi2015]情报传递 dfs序列&树状数组
- 【bzoj 4448】 [Scoi2015]情报传递 离线+树剖+树状数组
- bzoj 4448: [Scoi2015]情报传递
- bzoj4448 [Scoi2015]情报传递 树链剖分+树状数组
- 【BZOJ 4448】 [Scoi2015]情报传递|树链剖分|树套树
- 4448: [Scoi2015]情报传递
- 4448: [Scoi2015]情报传递 dfs序+主席树
- 【BZOJ 4448】 [Scoi2015]情报传递|倍增LCA|主席树
- bzoj 4448: [Scoi2015]情报传递 (树上主席树)
- BZOJ 4448: [Scoi2015]情报传递 树剖套主席树
- [BZOJ]4448: [Scoi2015]情报传递 主席树+LCA
- bzoj4448: [Scoi2015]情报传递
- 【bzoj4448】【SCOI2015】情报传递
- bzoj 4448: [Scoi2015]情报传递 可持久化线段树+离线
- 4448: [Scoi2015]情报传递|主席树|离线操作
- [BZOJ4448][Scoi2015]情报传递(树上主席树)
- [BZOJ4448][Scoi2015]情报传递(树上主席树)
- bzoj 2819: Nim 树状数组+dfs序
- Nginx做负载均衡器以及proxy缓存配置
- 树莓派linux驱动学习之LED控制
- 微信刷卡支付_windows server上中文导致签名失败的解决办法
- 销毁MBProgressHUD
- 圆形的textview
- bzoj 4448: [Scoi2015]情报传递 dfs序列&树状数组
- OpenWRT使用Wifidog实现强制认证的WIFI热点
- bzoj3529【SDOI2014】数表
- LeetCode-15.3Sum
- 本地Spring容器关闭的时机
- NFS文件共享配置
- UIDynamic
- 友盟第三方QQ登录和获取用户登录信息并设置用户头像
- 基础语法学习