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. jquery ajax请求方式与提示用户正在处理请稍等,等待数据返回时loading的显示

    1.jquery ajax请求方式与提示用户正在处理请稍等 为了提高用户体验度,我们通常会给出 “正在处理,请稍等!”诸如此类的提示.我们可通过设置$.ajax()下的参数beforeSend()来实 ...

  2. 一些git命令

    git push --set-upstream origin release  强制将add的数据提交到  release分支.

  3. jQuery给同一个元素两个点击事件

    $(".course-form .course-start img").each(function(i) { $(this).toggle(function(){ $(this). ...

  4. shell中的数组

    在shell脚本中,除了通常使用的shell变量外,有时也需要复杂的数据结构去实现一些功能,这里简单说明一下shell数组的使用方法: 初始化方法 _array_name[0]="rando ...

  5. treap codevs 4543普通平衡树

    #include<cstdio>#include<ctime>#include<cstdlib>struct shu{ int l,r,sum1,zhi,dui,s ...

  6. java日期的运用(DateUtils工具类)

    public static void main(String[] args) { Date now = new Date(); SimpleDateFormat sd = new SimpleDate ...

  7. dedecms5.7安装百度(ueditor)编辑器的方法

    第一步:下载相对应编辑器的版本 第二步:修改inc_func_funcAdmin.php文件 打开include下的inc文件夹内的inc_func_funcAdmin.php找到184行,贴入以下代 ...

  8. 踏着前人的脚印学hadoop——ipc中的Server

    1.An abstract IPC service.  IPC calls take a single {@link Writable} as a parameter, and return a {@ ...

  9. RPI学习--环境搭建_串口连接

    有两种, 一种是通过MAX2323芯片连接的串口,要接VCC为芯片供电. 另一种是通过PL2302芯片连接的USB,可不接VCC,用电脑USB口为芯片供电. 下面以通过MAX2323方式为例. 1,V ...

  10. arm裸机驱动错误总结

    错误001: