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 ...
随机推荐
- 分享一个快速的Json(反)序列化开源项目 Jil
我们不缺少JSON的序列化库,但我们缺少一个性能非常好的库,这对于网站来说非常重要.今天我发现了Jil. 他是开源的代码: https://github.com/kevin-montrose/Jil ...
- TortoiseGit GitHub 使用指南
TortoiseGit GitHub 使用指南 这个文档讲的还是比较清楚和完整的.需要注意的一点是ssh的方式,取gitHub的URL的时候选取ssh方式. http://www.360doc.co ...
- #ifdef __cplusplus extern "C"
#ifdef __cplusplus extern "C" { #endif //一段代码 #ifdef __cplusplus } #endif首先,__cplusplus是cp ...
- AJAX是什么? AJAX的交互模型(流程)?同步和异步的区别? AJAX跨域的解决办法?
AJAX是什么? AJAX的交互模型(流程)?同步和异步的区别? AJAX跨域的解决办法? 分类: web前端面试题2013-07-20 22:40 630人阅读 评论(0) 收藏 举报 目录(? ...
- Java三大特征之------多态
1.定义 指允许不同类的对象对同一消息做出响应.即同一消息可以根据发送对象的不同而采用多种不同的行为方式. 2.存在条件 2.1存在父子关系 2.2子类中存在重写方法 2.3父类类型的变量指向子类对象 ...
- mvc+ef+oracle环境中报错:ORA-00001: 违反唯一约束条件
分析原因: 在oracle中,主健不能自动生成,不过可以通过“序列”来实现,如果是这样的话,问题很可能就出在“序列”上了: ORACLE表主键ID突然从已经存在的ID值开始自动生成,导致违反主键唯一性 ...
- juery 选择器 选择多个元素
使用,号: $("#goodSource,#mailState") 选择了id为goodSource或者mailState的元素,当两者之间有任何一个有改变时,将会触发该操作. / ...
- BZOJ1937 [Shoi2004]Mst 最小生成树
首先由贪心的想法知道,树边只减不加,非树边只加不减,令$w_i$表示i号边原来的边权,$d_i$表示i号边的改变量 对于一条非树边$j$连接着两个点$x$.$y$,则对于$xy$这条路径上的所有树边$ ...
- CentOS 常用命令大全(2)
系统 # uname -a # 查看内核/操作系统/CPU信息 # head -n 1 /etc/issue # 查看操作系统版本 # cat /proc/cpuinf ...
- C#基础学习文章导航
第一部分:入个门 C#入门篇-1:HelloWorld的类 C#入门篇-2:什么是变量 C#入门篇-3:数据类型及转换 C#入门篇-4:使用运算符 第二部分:流程控制语句 C#入门篇5-1:流程控制语 ...