HDU 5828(线段树)
Problem Rikka with Sequence
题目大意
维护一个序列,支持三种操作。
操作1:区间加。 操作二:区间开根号(向下取整)。 操作3:区间求和。
解题分析
可以发现经过若干次操作后,整些区间内的数会趋向于相同。
可以再开一个标记,表示这个区间内的数是否相同,这样可以优化一下区间开根号的复杂度。
然后就卡过去了~~
Pushdown的时候要注意不要把一个lazy标记往下传两次。
参考程序
#include <cstdio>
#include <cmath> #define maxn 200008
#define lson l , m , rt << 1
#define rson m+1 , r , rt << 1 | 1
#define eps 1e-8
long long sum[maxn << ],lazy[maxn << ];
long long tag[maxn << ];
int n; void Pushup(int rt){
sum[rt] = sum[rt << ] + sum[rt << | ];
if (tag[rt << ] == tag[rt << | ]) tag[rt]=tag[rt << ]; else tag[rt] = ;
} void Pushdown(int rt,int m){
if (tag[rt]){
tag[rt << ] = tag[rt];
tag[rt << | ] = tag[rt];
sum[rt << ] = tag[rt] * (m-m/);
sum[rt << | ] = tag[rt] * (m/);
lazy[rt]=;
}
if (lazy[rt]) {
lazy[rt << ] += lazy[rt];
lazy[rt << | ] += lazy[rt];
sum[rt << ] += lazy[rt] * (m - m / );
sum[rt << | ] += lazy[rt] * (m / );
if (tag[rt << ]) tag[rt << ] += lazy[rt];
if (tag[rt << | ]) tag[rt << | ] += lazy[rt];
lazy[rt] = ;
}
} void Build(int l,int r,int rt){
lazy[rt] = ;
tag[rt] = ;
if (l==r) {
scanf("%d",&sum[rt]);
tag[rt]=sum[rt];
return;
}
int m = (l + r) >> ;
Build(lson);
Build(rson);
Pushup(rt);
} void Update(int L,int R,int val,int l,int r,int rt){
if (L <= l && r <= R) {
sum[rt] += 1ll*(r - l + ) * val;
lazy[rt] += val;
if (tag[rt]) tag[rt]+=val;
return;
}
Pushdown(rt,r - l + );
int m = (l + r) >> ;
if (L <= m) Update(L,R,val,lson);
if (m < R) Update(L,R,val,rson);
Pushup(rt);
} void Update_2(int L,int R,int l,int r,int rt){
if (L<=l && r<=R && tag[rt]){
tag[rt] = (long long)(sqrt(tag[rt])+eps);
sum[rt] = 1ll*tag[rt] * (r - l + );
return;
}
Pushdown(rt,r - l + );
int m = (l + r) >> ;
if (L <= m) Update_2(L,R,lson);
if (m < R) Update_2(L,R,rson);
Pushup(rt);
} long long Query(int L,int R,int l,int r,int rt){
if (L <= l && r <= R) {
return sum[rt];
}
Pushdown(rt,r - l + );
int m = (l + r) >> ;
long long res = ;
if (L <= m) res += Query(L,R,lson);
if (m < R) res += Query(L,R,rson);
return res;
} int main() {
int T;
scanf("%d",&T);
while (T--){
int Q;
scanf("%d %d",&n,&Q);
Build(,n,);
while (Q--) {
int x,y,z,w;
scanf("%d",&w);
if (w==) {
scanf("%d%d%d",&x,&y,&z);
Update(x,y,z,,n,);
}
if (w==){
scanf("%d%d",&x,&y);
Update_2(x,y,,n,);
}
if (w==){
scanf("%d%d",&x,&y);
printf("%I64d\n",Query(x,y,,n,));
}
}
}
}
HDU 5828(线段树)的更多相关文章
- hdu 5877 线段树(2016 ACM/ICPC Asia Regional Dalian Online)
Weak Pair Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total ...
- hdu 3974 线段树 将树弄到区间上
Assign the task Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- hdu 3436 线段树 一顿操作
Queue-jumpers Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) To ...
- hdu 3397 线段树双标记
Sequence operation Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- hdu 4578 线段树(标记处理)
Transformation Time Limit: 15000/8000 MS (Java/Others) Memory Limit: 65535/65536 K (Java/Others) ...
- hdu 4533 线段树(问题转化+)
威威猫系列故事——晒被子 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Tot ...
- hdu 2871 线段树(各种操作)
Memory Control Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
- hdu 4052 线段树扫描线、奇特处理
Adding New Machine Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- hdu 1542 线段树扫描(面积)
Atlantis Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Su ...
- hdu 1828 线段树扫描线(周长)
Picture Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...
随机推荐
- Android MotionEvent事件响应机制
在android中,事件主要包括点击.长按.拖曳.滑动等操作,这些构成了Android的事件响应,总体来说,所有的事件都由如下三个部分作为基础构成: 按下(action_down),移动(action ...
- SQL Server数据库(高级查询)
高级查询 1.连接查询 有外键关系的两张表,通过关系一次查询两张表 (1)select * from 表名,表名 --- 直接使用出现笛卡尔积,两个表数据一一对应,查询出的结果数目是两个表的行的乘积, ...
- linux命令备份
sort -t $'\t' gcc版本查看 gcc -v 红帽版本查看 cat /etc/redhat-release Linux Core Version cat /proc/version
- 转:mysql 创建一个用户,指定一个数据库
转自:http://blog.sina.com.cn/s/blog_8c2525390101h0dv.html mysql 创建一个用户 hail,密码 hail,指定一个数据库 haildb 给 h ...
- jdk、jre、jvm的关系
JDK里面的工具也是用JAVA编写的,它们本身运行的时候也需要一套JRE,如C:\Program Files\Java\jdk1.5.x\目录下的JRE.而C:\Program Files\Java\ ...
- node.js+WebStorm路径问题
目录路径 :A文件夹下有B.C文件夹和app.js文件.B文件夹下有webserver.js文件等. A B webserver.js ...... C ...... app.js WebStorm配 ...
- Android 解压html压缩数据
public static String unzipHTML(String s){ int endPos = s.indexOf("\r\n\r\n"); if(endPos< ...
- 仿淘宝js图片切换
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- https://docs.mongodb.org/manual/reference/operator/aggregation/unwind/#examples
https://docs.mongodb.org/manual/reference/operator/aggregation/unwind/#examples http://www.clusterdb ...
- PS通道抠图总结
看了那么多的通道抠图,总结几点就是 1.你要有很强的色彩意识,怎样调节对比色等才能增加主体和背景的色差 2.流水步骤 Ctrl+J复制背景图层 调整主体和背景的色差 进入通道面板,找到主体和背景对比最 ...