【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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/429905.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

oracle .dbf文件过大_学习这篇Oracle数据库文件坏块损坏的恢复方法,拓展你的知识面...

一、Oracle数据库系统简介&#xff1a;ORACLE数据库系统是美国ORACLE公司&#xff08;甲骨文&#xff09;提供的以分布式数据库为核心的一组软件产品&#xff0c;是目前最流行的客户/服务器(CLIENT/SERVER)或B/S体系结构的数据库之一。比如SilverStream就是基于数据库的一种中间…

threejs- z-fighting 问题

Z-Buffer 在threejs中&#xff0c;使用深度缓冲&#xff08;Z-Buffer&#xff09;来完成场景可见性计算&#xff0c;即确定场景哪部分可见&#xff0c;哪部分不可见。深度缓冲&#xff08;Z-Buffer&#xff09;是一个二维数组&#xff0c;其中的每一个元素对应屏幕上的一个像素…

python2中文字符串遍历乱码_完美解决Python2操作中文名文件乱码的问题

Python2默认是不支持中文的&#xff0c;一般我们在程序的开头加上#-*-coding:utf-8-*-来解决这个问题&#xff0c;但是在我用open()方法打开文件时&#xff0c;中文名字却显示成了乱码。我先给大家说说Python中的编码问题&#xff0c;Python中的字符串的大概分为为str和Unicode…

bower overrides 配置

bower 是一个常用的包管理工具&#xff0c;用起来和npm很相似&#xff0c;但是两者又有一些区别&#xff0c;可以参考 —— What is the difference between Bower and npm。这里不说bower本身&#xff0c;而想说一下bower的overrides配置。 何谓override override 本身是覆盖…

装mysql最后一步没响应_解决MySQL安装到最后一步未响应的三种方法

这种情况一般是你以前安装过MySQL数据库服务项被占用了。解决方法&#xff1a;方法一&#xff1a;安装MySQL的时候在这一步时它默认的服务名是“MySQL” 只需要把这个名字改了就可以了。可以把默认的服务器的名称手动改为你没用过的其他名称。方法二&#xff1a;1、卸载MySQL …

windows下搭建Vagrant+Virtualbox环境

对于开发人员来说&#xff0c;Vagrant就是一个提供标准化开发环境的工具。通过Vagrant&#xff1a; 使每个开发人员电脑上的代码运行环境一致&#xff0c;再也不会出现“在我电脑上运行起来明明没有问题的”这样的开发环境不一致的问题。你可以使用Vagrant在windows下提供linu…

php注释规范

注释在写代码的过程中非常重要&#xff0c;好的注释能让你的代码读起来更轻松&#xff0c;在写代码的时候一定要注意注释的规范。 php里面常见的几种注释方式&#xff1a; 1.文件头的注释&#xff0c;介绍文件名&#xff0c;功能以及作者版本号等信息 /** *文件名简单介绍 * …

aix oracle监听配置_AIX系统中安装ORACLE,客户端连接时,监听会宕掉的问题

一次做实验&#xff0c;在AIX5300&#xff0d;06系统中安装ORACLE10.2.0.1数据库&#xff0c;安装过程都正常&#xff0c;在服务器上不加实例名连接时也很正常&#xff0c;可是客户端一连接&#xff0c;监听就会宕掉。故障现象如下&#xff1a;LSNRCTL> statusConnecting to…

Jenkins主从节点配置

jenkins支持主从模式&#xff0c;这将会把构建任务分发到多个从节点去执行&#xff0c;这样就可以支撑起多个项目的大量构建任务&#xff0c;同时&#xff0c;你可以提供多种环境&#xff08;如&#xff1a;开发环境、生产环境&#xff09;来对同一个项目进行测试和构建。想要进…

mac brew 安装php扩展报错:parent directory is world writable but not sticky

$ brew install php70-mcrypt 报错&#xff1a; Error: parent directory is world writable but not sticky 搜索到github的答案 https://github.com/Homebrew/legacy-homebrew/issues/40345 原因&#xff1a;/tmp目录权限不对 $ ls -ld /private/tmp 打印出来 /private/tmp 被…

