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 ...
随机推荐
- DVB系统中PCR的生成和PCR校正
http://blog.csdn.net/chenliangming/article/details/3616720 引自<广播电视信息>2008年1月 从数字电视前端系统功能上来讲,传统 ...
- javaweb学习总结(四十五)——监听器(Listener)学习二
一.监听域对象中属性的变更的监听器 域对象中属性的变更的事件监听器就是用来监听 ServletContext, HttpSession, HttpServletRequest 这三个对象中的属性变更信 ...
- 转:Build Your First JavaScript Library
http://net.tutsplus.com/tutorials/javascript-ajax/build-your-first-javascript-library/ Step 1: Creat ...
- CentOS 命令随笔
linux下敲命令时:快速删除当前行已经敲的命令: CTR+U 或者 CTR+/ 快速删除当前行刚输入接近鼠标当前位置的单词:CTR+W 以上在XS ...
- General Ledger Useful SQL Scripts – Oracle Applications 11i
General Ledger Useful SQL Scripts – Oracle Applications 11i Contents GL Set of Books Configuration O ...
- case语句居然还可以这么用的
直接上代码了 // switch case case语句测试.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<ios ...
- java中的log中的用法和小结
Log.logInfo(s.toString());的控制台显示 jog.info的具体用法. import java.io.*; import org.apache.log4j.Logger; im ...
- poj1286Necklace of Beads(ploya定理)
链接 这个东东是新知识 let's 从头学起吧 这篇文库讲的不错 至少把各种概念学了一遍 然后再看此题 共有两种类型的置换 一种是旋转之后相同算一种 一种是翻转之后相同算一种 对于旋转 共有N次置换 ...
- 菜单练习-关机&取消
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<time.h> voi ...
- 【待填坑】bzoj上WC的题解
之前在bzoj上做了几道WC的题目,现在整理一下 bzoj2115 去膜拜莫队的<高斯消元解xor方程组> bzoj2597 LCT维护MST bzoj1758 分数规划+树分治+单调队列 ...