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的更多相关文章

  1. Bnuoj-29359 Deal with numbers 线段树

    题目链接:http://www.bnuoj.com/bnuoj/problem_show.php?pid=29359 题意:一个数列,有三种操作: 1.区间[a,b]之间大于零的数整出c. 2.区间[ ...

  2. [转载]在 JavaScript 中判断“空值”

    http://lync.in/check-empty-value-in-javascript/ 有时候我们会遇到这样的情况:在一些前端控件要提交数据到服务器端的数据验证过程中,需要判断提交的数据是否为 ...

  3. Js判断参数(String,Array,Object)是否为undefined或者值为空

    在一些前端控件要提交数据到服务器端的数据验证过程中,需要判断提交的数据是否为空.如果是普通表单的字符串数据,只需要在 trim 后判断 length 即可,而这里需要的数据可以是各种不同的类型,通过 ...

  4. 【BZOJ1662】[Usaco2006 Nov]Round Numbers 圆环数 数位DP

    [BZOJ1662][Usaco2006 Nov]Round Numbers 圆环数 Description 正如你所知,奶牛们没有手指以至于不能玩"石头剪刀布"来任意地决定例如谁 ...

  5. [POJ1338]Ugly Numbers

    [POJ1338]Ugly Numbers 试题描述 Ugly numbers are numbers whose only prime factors are 2, 3 or 5. The sequ ...

  6. Ugly Numbers

    Ugly Numbers Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 21918 Accepted: 9788 Descrip ...

  7. poj 1338 Ugly Numbers(丑数模拟)

    转载请注明出处:viewmode=contents">http://blog.csdn.net/u012860063? viewmode=contents 题目链接:id=1338&q ...

  8. Ugly Numbers(STL应用)

    题目链接:http://poj.org/problem?id=1338 Ugly Numbers Time Limit: 1000MS   Memory Limit: 10000K Total Sub ...

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

随机推荐

  1. 李洪强iOS开发之图片拉伸技巧

    纵观移动市场,一款移动app,要想长期在移动市场立足,最起码要包含以下几个要素:实用的功能.极强的用户体验.华丽简洁的外观.华丽外观的背后,少不了美工的辛苦设计,但如果开发人员不懂得怎么合理展示这些设 ...

  2. 借助CAD在Altium Designer中定义不规则PCB外形

    借助绘图软件CAD在Altium Designer中定义不规则PCB外形. 工具/原料 CAD2007 Altium Designer2015 方法/步骤 借助CAD绘制的不规则外形,保存成DXF格式 ...

  3. 在Oracle 11g r2中,EXP无法导出个别空的表

    在Oracle 11g r2中,发现传统的exp无法不能导出空的表,上网搜索了一下找到了原因. 主要是Oracle 11g 新增了一个参数:deferred_segment_creation,含义是段 ...

  4. FPGA中latency与delay概念的区别

    2013-06-17 21:09:26 最近学习流水线以及状态机,总遇到注入加入寄存器可以分割组合逻辑,从而提高电路的运行频率的说法:还有流水线可以提高速度的说法,刚开始很是疑惑,觉得流水线的方法,输 ...

  5. 【HDOJ】3948 The Number of Palindromes

    后缀数组求不重复回文子串数目.注意dp数组. /* 3948 */ #include <iostream> #include <sstream> #include <st ...

  6. Android开发之内容观察者

    内容观察者: 当关注应用的数据库数据改变时,内容提供者会发出通知,在内容提供者的uri上注册一个内容观察者,就可以收到数据改变的通知 实现步骤: 1.假如是自定义的ContentProvider,需要 ...

  7. python中的commands模块

    commands模块用于调用shell命令 有3中方法: commands.getstatus()   返回执行状态 commands.getoutput()   返回执行结果 commands.ge ...

  8. 通过ngx-lua来统计Nginx上的虚拟主机性能数据

    Web server调研分析 Filed under: Web Server — cmpan @ 2012-10-29 20:38:34 摘要 简单可依赖的架构首先需要有一个简单可依赖的前端WebSe ...

  9. windows官方多语言方案

    编写 Win32 多语言用户界面应用程序 Windows 2000 针对全球市场制定了新的增强支持标准,提供了许多国际化功能,例如完全支持 Unicode.预设支持数百种语言以及用于从右向左语言的镜像 ...

  10. 软件测试Web数据分析工具HttpWatch安装

    1.下载破解版:http://www.pc6.com/softview/SoftView_13845.html 2.安装时引入授权文件并汉化: 3.打开IE9,菜单:管理加载项->工具栏和扩展, ...