【LuoguP3038/[USACO11DEC]牧草种植Grass Planting】树链剖分+树状数组【树状数组的区间修改与区间查询】...
模拟题,可以用树链剖分+线段树维护。
但是学了一个厉害的。。树状数组的区间修改与区间查询。。
分割线里面的是转载的:
--------------------------------------------------------------------------------
[ 3 ] 上面都不是重点……重点是树状数组的区间修改+区间查询 这个很好玩 其实也挺简单
首先依旧是引入delta数组 delta[i]表示区间 [i, n] 的共同增量 于是修改区间 [l, r] 时修改 delta[l] 和 delta[r + 1] 即可(就是差分的思路)
查询的时候是查询区间 [l, r] 的和 即sum[r] - sum[l - 1] 所以现在的问题是求sum[i]
1 sum[i] = a[1]+...+a[i] + delta[1]*i + delta[2]*(i - 1) + delta[3]*(i - 2)+...+delta[i]*1 // a[i]为原始数组 2 = sigma( a[x] ) + sigma( delta[x] * (i + 1 - x) ) 3 = sigma( a[x] ) + (i + 1) * sigma( delta[x] ) - sigma( delta[x] * x )
其中 sigma( a[x] ) 是可以预处理出来的 于是只需要维护 delta[x] 与 delta[x] * x 的前缀和(作为两个树状数组就可以了)
为了试验这个方法我专门去找了之前写线段树挂了好久的例题 = = codevs1082 线段树练习3
然后交树状数组的代码是 324ms 内存5M过了 线段树是1027ms 13M 如果去掉读入优化的话代码会更短。
--------------------------------------------------------------------------------------------------------------------------
转自:http://blog.csdn.net/qq_21841245/article/details/43956633
很好。。这题本机测系统暴栈了。。交上去才A。。
1 #include<cstdio> 2 #include<cstdlib> 3 #include<cstring> 4 #include<iostream> 5 #include<ctime> 6 #include<queue> 7 using namespace std; 8 9 const int N=2*100010,S=30,D=20; 10 struct node{ 11 int x,y,next; 12 }a[2*N]; 13 struct trnode{ 14 int l,r,lc,rc,d; 15 }t[2*N]; 16 int n,m,len,num,first[N],dep[N],f[N][S],tot[N],zs[N],dfn[N],top[N],c0[N],c1[N],delta[N]; 17 char s[10]; 18 19 void add(int x,int d) 20 { 21 for(int i=x;i<=n;i+=(i&(-i))) c0[i]+=d,c1[i]+=d*x; 22 } 23 24 int getsum(int x) 25 { 26 int a0=0,a1=0; 27 for(int i=x;i>=1;i-=(i&(-i))) a0+=c0[i],a1+=c1[i]; 28 return a0*(x+1)-a1; 29 } 30 31 32 void ins(int x,int y) 33 { 34 a[++len].x=x;a[len].y=y; 35 a[len].next=first[x];first[x]=len; 36 } 37 38 void dfs(int x,int fa) 39 { 40 dep[x]=dep[fa]+1; 41 f[x][0]=fa; 42 tot[x]=1; 43 zs[x]=0; 44 for(int i=first[x];i;i=a[i].next) 45 { 46 int y=a[i].y; 47 if(y==fa) continue; 48 dfs(y,x); 49 tot[x]+=tot[y]; 50 if(zs[x]==0 || tot[y]>tot[zs[x]]) zs[x]=y; 51 } 52 } 53 54 void find_top(int x,int fa) 55 { 56 dfn[x]=++num; 57 if(zs[x]) 58 { 59 top[zs[x]]=top[x]; 60 find_top(zs[x],x); 61 } 62 for(int i=first[x];i;i=a[i].next) 63 { 64 int y=a[i].y; 65 if(y==fa || y==zs[x]) continue; 66 top[y]=y; 67 find_top(y,x); 68 } 69 } 70 71 int solve(int x,int y,int tmp) 72 { 73 int tx=top[x],ty=top[y],ans=0; 74 while(tx!=ty) 75 { 76 if(dep[tx]<dep[ty]) swap(x,y),swap(tx,ty); 77 if(tmp==0) 78 { 79 add(dfn[tx],1); 80 add(dfn[x]+1,-1); 81 } 82 else ans+=getsum(dfn[x])-getsum(dfn[tx]-1); 83 x=f[top[x]][0];tx=top[x]; 84 } 85 if(x==y) return ans; 86 else 87 { 88 if(dep[x]<dep[y]) swap(x,y); 89 if(tmp==0) 90 { 91 add(dfn[y]+1,1); 92 add(dfn[x]+1,-1); 93 } 94 else ans+=getsum(dfn[x])-getsum(dfn[y]); 95 return ans; 96 } 97 } 98 99 void lca_init() 100 { 101 for(int j=1;j<=D;j++) 102 for(int i=1;i<=n;i++) 103 f[i][j]=f[f[i][j-1]][j-1]; 104 } 105 106 int lca_query(int x,int y) 107 { 108 if(dep[x]<dep[y]) swap(x,y); 109 for(int i=D;i>=0;i--) 110 { 111 if(f[x][i]==0) continue; 112 if(dep[f[x][i]]>=dep[y]) x=f[x][i]; 113 } 114 if(x==y) return x; 115 for(int i=D;i>=0;i--) 116 { 117 if(f[x][i]!=f[y][i]) x=f[x][i],y=f[y][i]; 118 } 119 return f[x][0]; 120 } 121 122 int main() 123 { 124 freopen("a.in","r",stdin); 125 // freopen("a.out","w",stdout); 126 // freopen("grassplant.in","r",stdin); 127 // freopen("grassplant.out","w",stdout); 128 scanf("%d%d",&n,&m); 129 int x,y,z;len=0;num=0; 130 memset(first,0,sizeof(first)); 131 memset(f,0,sizeof(f)); 132 memset(c0,0,sizeof(c0)); 133 memset(c1,0,sizeof(c1)); 134 memset(dep,0,sizeof(dep)); 135 memset(tot,0,sizeof(tot)); 136 memset(zs,0,sizeof(zs)); 137 memset(dfn,0,sizeof(dfn)); 138 for(int i=1;i<n;i++) 139 { 140 scanf("%d%d",&x,&y); 141 ins(x,y); 142 ins(y,x); 143 } 144 dfs(1,0); 145 top[1]=1;find_top(1,0); 146 // for(int i=1;i<=n;i++) 147 // { 148 // printf("i = %d dep = %d zs = %d tot = %d dfn = %d top = %d\n",i,dep[i],zs[i],tot[i],dfn[i],top[i]); 149 // } 150 lca_init(); 151 for(int i=1;i<=m;i++) 152 { 153 scanf("%s",s); 154 scanf("%d%d",&x,&y); 155 if(s[0]=='P') 156 { 157 z=lca_query(x,y); 158 solve(x,z,0); 159 solve(y,z,0); 160 } 161 else 162 { 163 printf("%d\n",solve(x,y,1)); 164 } 165 } 166 return 0; 167 }
转载于:https://www.cnblogs.com/KonjakJuruo/p/6021653.html
【LuoguP3038/[USACO11DEC]牧草种植Grass Planting】树链剖分+树状数组【树状数组的区间修改与区间查询】...相关推荐
- 【BZOJ4515】游戏,树链剖分+永久化标记线段树维护线段信息(李超线段树)
Time:2016.05.10 Author:xiaoyimi 转载注明出处谢谢 传送门 思路: 李超线段树 一开始听faebdc讲,并没有听的很懂ww 后来找到良心博文啊有木有 折越 首先可以把修改 ...
- BZOJ4012[HNOI2015]开店——树链剖分+可持久化线段树/动态点分治+vector
题目描述 风见幽香有一个好朋友叫八云紫,她们经常一起看星星看月亮从诗词歌赋谈到 人生哲学.最近她们灵机一动,打算在幻想乡开一家小店来做生意赚点钱.这样的 想法当然非常好啦,但是她们也发现她们面临着一个 ...
- 树链剖分 - BZOJ 1036: [ZJOI2008]树的统计Count
这是树链剖分的入门题,也是我学树链剖分的第一题. 树链剖分:就是把树中和线段树联系起来,求(u,v)路径中权值的最大值和其路径的权值和. 入门blog:http://blog.sina.com.cn/ ...
- 计蒜客 - Distance on the tree(树链剖分+离线处理+线段树)
题目链接:点击查看 题目大意:给出一颗含有n个节点的树,每条边都有权值,现在给出m个询问,每次询问的格式为u,v,w,我们需要求出在路径u-v上,边权小于等于w的边的个数 题目分析:因为一开始不会主席 ...
- 【树链剖分】洛谷树(P3401)
正题 P3401 题目大意 给你一棵树,让你进行以下操作 修改一条边的边权 查询一条路径的所有子路径异或值的和 解题思路 记下所有点到根节点的路径亦或值,那么查询就是所有点对的异或值之和 因为边权&l ...
- 【树链剖分】【线段树】树的统计(金牌导航 树链剖分-1)
树的统计 金牌导航 树链剖分-1 题目大意 给出一棵树,让你做若干操作,操作如下: 1.修改一个节点的值 2.查询两个节点之间路径的最大值 3.查询两个节点之间路径的和 输入样例 4 1 2 2 3 ...
- 树链剖分入门+HYSBZ - 1036树的统计Count
今天学习了树链剖分,记录一下. [题目背景] HYSBZ - 1036树的统计Count [题目分析] 题目要求求任意结点之间路径的和以及路径上最大的结点,还有可能修改.如果正常做可能会很复杂(我也不 ...
- 【YBT2023寒假Day1 B】不跪模样(树链剖分)(线段树)
不跪模样 题目链接:YBT2023寒假Day1 B 题目大意 给你一棵有根数,点有点权,两种操作: 对于所有 x 子树内与 x 距离不超过 2 的点,将其点权加 v. 询问 x 子树中,满足 i< ...
- 【GDOI2016】疯狂动物城(树链剖分+可持久化线段树)
码农题- 调了我三个晚上- 看来我的代码能力还是太弱了- 首先我们不难发现在u到v这条链的答案为∑i=1n(n−i)(n−i+1)ai2\sum_{i=1}^n\frac{(n-i)(n-i+1)a_ ...
最新文章
- mac上的终端bash命令
- 线上飙升800%,load达到12的解决过程
- 用反向传导模拟电子运动并模拟HF,HCl,HBr
- Java进阶:多线程Lock管理多个Condition的实践
- 【ClickHouse】查看数据库容量和表大小的方法(system.parts各种操作方法)
- python获取网页标题_Python2获取网页标题
- 光敏传感器实验-传感器原理及应用实验
- 瑞友天翼 mysql 密码_瑞友天翼忘记密码的处理方法.doc
- matlab最大剩余法,有限元法、有限差分法和有限体积法的区别(转载)
- STM3库文件 hal_uart.c的使用
- 外贸公司申请一个企业邮箱,国外邮箱大全对比
- 国外问卷调查怎么做?谁都能做吗?
- ubuntu php7 pdo,记录捣鼓ubuntu下PHP7.1下安装sqlserver拓展
- Django建立一个音乐网站(一)
- Windows无法连接到打印机怎么办?快收藏这些正确做法!
- 完全国产的开源Java微服务分布式开发框架 BudWk
- js实现图片上一张下一张点击
- 使用Flink1.16.0的SQLGateway迁移Hive SQL任务
- 黑链暗链事件的爆发式增长
- hive-关系运算符-存储压缩-hive调优
热门文章
- python xml添加命名空间_XML的命名空间与python解析方法
- redis集群 + 哨兵 + zookeeper_技术干货 | Redis的哨兵和集群
- 新概念英语第二册课文电子版_新概念英语第二册课文学生(Victoria)朗读
- HTML 禁止数字因被自动识别为手机号,而被添加拨号链接样式
- 4Python切片功能剖析
- JZOJ 8.15 B组总结
- 使用邮箱注册帐户以及激活
- 使用awk取passwd10-20行然后重定向
- 对PostgreSQL中后台进程内存挂载的初步学习
- java 覆盖和隐藏_Java方法的覆盖与隐藏的区别分析