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 ...
随机推荐
- live555源码研究(一)------live555MediaServer的启动过程和基本类图
live555MediaServer.cpp就是live555服务器启动的过程. 一.启动过程 1,构造运行环境,运行环境包括了TaskScheduler 2,构造鉴权数据,也就是登陆的用户名和密码等 ...
- Servlet课程0426(十二)Servlet MV模式下用户登录及查看用户表中所有用户
Welcome.java //登录界面 package com.tsinghua; import javax.servlet.http.*; import java.io.*; import java ...
- SQLite入门与分析(一)---简介
写在前面:出于项目的需要,最近打算对SQLite的内核进行一个完整的剖析,在此希望和对SQLite有兴趣的一起交流.我知道,这是一个漫长的过程,就像曾经去读Linux内核一样,这个过程也将是辛苦的,但 ...
- Android:android:gravity 和 android:layout_Gravity 的区别
LinearLayout有两个非常相似的属性:android:gravity与android:layout_gravity. android:gravity 属性是对该view中内容的限定 andro ...
- Git教程之标签管理
发布一个版本时,我们通常先在版本库中打一个标签,这样,就唯一确定了打标签时刻的版本.将来无论什么时候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来.所以,标签也是版本库的一个快照.Git的 ...
- JS计算字符串所占字节数
最近项目有个需求要用js计算一串字符串写入到localStorage里所占的内存,众所周知的,js是使用Unicode编码的.而Unicode的实现有N种,其中用的最多的就是UTF-8和UTF-16. ...
- 【HDOJ】4297 One and One Story
综合性很强的题目.存在环,可以用tarjan处理,然后需要求LCA.并查集+RMQ可以搞.非常不错的题目. /* 4297 */ #include <iostream> #include ...
- memcpy与memmove区别
头文件:#include <string.h> memmove() 用来复制内存内容,其原型为: void * memmove(void *dest, const void *src ...
- BZOJ_1021_[SHOI2008]_Debt循环的债务_(DP)
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1021 三个人相互欠钱,给出他们每个人各种面额的钞票各有多少张,求最少需要传递多少张钞票才能把账 ...
- linux SPI bus demo hacking
/********************************************************************** * linux SPI bus demo hacking ...