2018icpc徐州网络赛-H Ryuji doesn't want to study(线段树)
题意:
有n个数的一个数组a,有两个操作:
1 l r:查询区间[l,r]内$a[l]*(r-l+1)+a[l+1]*(r-l)+a[l+2]*(r-l-1)+\cdots+a[r-1]*2+a[r]$
2 l r:将a[l]修改为r
n<=1e5, a[i]<=1e9
思路:
预处理出前缀和s[i], 则操作1变为查询$s[l]+s[l+1]+..+s[r]-(r-l+1)*s[l-1]$
为防止爆ll(其实也不会爆的)可以在查询操作力就提前减去s[l-1]
坑点来了。。操作2即区间s(l,n)加上r-a[l],由于我们线段树里的一些标记操作,实际上a[i]和s[i]数组并没有变!
所以我们每次需要用s或a数组的时候都要query。。
代码:
- #include<iostream>
- #include<cstdio>
- #include<algorithm>
- #include<cmath>
- #include<cstring>
- #include<string>
- #include<stack>
- #include<queue>
- #include<deque>
- #include<set>
- #include<vector>
- #include<map>
- #include<functional>
- #define fst first
- #define sc second
- #define pb push_back
- #define mem(a,b) memset(a,b,sizeof(a))
- #define lson l,mid,root<<1
- #define rson mid+1,r,root<<1|1
- #define lc root<<1
- #define rc root<<1|1
- #define lowbit(x) ((x)&(-x))
- using namespace std;
- typedef double db;
- typedef long double ldb;
- typedef long long ll;
- typedef unsigned long long ull;
- typedef pair<int,int> PI;
- typedef pair<ll,ll> PLL;
- const db eps = 1e-;
- const int mod = 1e9+;
- const int maxn = 1e6+;
- const int maxm = 2e6+;
- const int inf = 0x3f3f3f3f;
- const db pi = acos(-1.0);
- ll sum[maxn<<];
- ll s[maxn];
- ll a[maxn];
- int ii;
- void build(int l, int r, int root){
- int mid = l + ((r - l) >> );//位运算TMD优先级!
- if(l == r){
- sum[root] = s[l];
- return;
- }
- build(lson);
- build(rson);
- sum[root] = sum[lc]+sum[rc];
- }
- ll addv[maxn << ];
- //将root的信息传到左右节点上
- void pushup(int root){
- sum[root] = sum[lc] + sum[rc];
- return;
- }
- void pushdown(int l, int r, int root){
- if(addv[root]){
- addv[lc] += addv[root];
- addv[rc] += addv[root];
- int mid = l + ((r-l)>>);
- sum[lc] += addv[root]*(mid-l+);
- sum[rc] += addv[root]*(r-mid);
- addv[root] = ;
- }
- return;
- }
- void update(int ql, int qr, ll add, int l, int r, int root){
- if(ql <= l && qr >= r){
- addv[root] += add;
- sum[root] += add*(r-l+);
- return;
- }
- pushdown(l, r, root);
- int mid = l + ((r-l)>>);
- if(ql <= mid) update(ql, qr, add, lson);
- if(qr > mid) update(ql, qr, add, rson);
- pushup(root);
- return;
- }
- ll query(int ql, int qr, int l, int r, int root){
- if(ql==)return ;
- if(ql <= l && qr >= r) return sum[root];//(sum[root]-(ll)((ll)r-l+1)*s[ii-1]);
- pushdown(l, r, root);
- int mid = l + ((r-l)>>);
- ll ans = ;
- if(ql <= mid) ans += query(ql, qr, lson);
- if(qr > mid) ans += query(ql, qr, rson);
- return ans;
- }
- int main() {
- int n, q;
- scanf("%d %d", &n, &q);
- for(int i =; i <= n ; i++){
- scanf("%lld", &a[i]);
- }s[] = ;
- mem(s, );
- for(int i = ; i <= n; i++){
- s[i] = a[i]+s[i-];
- }
- mem(addv, );
- mem(sum, );
- build(, n, );
- while(q--){
- int c,l,r;
- scanf("%d %d %d", &c, &l, &r);
- if(c==){
- ii = l;
- printf("%lld\n", query(l, r, , n, ) -(r-l+)*query(l-,l-,,n,));
- }
- else if(c==){
- ll tmp = (ll)r-(query(l, l, , n, ) -query(l-, l-, , n, ));
- update(l, n, tmp, , n, );
- }A
- }
- return ;
- }
- /*
- 5 10
- 1000000000 1000000000 1000000000 1000000000 1000000000
- 1 2 4
- 2 1 0
- 1 2 4
- */
2018icpc徐州网络赛-H Ryuji doesn't want to study(线段树)的更多相关文章
- 2018徐州网络赛H. Ryuji doesn't want to study
题目链接: https://nanti.jisuanke.com/t/31458 题解: 建立两个树状数组,第一个是,a[1]*n+a[2]*(n-1)....+a[n]*1;第二个是正常的a[1], ...
- ACM-ICPC 2018 徐州赛区网络预赛H Ryuji doesn't want to study(树状数组)题解
题意:给你数组a,有两个操作 1 l r,计算l到r的答案:a[l]×L+a[l+1]×(L−1)+⋯+a[r−1]×2+a[r] (L is the length of [ l, r ] that ...
- ACM-ICPC 2018 徐州赛区网络预赛 H. Ryuji doesn't want to study(树状数组)
Output For each question, output one line with one integer represent the answer. 样例输入 5 3 1 2 3 4 5 ...
- 计蒜客 31460 - Ryuji doesn't want to study - [线段树][2018ICPC徐州网络预赛H题]
题目链接:https://nanti.jisuanke.com/t/31460 Ryuji is not a good student, and he doesn't want to study. B ...
- ACM-ICPC 2018 徐州赛区网络预赛 H. Ryuji doesn't want to study (线段树)
Ryuji is not a good student, and he doesn't want to study. But there are n books he should learn, ea ...
- 南昌网络赛 I. Max answer (单调栈 + 线段树)
https://nanti.jisuanke.com/t/38228 题意给你一个序列,对于每个连续子区间,有一个价值,等与这个区间和×区间最小值,求所有子区间的最大价值是多少. 分析:我们先用单调栈 ...
- ACM-ICPC 2018徐州网络赛-H题 Ryuji doesn't want to study
死于update的一个long long写成int了 真的不想写过程了 ******** 树状数组,一个平的一个斜着的,怎么斜都行 题库链接:https://nanti.jisuanke.com/t/ ...
- ACM-ICPC 2018 徐州赛区网络预赛 H. Ryuji doesn't want to study
262144K Ryuji is not a good student, and he doesn't want to study. But there are n books he should ...
- ACM-ICPC 2018 徐州赛区网络预赛 H Ryuji doesn't want to study (树状数组差分)
https://nanti.jisuanke.com/t/31460 题意 两个操作.1:查询区间[l,r]的和,设长度为L=r-l+1, sum=a[l]*L+a[l+1]*(L-1)+...+a[ ...
随机推荐
- 写 Java 这么久了,来编译个 JDK 玩玩儿吧
你每天写的 Java 代码都需要 JDK 的支持,都要跑在 JVM 上,难道你就不好奇 JDK 长什么样子吗.好奇,就来编译并实现一个自己的 JDK 吧. 本次编译环境 macOS 10.12,编译的 ...
- 从头学pytorch(十六):VGG NET
VGG AlexNet在Lenet的基础上增加了几个卷积层,改变了卷积核大小,每一层输出通道数目等,并且取得了很好的效果.但是并没有提出一个简单有效的思路. VGG做到了这一点,提出了可以通过重复使⽤ ...
- 客户端进行定位(无地图API)
需求: 根据用户浏览的所在城市加载相应的县级列表 思路: 使用搜索的服务找出当前用户的IP,然后使用百度的服务通过IP进行定位 源码: <!DOCTYPE html> <html&g ...
- Tarjan强连通分量模板
最好还是看一看下面这个网址吧 我的这篇博客里的代码更加缜密(毫无错误的神级代码)https://www.cnblogs.com/Tidoblogs/p/11315153.html https://ww ...
- SVN打patch,某Java文件提示svn:mime-type = application/octet-stream的问题
在使用SVN合版本时发现某文件有冲突,正常冲突文件是可以编辑修改的,但是该文件无法编辑,我只好选择后续修改选项,问题好诡异啊!!!在解决完其他冲突后,我选择了在eclipse开发工具内将修改的代码调整 ...
- “Your build settings specify a provisioning profile with the UUID “”, however, no such provisioning profile was found”
解决方法: 终端命令行输入下面语句,删除所有的Profilescd ~/Library/MobileDevice/Provisioning\ Profiles/rm *.mobileprovision
- 认识一下 RabbitMQ
分布式系统中,如何在各个应用之间高效的进行通信,是系统设计中的一个关键. 使用 消息代理(message broker) 是一个优雅的解决方案. RabbitMQ 就是一个被广泛应用的消息代理,遵循 ...
- [3.0] 一个人开发一个App,小程序从0到1,删减添加
在这个黄道吉日,咱们将要干一件,惊天地泣鬼神,妇孺皆知的大事,那就是删掉微信开发工具自动生成的源代码. 删掉pages下的index.logs目录,啥都不留: 删掉utils下的util.js,只流空 ...
- BigInteger的权限设计
通过储存菜单权限的一个字段(id自定义也是可以的) 1 将选中菜单树的id转换成字符数组的形式, 进行BigInteger对权限进行2的权的和计算 public static BigInteger s ...
- 将jar包安装到本地仓库
通过cmd切换到apache maven 的bin目录 mvn install:install-file -DgroupId=com.antgroup.zmxy -DartifactId=zmxy-s ...