http://acm.whu.edu.cn/land/problem/detail?problem_id=1464
题目:
There are n numbers with the corresponding NO.1-n, and the value of the i-th number is xi.
#include <cstdio> #define N 100005 typedef long long LL; struct st {LL x,y,flag,sum,add; }p[N * 5]; LL a[N]; void build(LL r,LL x,LL y) {p[r].x = x;p[r].y = y;p[r].add = 0;if(x == y){p[r].sum = a[x];if(a[x] > 0)p[r].flag = 1;elsep[r].flag = 0;return ;}LL mid = (x + y) >> 1,tem = r * 2;build(tem,x,mid);build(tem + 1,mid + 1,y);p[r].sum = p[tem].sum + p[tem + 1].sum;if(p[tem].flag || p[tem + 1].flag)p[r].flag = 1;elsep[r].flag = 0; } void dd(LL r,LL x,LL y,LL d) {if(!p[r].flag)return ;if(p[r].x == x && p[r].y == y && x == y){if(p[r].sum > 0){p[r].sum = p[r].sum / d;if(p[r].sum > 0)p[r].flag = 1;elsep[r].flag = 0;}elsep[r].flag = 0;return ;}LL mid = (p[r].x + p[r].y) >> 1,tem = r * 2;if(p[r].add){p[tem].sum += (p[tem].y - p[tem].x + 1) * p[r].add;p[tem].add += p[r].add;p[tem + 1].sum += (p[tem + 1].y - p[tem + 1].x + 1) * p[r].add;p[tem + 1].add += p[r].add;p[r].add = 0;}if(y <= mid)dd(tem,x,y,d);else if(x > mid)dd(tem + 1,x,y,d);else{dd(tem,x,mid,d);dd(tem + 1,mid + 1,y,d);}if(p[tem].flag || p[tem + 1].flag)p[r].flag = 1;elsep[r].flag = 0;p[r].sum = p[tem].sum + p[tem + 1].sum;} void insert(LL r,LL x,LL y,LL add) {if(p[r].x == x && p[r].y == y){p[r].sum += (y - x + 1) * add;p[r].add += add;return ;}LL mid = (p[r].x + p[r].y) >> 1,tem = r * 2;if(p[r].add){p[tem].sum += (p[tem].y - p[tem].x + 1) * p[r].add;p[tem].add += p[r].add;p[tem + 1].sum += (p[tem + 1].y - p[tem + 1].x + 1) * p[r].add;p[tem + 1].add += p[r].add;p[r].add = 0;}if(y <= mid)insert(tem,x,y,add);else if(x > mid)insert(tem + 1,x,y,add);else{insert(tem,x,mid,add);insert(tem + 1,mid + 1,y,add);}p[r].sum = p[tem].sum + p[tem + 1].sum; } LL query(LL r,LL x,LL y) {LL sum = 0;if(p[r].x == x && p[r].y == y){return p[r].sum;}LL mid = (p[r].x + p[r].y) >> 1,tem = r * 2;if(p[r].add){p[tem].sum += (p[tem].y - p[tem].x + 1) * p[r].add;p[tem].add += p[r].add;p[tem + 1].sum += (p[tem + 1].y - p[tem + 1].x + 1) * p[r].add;p[tem + 1].add += p[r].add;p[r].add = 0;}if(y <= mid)sum += query(tem,x,y);else if(x > mid)sum += query(tem + 1,x,y);elsesum = sum + query(tem,x,mid) + query(tem + 1,mid + 1,y);return sum; } int main() {LL t,u = 0;scanf("%lld",&t);while(t --){LL n,m;scanf("%lld %lld",&n,&m);for(LL i = 1;i <= n;i ++)scanf("%lld",&a[i]);build(1,1,n);char ch[10];LL x,y,z;printf("Case %lld:\n",++ u);while(m --){scanf("%s",ch);if(ch[0] == 'D'){scanf("%lld %lld %lld",&x,&y,&z);if(z > 1)dd(1,x,y,z);}else if(ch[0] == 'M'){scanf("%lld %lld %lld",&x,&y,&z);insert(1,x,y,-z);}else{scanf("%lld %lld",&x,&y);printf("%lld\n",query(1,x,y));}}printf("\n");}return 0; }
转载于:https://www.cnblogs.com/acmlove/archive/2013/04/17/3025827.html
http://acm.whu.edu.cn/land/problem/detail?problem_id=1464相关推荐
- PKU ACM 1258 Agri-Net http://acm.pku.edu.cn/JudgeOnline/problem?id=1258
熟悉了prim算法后这样的题目在十分钟内真的可以解决!最小生成树,prim真的很有用! #include <iostream> using namespace std; const int ...
- http://acm.zzuli.edu.cn/zzuliacm/problem.php?id=1895 二分
Description 985有一个长度为n的0-1串,已知他最多可以修改k次(每次修改一个字符即0->1 或者 1->0),他想知道连续的全1子串最长是多少. Input 第一行输入一个 ...
- pku acm 2140 Herd Sums http://acm.pku.edu.cn/JudgeOnline/problem?id=2140
2140代码短小精悍:#include<stdio.h> int main() { int cnt=0,i; long s; scanf("%ld",&s); ...
- ACM PKU 2663 Tri Tiling http://acm.pku.edu.cn/JudgeOnline/problem?id=2663
这题开始没有思路,后来看了流牛的解题报告才写出来: 递推公式我写一下: sign[i] = 1 (当i == 0 时,具体为什么我也没有具体的说明方法 ...
- ACM PKU 2559 Largest Rectangle in a Histogram http://acm.pku.edu.cn/JudgeOnline/problem?id=2559
关于覆盖,用DP是一种很不错的解决方法,时效也很不错.... 这题目把图一画就很明确了,没有说明的必要了. #include <iostream> using namespace std; ...
- ACM PKU 1111 Image Perimeters http://acm.pku.edu.cn/JudgeOnline/problem?id=1111
广搜永远记住,下标不要错,COPY时一定要记得改下标: #include <iostream> #include <queue> using namespace std;cha ...
- ACM PKU 1019 Number Sequence http://acm.pku.edu.cn/JudgeOnline/problem?id=1019
#include <iostream> #include <cmath> using namespace std;int Len(int n) // 求数字的长度函数: {re ...
- 2017轻工业校赛 维克兹的进制转换 https://acm.zzuli.edu.cn/zzuliacm/problem.php?id=2134
因为在每个数只能有二进制构成 即5有21,101折两种方式 不同于2进制的方式为数字最大 可以为2 所以在末尾只有0,1,2 如果数字为奇数 末尾必定为1 所以我们理解为n/2*2+1即为 ...
- 【西交ACM】100 A+B problem
[西交ACM]100 A+B problem http://202.117.21.117/xjoj/problem_html/100.html 最简单的程序. Description give y ...
- HDU 4911 http://acm.hdu.edu.cn/showproblem.php?pid=4911(线段树求逆序对)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4911 解题报告: 给出一个长度为n的序列,然后给出一个k,要你求最多做k次相邻的数字交换后,逆序数最少 ...
最新文章
- 《防患未然:实施情报先导的信息安全方法与实践》——3.3 攻击剖析
- 辩论届人机大战:IBM新AI完胜人类冠军!
- sqlplus column命令用法
- hibernate教程--持久化类状态详解
- 力扣- -去除重复字母
- 如何在centos上安装epel源
- 【干货】如何打造一流创业团队-创业者最实用的管理指南.pdf(附下载链接)...
- 判断某个字符出现的次数
- intel收购Altera
- 02 - Redis源码结构介绍
- UVA 11991 Easy Problem from Rujia Liu?
- 往返多伦多与温莎的交通全攻略!
- ERP系统-库存子系统-申购单
- 如何使用Socks5代理IP加密Windows网络数据传输
- Android-001-标题栏(最上面栏的appname)文字居中
- 快速画正弦波、方波、三角波——Visio制图总结(六)
- 边缘化中FEJ图例的理解
- GCC源码分析(十) — 函数节点的gimple高端化
- 软件公司(Java)转正总结报告,仅供参考
- MindManager使用说明