bzoj1146整体二分+树链剖分+树状数组
其实也没啥好说的
用树状数组可以O(logn)的查询
套一层整体二分就可以做到O(nlngn)
最后用树链剖分让序列上树
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm> 5 using namespace std; 6 inline int read() 7 { 8 int x=0,f=1,ch=getchar(); 9 while(ch<'0'||ch>'9'){if(ch=='-'){f=-1;}ch=getchar();} 10 while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} 11 return x*f; 12 } 13 int n,q; 14 int data[80005]; 15 inline void add(int x,int i) 16 { 17 while(x<=n) 18 { 19 data[x]+=i; 20 x+=x&(-x); 21 } 22 } 23 inline int query(int x) 24 { 25 int res=0; 26 while(x>=1) 27 { 28 res+=data[x]; 29 x-=x&(-x); 30 } 31 return res; 32 } 33 int h[80005],next[160005],to[160005],cnt; 34 inline void addedge(int x,int y) 35 { 36 next[cnt]=h[x]; 37 to[cnt]=y; 38 h[x]=cnt; 39 cnt++; 40 } 41 int size[80005],hson[80005],dep[80005],f[80005]; 42 inline void bfs(int x,int fa) 43 { 44 int i; 45 size[x]=1; 46 for(i=h[x];i!=-1;i=next[i]) 47 { 48 if(to[i]==fa) 49 { 50 continue; 51 } 52 dep[to[i]]=dep[x]+1; 53 f[to[i]]=x; 54 bfs(to[i],x); 55 size[x]+=size[to[i]]; 56 if(size[to[i]]>size[hson[x]]) 57 { 58 hson[x]=to[i]; 59 } 60 } 61 } 62 int up[80005],first[80005],tim; 63 inline void spfa(int x,int tt) 64 { 65 tim++; 66 first[x]=tim; 67 up[x]=tt; 68 if(!hson[x]) 69 { 70 return ; 71 } 72 spfa(hson[x],tt); 73 int i; 74 for(i=h[x];i!=-1;i=next[i]) 75 { 76 if(to[i]==f[x]||to[i]==hson[x]) 77 { 78 continue; 79 } 80 spfa(to[i],to[i]); 81 } 82 } 83 inline int lca(int x,int y) 84 { 85 int res=0; 86 while(up[x]!=up[y]) 87 { 88 if(dep[up[x]]<dep[up[y]]) 89 { 90 swap(x,y); 91 } 92 res+=query(first[x])-query(first[up[x]]-1); 93 x=f[up[x]]; 94 } 95 if(dep[x]>dep[y]) 96 { 97 swap(x,y); 98 } 99 res+=query(first[y])-query(first[x]-1); 100 return res; 101 } 102 struct stu 103 { 104 int op,l,r,id,x; 105 }; 106 stu a[240005]; 107 int ans[80005]; 108 int m[240005]; 109 stu q1[240005],q2[240005]; 110 inline void erfen(int l,int r,int sl,int sr) 111 { 112 if(sl>sr) 113 { 114 return ; 115 } 116 if(l==r) 117 { 118 int i; 119 for(i=sl;i<=sr;i++) 120 { 121 if(a[i].op!=2) 122 { 123 continue; 124 } 125 ans[a[i].id]=l; 126 } 127 return ; 128 } 129 int i,mid=(l+r)>>1,k,cnt1=0,cnt2=0; 130 for(i=sl;i<=sr;i++) 131 { 132 if(a[i].op==0) 133 { 134 if(a[i].x<=mid) 135 { 136 add(first[a[i].l],1); 137 m[i]=0; 138 } 139 else 140 { 141 m[i]=1; 142 } 143 continue; 144 } 145 if(a[i].op==1) 146 { 147 if(a[i].x<=mid) 148 { 149 add(first[a[i].l],-1); 150 m[i]=0; 151 } 152 else 153 { 154 m[i]=1; 155 } 156 continue; 157 } 158 if(a[i].op==2) 159 { 160 k=lca(a[i].l,a[i].r); 161 if(k<a[i].x) 162 { 163 a[i].x-=k; 164 m[i]=1; 165 } 166 else 167 { 168 m[i]=0; 169 } 170 } 171 } 172 for(i=sl;i<=sr;i++) 173 { 174 if(a[i].op==0) 175 { 176 if(a[i].x<=mid) 177 { 178 add(first[a[i].l],-1); 179 } 180 } 181 if(a[i].op==1) 182 { 183 if(a[i].x<=mid) 184 { 185 add(first[a[i].l],1); 186 } 187 } 188 if(m[i]==0) 189 { 190 cnt1++; 191 q1[cnt1]=a[i]; 192 } 193 else 194 { 195 cnt2++; 196 q2[cnt2]=a[i]; 197 } 198 } 199 for(i=1;i<=cnt1;i++) 200 { 201 a[sl+i-1]=q1[i]; 202 } 203 for(i=1;i<=cnt2;i++) 204 { 205 a[sl+cnt1+i-1]=q2[i]; 206 } 207 erfen(l,mid,sl,sl+cnt1-1); 208 erfen(mid+1,r,sl+cnt1,sr); 209 } 210 int p[80005]; 211 int main() 212 { 213 memset(h,-1,sizeof(h)); 214 memset(ans,0x3f,sizeof(ans)); 215 n=read(),q=read(); 216 int i,x,y,tail=0,k,o; 217 for(i=1;i<=n;i++) 218 { 219 x=read(); 220 tail++; 221 a[tail].op=0,a[tail].l=i,a[tail].x=x; 222 p[i]=x; 223 } 224 for(i=1;i<n;i++) 225 { 226 x=read(),y=read(); 227 addedge(x,y); 228 addedge(y,x); 229 } 230 dep[1]=1; 231 bfs(1,-1); 232 spfa(1,1); 233 for(i=1;i<=n;i++) 234 { 235 add(first[i],1); 236 } 237 for(i=1;i<=q;i++) 238 { 239 k=read(),x=read(),y=read(); 240 if(k==0) 241 { 242 tail++; 243 a[tail].op=1;a[tail].l=x,a[tail].x=p[x]; 244 tail++; 245 a[tail].op=0;a[tail].l=x;a[tail].x=y; 246 p[x]=y; 247 } 248 else 249 { 250 o=lca(x,y); 251 if(o<k) 252 { 253 ans[i]=-1; 254 continue; 255 } 256 k=o-k+1; 257 tail++; 258 a[tail].op=2,a[tail].l=x,a[tail].r=y,a[tail].x=k; 259 a[tail].id=i; 260 } 261 } 262 memset(data,0,sizeof(data)); 263 erfen(0,100000000,1,tail); 264 for(i=1;i<=q;i++) 265 { 266 if(ans[i]==0x3f3f3f3f) 267 { 268 continue; 269 } 270 if(ans[i]==-1) 271 { 272 puts("invalid request!"); 273 } 274 else 275 { 276 printf("%d\n",ans[i]); 277 } 278 } 279 return 0; 280 }
转载于:https://www.cnblogs.com/gcyyzf/p/6209455.html
bzoj1146整体二分+树链剖分+树状数组相关推荐
- 【bzoj1146】 [CTSC2008]网络管理Network【树链剖分+树套树+二分 线段树套Treap】
1146: [CTSC2008]网络管理Network Description M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个 部门之间协同工作,公 ...
- 洛谷 P3384 【模板】树链剖分-树链剖分(点权)(路径节点更新、路径求和、子树节点更新、子树求和)模板-备注结合一下以前写的题目,懒得写很详细的注释...
P3384 [模板]树链剖分 题目描述 如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节 ...
- 【暖*墟】#树链剖分# 树链剖分学习与练习
树链剖分 树链剖分是一种优化,将树上最常经过的几条链划为重点,用线段树来优化区间修改和查询. 并且因为在一棵子树中dfs序是连续的,并且在任意一条重链上,dfs序也是连续的, 可以认为轻链是单点修改, ...
- HDU 3966-Aragorn's Story 树链剖分+树状数组
题目链接 题意:有一棵树,每个节点有权值 有三种操作: I c1 c2 k 从节点c1到节点c2的路径上每个节点权值增加k D c1 c2 k 从节点c1到节点c2的路径上每个节点权值减少k Q i ...
- 【LuoguP3038/[USACO11DEC]牧草种植Grass Planting】树链剖分+树状数组【树状数组的区间修改与区间查询】...
模拟题,可以用树链剖分+线段树维护. 但是学了一个厉害的..树状数组的区间修改与区间查询.. 分割线里面的是转载的: ----------------------------------------- ...
- 2017 ACM/ICPC Asia Regional Shenyang Online Ping Ping Ping 树链剖分+树状数组
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=6203 题目大意:给出n+1个节点的树( 3<n<10^4),并给出m对点(m<=50 ...
- BZOJ 1146: [CTSC2008]网络管理Network( 树链剖分 + 树状数组套主席树 )
树链剖分完就成了一道主席树裸题了, 每次树链剖分找出相应区间然后用BIT+(可持久化)权值线段树就可以完成计数. 但是空间问题很严重....在修改时不必要的就不要新建, 直接修改原来的..详见代码. ...
- 【bzoj 3531】 [Sdoi2014]旅行(树链剖分+树套树)
3531: [Sdoi2014]旅行 Time Limit: 20 Sec Memory Limit: 512 MB Submit: 1197 Solved: 576 [Submit][Statu ...
- 树链剖分——树链剖分模板
原题 给定一棵树,树中包含 n 个节点(编号 1∼n),其中第 i 个节点的权值为 ai. 初始时,1 号节点为树的根节点. 现在要对该树进行 m 次操作,操作分为以下 4 种类型: 1 u v k, ...
最新文章
- 资料分享:推荐一本《李宏毅机器学习》开源电子书!
- vue transition动画
- 为什么Android要采用Binder作为IPC机制?
- Codeforce-Ozon Tech Challenge 2020-C. Kuroni and Impossible Calculation(鸽笼原理)
- Educational Codeforces Round 75 (Rated for Div. 2) E2. Voting (Hard Version) 贪心
- 升级浏览器_星愿浏览器升级至6.3.2000.2001
- jqgrid本地数据例子_办公系统私有云公有云和本地化部署,你选哪个?
- Lesson4 一阶方程代换法
- data标签怎么爬虫_scrapy爬虫笔记(1):scrapy基本使用
- 让你相见恨晚的PS技巧分享
- 软件设计师证书的作用有多大?
- Linux系统发展历史
- 数学计算机教学课题,《运用信息技术,优化数学课堂教学》课题方案.doc
- VirtualBox调整分辨率
- Java语言中抽取word、pdf的四种方法
- java 导出加密压缩包 设置 压缩包加密密码 并下载 (springboot+文件工具类)
- 基于.net开发chrome核心浏览器【一】
- 博弈论(一)--yale
- scp 复制多个文件到远程主机
- 如何在 Excel 中设置表格格式并进行排序?
热门文章
- 为什么要有不同的参考文献格式?
- C#利用HttpWebRequest、HttpWebResponse调用12306接口,实现登录、查票、买票。
- JS调用新旧windowsMedia的方法
- .idea文件在项目中的显示与隐藏
- cocoscreator数字增长动画
- 玄学资料库(一)NPM、PYPI、DockerHub 备份
- 将 MobaXterm 的高亮/突出显示集功能(HighLight sets)移植到 Xshell6 中使用
- 深圳服务器托管,影响价格的因素
- linux shell 快速掌握
- Win10,Win11系统安全中心提醒“找到可能不需要的应用”弹窗,如何关闭?