whu 1464 deal with numbers
题意:
给你一串数字,对着串数字有三项操作:
Minus a,b,c:对区间[a,b]总的每个数都减c。
Division a,b,c:对区间[a,b]中的每个数都除以c。
Sum a,b:求出区间[a,b]的和~
由于该题是对区间里的所有数进行操作,用一般的线段树会TLE,在这里要用到Lazy_Tag。然后另外要注意的是除法如何维护:这里的数C <= 5*1E5 , 因为大于0才除,所以每个数最多被除 log(Ai) 次, N个数则最多被除 N*log(Ai) 次了。所以做除法可以直接更新到底,还有就是使用一个标记,区间中都不可被除时,就没必要更新到底了。另外,除数是1的时候,不能除,貌似后台数据好多1,~\(≧▽≦)/~
代码【来自:http://www.cnblogs.com/yefeng1627/archive/2013/04/15/3021460.html】:
#include<cstdio>
#include<cstdlib>
#include<cstdlib>
#include<algorithm>
using namespace std; typedef long long LL;
const int N = 5e5+;
#define lch rt<<1,l,m
#define rch rt<<1|1,m+1,r
LL sum[N<<], add[N<<];
bool flag[N<<]; void push_up(int rt){
sum[rt]=sum[rt<<]+sum[rt<<|];
flag[rt]=flag[rt<<] | flag[rt<<|];
} void push_down(int rt,int L){
if( add[rt] ){
add[rt<<]+=add[rt];
add[rt<<|]+=add[rt];
sum[rt<<]+=(L-(L>>))*add[rt];
sum[rt<<|]+=(L>>)*add[rt];
add[rt]=;
}
} void build(int rt,int l,int r){
sum[rt] = add[rt] = ;
if(l == r){ scanf("%lld",&sum[rt]); flag[rt] = (sum[rt]>); return; }
int m = (l+r)>>;
build(lch), build(rch);
push_up(rt);
} void Minus(int rt,int l,int r,int a,int b,int c){
if(a <= l && r <= b){
add[rt] += c; sum[rt] += (r-l+)*c; return;
}
push_down(rt,r-l+);
int m = (l+r)>>;
if( a <= m ) Minus( lch,a,b,c );
if( m < b ) Minus( rch,a,b,c );
push_up(rt);
} void Division(int rt,int l,int r,int a,int b,int c){
if( flag[rt] == ) return;
if(l == r){
if(sum[rt]>) sum[rt] /= (LL)c;
flag[rt] = (sum[rt] > ); return;
}
push_down(rt, r-l+);
int m = (l+r)>>;
if( a <= m ) Division( lch,a,b,c );
if( m < b ) Division( rch,a,b,c );
push_up(rt);
} LL Sum(int rt,int l,int r,int a,int b){
if(a<=l && r<=b) return sum[rt];
push_down(rt,r-l+);
int m=(l+r)>>;
LL res=;
if(a<=m) res+=Sum(lch,a,b);
if(m<b) res+=Sum(rch,a,b);
return res;
} int main(){
int T;
scanf("%d", &T);
for(int Case = ; Case <= T; Case++){
int n, m, a, b, c;
char op[];
scanf("%d%d", &n,&m);
printf("Case %d:\n",Case);
build( , , n );
for(int i = ; i < m; i++){
scanf("%s", op);
if( op[] == 'D' ){
scanf("%d%d%d",&a,&b,&c);
if( c == ) continue;
Division(,,n,a,b,c);
}
else if( op[] == 'M' ){
scanf("%d%d%d",&a,&b,&c);
Minus(,,n,a,b,-c);
}
else{
scanf("%d%d",&a,&b);
LL res = Sum(,,n,a,b);
printf("%lld\n",res);
}
}
puts("");
}
return ;
}
whu 1464 deal with numbers的更多相关文章
- Bnuoj-29359 Deal with numbers 线段树
题目链接:http://www.bnuoj.com/bnuoj/problem_show.php?pid=29359 题意:一个数列,有三种操作: 1.区间[a,b]之间大于零的数整出c. 2.区间[ ...
- [转载]在 JavaScript 中判断“空值”
http://lync.in/check-empty-value-in-javascript/ 有时候我们会遇到这样的情况:在一些前端控件要提交数据到服务器端的数据验证过程中,需要判断提交的数据是否为 ...
- Js判断参数(String,Array,Object)是否为undefined或者值为空
在一些前端控件要提交数据到服务器端的数据验证过程中,需要判断提交的数据是否为空.如果是普通表单的字符串数据,只需要在 trim 后判断 length 即可,而这里需要的数据可以是各种不同的类型,通过 ...
- 【BZOJ1662】[Usaco2006 Nov]Round Numbers 圆环数 数位DP
[BZOJ1662][Usaco2006 Nov]Round Numbers 圆环数 Description 正如你所知,奶牛们没有手指以至于不能玩"石头剪刀布"来任意地决定例如谁 ...
- [POJ1338]Ugly Numbers
[POJ1338]Ugly Numbers 试题描述 Ugly numbers are numbers whose only prime factors are 2, 3 or 5. The sequ ...
- Ugly Numbers
Ugly Numbers Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 21918 Accepted: 9788 Descrip ...
- poj 1338 Ugly Numbers(丑数模拟)
转载请注明出处:viewmode=contents">http://blog.csdn.net/u012860063? viewmode=contents 题目链接:id=1338&q ...
- Ugly Numbers(STL应用)
题目链接:http://poj.org/problem?id=1338 Ugly Numbers Time Limit: 1000MS Memory Limit: 10000K Total Sub ...
- Project Euler 44: Find the smallest pair of pentagonal numbers whose sum and difference is pentagonal.
In Problem 42 we dealt with triangular problems, in Problem 44 of Project Euler we deal with pentago ...
随机推荐
- [itint5]交替字符串
http://www.itint5.com/oj/#17 DP.注意曾经把赋值写成了==,结果出错半天. bool isInterleaving(string &str1, string &a ...
- VO,DTO,DO,PO的划分
实体类(VO,DTO,DO)的划分 经常会接触到VO,DO,DTO的概念,本文从领域建模中的实体划分和项目中的实际应用情况两个角度,对这几个概念进行简析. 得出的主要结论是:在项目应用中,VO对应 ...
- thinkphp 独立分组配置
详见tp官网. 此处为笔记: <?php return array( // 0,为普通分组,1为独立分组 ', // 独立分组目录 'APP_GROUP_PATH' => 'Modules ...
- HeadFirst设计模式之迭代器模式
一. 1.迭代器模式是对遍历集合元素的抽象 2.The Iterator Pattern provides a way to access the elements of an aggregate o ...
- Android:控件GridView的使用
如果是列表(单列多行形式)的使用ListView,如果是多行多列网状形式的优先使用GridView. <?xml version="1.0" encoding="u ...
- JS中访问对象的属性
方式一: 对象名.属性名; 方式二: 对象名["属性名"]; ★注意:方式二中,属性名以字符串的形式出现在方括号中,这意味着通过方式二访问属性的话,可以实现“动态访问对象的 ...
- Java API ——StringBuffer类
1.StringBuffer类概述 1)我们如果对字符串进行拼接操作,每次拼接,都会构建一个新的String对象,既耗时,又浪费空间.而StringBuffer就可以解决这个问题 2)线程安全的可变字 ...
- GCC编译警告和错误
1 error: expected expression before 'else' else之前无表达式. 2 error: lvalue required as left operand of a ...
- ckeditor的配置及使用
一.使用方法:1.在页面<head>中引入ckeditor核心文件ckeditor.js<script type="text/javascript" src=&q ...
- POJ 1269 (直线相交) Intersecting Lines
水题,以前总结的模板还是很好用的. #include <cstdio> #include <cmath> using namespace std; ; int dcmp(dou ...