题目:

There are n numbers with the corresponding NO.1-n, and the value of the i-th number is xi.

Define three operations:
    1.Division a b c, in the interval [a,b], if the value of a number is equal or greater than zero, then its value changed to it divide C(integer division). (1 <= a <= b <= n, 1 <= c <= 50000)
    2.Minus a b c, all numbers in the interval [a, b] subtract c. (1 <= a <= b <= n ,1<= c <= 50000) 
    3.Sum a b, query for the sum of all numbers in the interval [a, b]. (1 <= a <= b <= n)
思路:
线段树,对减法,直接用常规方法,除法暴力算,用flag标记下区间,下次可能就不这个区间就不用算了;
代码:
View Code

#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相关推荐

  1. PKU ACM 1258 Agri-Net http://acm.pku.edu.cn/JudgeOnline/problem?id=1258

    熟悉了prim算法后这样的题目在十分钟内真的可以解决!最小生成树,prim真的很有用! #include <iostream> using namespace std; const int ...

  2. http://acm.zzuli.edu.cn/zzuliacm/problem.php?id=1895 二分

    Description 985有一个长度为n的0-1串,已知他最多可以修改k次(每次修改一个字符即0->1 或者 1->0),他想知道连续的全1子串最长是多少. Input 第一行输入一个 ...

  3. 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); ...

  4. ACM PKU 2663 Tri Tiling http://acm.pku.edu.cn/JudgeOnline/problem?id=2663

    这题开始没有思路,后来看了流牛的解题报告才写出来: 递推公式我写一下: sign[i]         =        1           (当i == 0 时,具体为什么我也没有具体的说明方法 ...

  5. ACM PKU 2559 Largest Rectangle in a Histogram http://acm.pku.edu.cn/JudgeOnline/problem?id=2559

    关于覆盖,用DP是一种很不错的解决方法,时效也很不错.... 这题目把图一画就很明确了,没有说明的必要了. #include <iostream> using namespace std; ...

  6. ACM PKU 1111 Image Perimeters http://acm.pku.edu.cn/JudgeOnline/problem?id=1111

    广搜永远记住,下标不要错,COPY时一定要记得改下标: #include <iostream> #include <queue> using namespace std;cha ...

  7. 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 ...

  8. 2017轻工业校赛 维克兹的进制转换 https://acm.zzuli.edu.cn/zzuliacm/problem.php?id=2134

    因为在每个数只能有二进制构成  即5有21,101折两种方式  不同于2进制的方式为数字最大 可以为2 所以在末尾只有0,1,2   如果数字为奇数  末尾必定为1  所以我们理解为n/2*2+1即为 ...

  9. 【西交ACM】100 A+B problem

    [西交ACM]100   A+B problem http://202.117.21.117/xjoj/problem_html/100.html 最简单的程序. Description give y ...

  10. HDU 4911 http://acm.hdu.edu.cn/showproblem.php?pid=4911(线段树求逆序对)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4911 解题报告: 给出一个长度为n的序列,然后给出一个k,要你求最多做k次相邻的数字交换后,逆序数最少 ...

最新文章

  1. 《防患未然:实施情报先导的信息安全方法与实践》——3.3 攻击剖析
  2. 辩论届人机大战:IBM新AI完胜人类冠军!
  3. sqlplus column命令用法
  4. hibernate教程--持久化类状态详解
  5. 力扣- -去除重复字母
  6. 如何在centos上安装epel源
  7. 【干货】如何打造一流创业团队-创业者最实用的管理指南.pdf(附下载链接)...
  8. 判断某个字符出现的次数
  9. intel收购Altera
  10. 02 - Redis源码结构介绍
  11. UVA 11991 Easy Problem from Rujia Liu?
  12. 往返多伦多与温莎的交通全攻略!
  13. ERP系统-库存子系统-申购单
  14. 如何使用Socks5代理IP加密Windows网络数据传输
  15. Android-001-标题栏(最上面栏的appname)文字居中
  16. 快速画正弦波、方波、三角波——Visio制图总结(六)
  17. 边缘化中FEJ图例的理解
  18. GCC源码分析(十) — 函数节点的gimple高端化
  19. 软件公司(Java)转正总结报告,仅供参考
  20. MindManager使用说明

热门文章

  1. 父子进程共享内存通信的三种方法
  2. pycharm多行代码同时注释、去除注释
  3. GitHub 给已存在的仓库增加开原协议LICENSE
  4. 算法系列:量子计算与量子通信
  5. C语言中指针数组和数组指针
  6. Python代码规范
  7. 《Windows via C/C++》学习笔记 —— 内核对象的“线程同步”之“事件内核对象”...
  8. C#分割多页Tif文件
  9. 运维技术之二(2)、docker安装jumpserver
  10. Centos 查看系统硬件信息