HTML5 响应式图片

现在上网设备越来越多&#xff0c;各种设备的屏幕千差万别&#xff0c;如果只用一张图片去涵盖所有的设备&#xff0c;一是可能会造成某些设备上显示效果不佳&#xff0c;比如使用了一张低清晰度的图&#xff0c;而网页运行在一个高清大屏里&#xff1b;二是可能会浪费带宽&…

python股票网格交易法详解_干货 | 浅谈网格交易法

原标题&#xff1a;干货 | 浅谈网格交易法网格交易法的基本原理就是把行情的所有日间上下的波动全部囊括&#xff0c;它不会放过任何一次的行情上下波动。不管市场价格如何上下波动&#xff0c;不外3种形态&#xff1a;上涨&#xff0c;盘整&#xff0c;下跌。由于不同的操作方…

SVN代码回滚命令之---svn up ./ -r 版本号---OK

一、改动还没被提交的情况&#xff08;未commit&#xff09; 这种情况下&#xff0c;见有的人的做法是删除work copy中文件&#xff0c;然后重新update&#xff0c;恩&#xff0c;这种做法达到了目的&#xff0c;但不优雅&#xff0c;因为这种事没必要麻烦服务端。 其实一个命令…

threejs坐标转换

屏幕坐标转three.js坐标 将屏幕坐标转变成threejs空间坐标&#xff1a; function transToThreeCoord(x,y){let mouse new THREE.Vector3();mouse.x (x/window.innerWidth)*2 -1;mouse.y -(y/window.innerHeight)*2 1;return mouse; }注意&#xff1a;在实际使用中&#x…

每天一个linux命令(24):Linux文件类型与扩展名

Linux文件类型和Linux文件的文件名所代表的意义是两个不同的概念。我们通过一般应用程序而创建的比如file.txt、file.tar.gz &#xff0c;这些文件虽然要用不同的程序来打开&#xff0c;但放在Linux文件类型中衡量的话&#xff0c;大多是常规文件&#xff08;也被称为普通文件&…

android socket 发送byte_如何正确地创建和销毁网络通讯程序中的Socket类的对象实例...

软件项目实训及课程设计指导——如何正确地创建和销毁软件应用系统中网络通讯中的Socket类的对象实例1、基于TCP/IP协议的Socket通信相关的基础知识(1)TCP/IP(Transmission Control Protocol传输控制协议/Internet Protocol网间协议)TCP/IP是目前Internet网络中的主要协议&…

H5 使用微信开放标签跳转小程序

微信开放标签是微信公众平台面向网页开发者提供的扩展标签集合&#xff0c;可以在网页上提供跳转小程序、打开 App 等能力。本文梳理使用微信开放标签跳转小程序的过程&#xff0c;以备日后查阅。 参考链接 1. 开放标签说明文档 准备已认证的服务号 开放标签只能绑定已认证…

【网络流24题】No.7 试题库问题 (最大流,二分图多重匹配)

【题意】 假设一个试题库中有 n 道试题。 每道试题都标明了所属类别。 同一道题可能有多个类别属性。现要从题库中抽取 m 道题组成试卷。并要求试卷包含指定类型的试题。 试设计一个满足要求的组卷算法。 输入文件示例input.txt3 153 3 42 1 21 31 31 31 33 1 2 32 2 32 1 31 2…

css3 transform matrix 深入理解

矩阵可以用来表示图形的变换。css3定义了matrix和matrix3d方法&#xff0c;用来表示2维和3维的变换。下文将分析这两个接口的使用方法&#xff0c;并且用下文的思路&#xff0c;实现了一个简单的用js控制css3变换的jquery插件css3js &#xff0c; 变换矩阵和净变换矩阵 matri…

php给留言分配id_简单实现PHP留言板功能

本文实例为大家分享了PHP留言板功能的具体实现代码&#xff0c;供大家参考&#xff0c;具体内容如下HTML代码PHP留言本留言者: {$vo.nickname}|邮箱: {$vo.email}时间: {$vo.replytime}内容: {$vo.content}{$vo.id}楼留言重置function clearDefaultText(){var nickname docume…