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(线段树)的更多相关文章

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

  2. hdu 3974 线段树 将树弄到区间上

    Assign the task Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  3. hdu 3436 线段树 一顿操作

    Queue-jumpers Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) To ...

  4. hdu 3397 线段树双标记

    Sequence operation Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  5. hdu 4578 线段树(标记处理)

    Transformation Time Limit: 15000/8000 MS (Java/Others)    Memory Limit: 65535/65536 K (Java/Others) ...

  6. hdu 4533 线段树(问题转化+)

    威威猫系列故事——晒被子 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Tot ...

  7. hdu 2871 线段树(各种操作)

    Memory Control Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  8. hdu 4052 线段树扫描线、奇特处理

    Adding New Machine Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  9. hdu 1542 线段树扫描(面积)

    Atlantis Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Su ...

  10. hdu 1828 线段树扫描线(周长)

    Picture Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

随机推荐

  1. Java 多线程 —— synchronized关键字

    java 多线程 目录: Java 多线程——基础知识 Java 多线程 —— synchronized关键字 java 多线程——一个定时调度的例子 java 多线程——quartz 定时调度的例子 ...

  2. python获取文件的内容

  3. GPOR

    [tengzhenzhen15@lu01 gpor]$ for ((i=0; i<=19; i++)) do ./gpor -S 0.4 X4058_300_gpor/mytask_train. ...

  4. 使用openssl库实现RSA、AES数据加密

         openssl是可以很方便加密解密的库,可以使用它来对需要在网络中传输的数据加密.可以使用非对称加密:公钥加密,私钥解密.openssl提供了对RSA的支持,但RSA存在计算效率低的问题,所 ...

  5. qt 提高ui响应度

    如何使Qt 平台中的GUI保持响应流畅?一般来说耗时较长的操作,分为计算密集型操作和IO密集型操作,对于这两类操作如何提高响应速度. 而从操作的本质上来说,操作又可分为不可分解操作,如在第三方库中耗时 ...

  6. mysqldump使用语法

    复制代码 代码如下: mysqldump -u user -p db tab1 tab2 > db.sql   恢复 复制代码 代码如下: mysql -u user -p db < db ...

  7. Assert断言测试

    assert编写代码时,我们总是会做出一些假设,断言就是用于在代码中捕捉这些假设,可以将断言看作是异常处理的一种高级形式.断言表示为一些布尔表达式,程序员相信在程序中的某个特定点该表达式值为真.可以在 ...

  8. 李明杰视频 SVN

    李明杰视频 SVN 就10-12使用技术SVN 源代码会引发哪些问题? 无法后悔:做错一个操作 版本备份:费控件,费时间 版本混乱:因版本备份太多造成混乱 代码冲突:多人操作同一文件 强烈建议 使用源 ...

  9. Spring学习笔记之整合hibernate

    1.web.xml里边要配置好对应的springxml的路径 <context-param> <param-name>contextConfigLocation</par ...

  10. UITextView实现图文混排效果

    用UITextView实现图文混排效果的展示,首先要禁用UITextView的编辑功能,将属性editable设置为NO 1.首先创建一个NSTextAttachment对象,这个对象有一个image ...