[BZOJ3730]震波(动态点分治)
3730: 震波
Time Limit: 15 Sec Memory Limit: 256 MB
Submit: 2260 Solved: 470
[Submit][Status][Discuss]Description
在一片土地上有N个城市,通过N-1条无向边互相连接,形成一棵树的结构,相邻两个城市的距离为1,其中第i个城市的价值为value[i]。
不幸的是,这片土地常常发生地震,并且随着时代的发展,城市的价值也往往会发生变动。
接下来你需要在线处理M次操作:
0 x k 表示发生了一次地震,震中城市为x,影响范围为k,所有与x距离不超过k的城市都将受到影响,该次地震造成的经济损失为所有受影响城市的价值和。
1 x y 表示第x个城市的价值变成了y。
为了体现程序的在线性,操作中的x、y、k都需要异或你程序上一次的输出来解密,如果之前没有输出,则默认上一次的输出为0。Input
第一行包含两个正整数N和M。
第二行包含N个正整数,第i个数表示value[i]。
接下来N-1行,每行包含两个正整数u、v,表示u和v之间有一条无向边。
接下来M行,每行包含三个数,表示M次操作。Output
包含若干行,对于每个询问输出一行一个正整数表示答案。
Sample Input
8 1
1 10 100 1000 10000 100000 1000000 10000000
1 2
1 3
2 4
2 5
3 6
3 7
3 8
0 3 1Sample Output
11100101HINT
1<=N,M<=100000
1<=u,v,x<=N
1<=value[i],y<=10000
0<=k<=N-1
很久没有写过代码题了,被这道没什么难度的题目弄的心力交瘁。
很容易想到是动态点分治的题型,有可以看出需要数据结构维护,因为有影响半径的限制,又是求和,很容易想到线段树。这样由于树高的限制,每个点最多出现在log n棵线段树中,动态开点就好了。
实际上动态点分治不需要一上来就建点分树,遍历一遍求出每个点在点分树上的父节点就可以了,只有需要知道点分树的子节点在父节点在原树上的哪个子树内的时候才需要建图(将这个作为边权即可,参考BZOJ3924捉迷藏)。
这道题虽然只是几个模板拼在一起,但是我调了很久,说明对代码的熟练程度还有很大的欠缺。有很多错误,而且因为这道题既卡空间又卡时间,所以还需要各种卡常技巧,下面是一些我遇到的问题。
- 不要建点分树,只需记录父节点。找中心的过程和普通点分治一样,rt和S作为全局变量而不是参数传入。
- 注意看清题目,强制在线要记得异或。
- 思路仍然是不断沿点分树向上爬,加上父节点的贡献减去自己的重复贡献。
- 注意点分树上儿子到父亲的距离可能比儿子到自己的距离短。
还有一些卡常技巧(让常数优化成为一种习惯):
- 快读和register最常用,但是寄存器容量有限要酌情选择。比较底层的函数的参数类型也可以设置为register int,也会有很大提升。
- 线段树能避免update的尽量避免,可以标记永久化的就不要pushdown,比如单点修改区间求和就不需要update。
- 增加一些循环终止条件。
- 多维数组将少的维数提到前面,数组开2的次幂数加一并没有明显优化效果。
- rmq求lca
想清楚之后就可以直接上代码了。
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<iostream> 5 #define rg register int 6 #define rep(i,l,r) for (rg i=l; i<=r; i++) 7 #define For(i,x) for (int i=h[x],k; i; i=nxt[i]) 8 typedef long long ll; 9 using namespace std; 10 11 const int N=100100,M=6000100,inf=1000000000; 12 int n,m,rt,S,op,x,y,lst,tot,nd,cnt,to[N<<1],nxt[N<<1],h[N]; 13 int sz[N],fa[N],vis[N],st[20][N<<1],dep[N]; 14 int pos[N],root[N],root1[N],lg[N<<1],f[N],a[N],sum[M],ls[M],rs[M]; 15 16 template<typename T>inline void rd(T &x){ 17 rg t; char ch; 18 for (t=0; !isdigit(ch=getchar()); t=(ch=='-')); 19 for (x=ch-'0'; isdigit(ch=getchar()); x=x*10+ch-'0'); 20 if (t) x=-x; 21 } 22 23 void add(rg u,rg v){ to[++cnt]=v; nxt[cnt]=h[u]; h[u]=cnt; } 24 25 void find(rg x,rg fa){ 26 sz[x]=1; f[x]=0; 27 For(i,x) if ((k=to[i])!=fa && !vis[k]) 28 find(k,x),sz[x]+=sz[k],f[x]=max(f[x],sz[k]); 29 f[x]=max(f[x],S-sz[x]); 30 if (f[x]<f[rt]) rt=x; 31 } 32 33 void dfs(rg x,rg fa){ 34 st[0][++tot]=dep[x]; pos[x]=tot; 35 For(i,x) if ((k=to[i])!=fa) 36 dep[k]=dep[x]+1,dfs(k,x),st[0][++tot]=dep[x]; 37 } 38 39 void rmq(){ 40 rep(j,1,18) rep(i,1,tot-(1<<j)+1) 41 st[j][i]=min(st[j-1][i],st[j-1][i+(1<<(j-1))]); 42 } 43 44 int get(rg l,rg r){ 45 if (l>r) swap(l,r); rg t=lg[r-l+1]; 46 return min(st[t][l],st[t][r-(1<<t)+1]); 47 } 48 49 int dis(rg u,rg v){ rg x=pos[u],y=pos[v]; return dep[u]+dep[v]-2*get(x,y); } 50 51 void mdf(rg &x,rg L,rg R,rg pos,rg k){ 52 if (!x) x=++nd; 53 sum[x]+=k; if (L==R) return; 54 rg mid=(L+R)>>1; 55 if (pos<=mid) mdf(ls[x],L,mid,pos,k); else mdf(rs[x],mid+1,R,pos,k); 56 } 57 58 int que(rg x,rg L,rg R,rg pos){ 59 if (!x) return 0; 60 if (L==R) return sum[x]; 61 rg mid=(L+R)>>1; 62 if (pos<=mid) return que(ls[x],L,mid,pos); 63 else return sum[ls[x]]+que(rs[x],mid+1,R,pos); 64 } 65 66 void work(rg x,rg F,rg p){ 67 mdf(root[p],0,n,dis(x,p),a[x]); 68 if (fa[p]) mdf(root1[p],0,n,dis(x,fa[p]),a[x]); 69 For(i,x) if (!vis[k=to[i]] && k!=F) work(k,x,p); 70 } 71 72 void build(rg x){ 73 vis[x]=1; work(x,fa[x],x); 74 for (rg i=h[x],k; i; i=nxt[i]) if (!vis[k=to[i]]) 75 f[rt=0]=inf,S=sz[k],find(k,x),fa[rt]=x,build(rt); 76 } 77 78 int getans(rg x,rg y){ 79 rg res=que(root[x],0,n,y); rg D=0; 80 for (rg i=x; fa[i]; i=fa[i]){ 81 D=dis(x,fa[i]); 82 if (D>y) continue; 83 if (D-y>20) return x; 84 res+=que(root[fa[i]],0,n,y-D)-que(root1[i],0,n,y-D); 85 } 86 return res; 87 } 88 89 void modify(rg x,rg y){ 90 int t=y-a[x]; mdf(root[x],0,n,0,t); a[x]=y; 91 for (int i=x; fa[i]; i=fa[i]){ 92 mdf(root[fa[i]],0,n,dis(x,fa[i]),t); 93 mdf(root1[i],0,n,dis(x,fa[i]),t); 94 } 95 } 96 97 int main(){ 98 freopen("bzoj3730.in","r",stdin); 99 freopen("bzoj3730.out","w",stdout); 100 rd(n); rd(m); 101 rep(i,1,n) rd(a[i]); 102 rep(i,1,n-1) rd(x),rd(y),add(x,y),add(y,x); 103 dfs(1,0); rmq(); 104 lg[1]=0; rep(i,2,tot) lg[i]=lg[i>>1]+1; 105 f[rt=0]=inf; S=n; find(1,0); build(rt); 106 rep(i,1,m){ 107 rd(op); rd(x); rd(y); x^=lst; y^=lst; 108 if (op==0) printf("%d\n",lst=getans(x,y)); else modify(x,y); 109 } 110 return 0; 111 }
转载于:https://www.cnblogs.com/HocRiser/p/8527354.html
[BZOJ3730]震波(动态点分治)相关推荐
- [BZOJ3730]震波-动态点分治
震波 Description 在一片土地上有N个城市,通过N-1条无向边互相连接,形成一棵树的结构,相邻两个城市的距离为1,其中第i个城市的价值为value[i]. 不幸的是,这片土地常常发生地震,并 ...
- 【BZOJ-3730】震波 动态点分治 + 树状数组
3730: 震波 Time Limit: 15 Sec Memory Limit: 256 MB Submit: 626 Solved: 149 [Submit][Status][Discuss] ...
- BZOJ 3730: 震波 动态树分治 线段树 lca
3730: 震波 Time Limit: 15 Sec Memory Limit: 256 MB Submit: 1202 Solved: 288 [Submit][Status][Discuss ...
- 震波——动态点分治+线段树
题目 [题目描述] 在一片土地上有 $N$ 个城市,通过 $N-1$ 条无向边互相连接,形成一棵树的结构,相邻两个城市的距离为 $1$,其中第 $i$ 个城市的价值为 $value[i]$. 不幸的是 ...
- bzoj 3730: 震波 动态点分治+树链剖分+线段树
##### 题目描述 : 在一片土地上有N个城市,通过N-1条无向边互相连接,形成一棵树的结构,相邻两个城市的距离为1,其中第i个城市的价值为value[i]. 不幸的是,这片土地常常发生地震,并且随 ...
- Bzoj 3730 震波 动态点分治
Bzoj 3730 震波 题解: 和在线的边分治差不多. 就是将每层都信息都存下来. 然后对于每一层记录上一层的重心是哪个. 对于求和的话, 从自己的那层出发,然后暴力往上爬, 然后计算答案. 对于修 ...
- BZOJ3730 震波 【动态点分治】*
BZOJ3730 震波 Description 在一片土地上有N个城市,通过N-1条无向边互相连接,形成一棵树的结构,相邻两个城市的距离为1,其中第i个城市的价值为value[i]. 不幸的是,这片土 ...
- 【BZOJ3730】震波(动态点分治)
[BZOJ3730]震波(动态点分治) 题面 BZOJ 题意 给定一棵树, 每次询问到一个点的距离\(<=K\)的点的权值之和 动态修改权值, 强制在线 题解 正常的\(DP\)??? 很简单呀 ...
- BZOJ3730 震波+BZOJ4372 烁烁的游戏(动态点分治)
震波 在一片土地上有N个城市,通过N-1条无向边互相连接,形成一棵树的结构,相邻两个城市的距离为1,其中第i个城市的价值为value[i]. 不幸的是,这片土地常常发生地震,并且随着时代的发展,城市的 ...
最新文章
- ccls提示找不到文件
- XP硬盘安装Ubuntu 10.10双系统图解(转)
- μC/OS Ⅱ之任务就绪表的操作_2012.5.31
- 前端样板资源概览及总评
- message show_once这个标志位的用法
- 基于EPOLL+多进程+线程池的server框架设想_程序世界_百度空间
- 5.Git使用详细教程
- C#winform省市县联动,以及有的县是空值时显示异常的处理
- mvc crud_Spring MVC Hibernate MySQL集成CRUD示例教程
- 重构java和js版_重构Javascript代码示例(重构前后对比)
- arm linux 中文输入法,ARM 安装中文输入法
- javascript编写acm算法题
- 用计算机怎么计算税率,一般纳税人税率计算器,一般纳税人税率如何计算?
- 凸性与久期在python中实现
- win2003的密钥
- STM32F7--->Internal Flash
- [论文分享] Stegozoa: Enhancing WebRTC Covert Channels with Video Steganography for Internet Censorship
- 编程初学者入门训练-KiKi和酸奶
- 从northwind中查询Products中最高单价(UnitPrice)是多少;
- 计算机网络-学习笔记
热门文章
- css隐藏滚动条-适用于chrome、opera、Firefox
- oracle 位图索引 死锁,Oracle位图索引引发的阻塞与死锁
- 海豚php完全开发手册,DolphinPHP1.3.0完全开发手册-基于ThinkPHP5.0.20的快速开发框架-05221135...
- TrueTpye字体和postscript字体
- 《那些年啊,那些事——一个程序员的奋斗史》——118
- android piechart属性,安卓piechart百分之0数据怎么隐藏
- MPAndroidChart之PieChart
- GLFW实例介绍(2)
- 孙文智/胡霁/汪小京团队揭示延迟满足的神经基础
- 【数字音频】WAV和PCM的关系和区别