HDU.1689 Just a Hook (线段树 区间替换 区间总和)
来源:互联网 发布:平顶山java培训班经验 编辑:程序博客网 时间:2024/06/06 08:59
HDU.1689 Just a Hook (线段树 区间替换 区间总和)
题意分析
一开始叶子节点均为1,操作为将[L,R]区间全部替换成C,求总区间[1,N]和
线段树维护区间和 。
建树的时候初始化为1,更新区间时候放懒惰标记,下推标记更新区间和。
由于是替换,不是累加,所以更新的时候不是+=,而是直接=。
注意这点就可以了,然后就是多组数据注意memset,因为这个WA几发。
代码总览
#include <bits/stdc++.h>#define maxn 200010#define ls l,m,rt<<1#define rs m+1,r,rt<<1|1int Sum[maxn<<2],Lazy[maxn<<2];int A[maxn];void PushUp(int rt){Sum[rt]=Sum[rt<<1]+Sum[rt<<1|1];}int N,Q,lq,rq,val;void Build(int l,int r,int rt){ if(l==r) { Sum[rt] = 1; return; } int m=(l+r)>>1; Build(l,m,rt<<1); Build(m+1,r,rt<<1|1); PushUp(rt);}void UpdatePoint(int L,int C,int l,int r,int rt){ if(l==r){ Sum[rt]+=C; return; } int m=(l+r)>>1; if(L <= m) UpdatePoint(L,C,l,m,rt<<1); else UpdatePoint(L,C,m+1,r,rt<<1|1); PushUp(rt);}void PushDown(int rt,int ln,int rn){ if(Lazy[rt]){ Lazy[rt<<1] = Lazy[rt]; Lazy[rt<<1|1] = Lazy[rt]; Sum[rt<<1] = Lazy[rt]*ln; Sum[rt<<1|1] = Lazy[rt]*rn; Lazy[rt]=0; }}void UpdateInterval(int L,int R,int C,int l,int r,int rt){ if(L <= l && r <= R){ Sum[rt] = C*(r-l+1); Lazy[rt] = C; return ; } int m=(l+r)>>1; PushDown(rt,m-l+1,r-m); if(L <= m) UpdateInterval(L,R,C,l,m,rt<<1); if(R > m) UpdateInterval(L,R,C,m+1,r,rt<<1|1); PushUp(rt);}int Query(int L,int R,int l,int r,int rt){ if(L <= l && r <= R){ return Sum[rt]; } int m = (l+r)>>1; PushDown(rt,m-l+1,r-m); int ANS = 0; if(L <= m) ANS += Query(L,R,l,m,rt<<1); if(R > m) ANS += Query(L,R,m+1,r,rt<<1|1); return ANS;}int main(){ //freopen("in.txt","r",stdin); int TestCase; scanf("%d",&TestCase); for(int i = 1;i<=TestCase;++i){ scanf("%d",&N); memset(Lazy,0,sizeof Lazy); Build(1,N,1); scanf("%d",&Q); for(int j = 0;j<Q;++j){ scanf("%d %d %d",&lq,&rq,&val); UpdateInterval(lq,rq,val,1,N,1); } int ans =Query(1,N,1,N,1); printf("Case %d: The total value of the hook is %d.\n",i,ans); } return 0;}
阅读全文
1 0
- HDU.1689 Just a Hook (线段树 区间替换 区间总和)
- HDU 1698 Just a Hook(线段树区间替换)
- HDU 1698 Just a Hook(线段树区间替换)
- HDU 1698 Just a Hook(线段树区间替换)
- HDU 1698 Just a Hook【线段树】区间修改,查询总和
- 线段树系列-hdu-1698-Just a Hook-区间修改求总和
- HDU 1689 Just a Hook 线段树区间更新求和
- HDU 1689 Just a Hook (线段树, 区间修改)
- hdu1698 Just a Hook 线段树延迟标记区间更新 求加权区间总和
- HDU 1698 JUST a hook (线段树 成段替换 区间求和 延迟标记)
- HDU 1698 Just a Hook 线段树区间更新
- hdu 1698 Just a Hook (线段树区间操作,)
- 线段树(区间更新) hdu-1698-Just a Hook
- hdu 1698(区间更新线段树)Just a Hook
- hdu 1698 Just a Hook(线段树-区间更新)
- hdu 1698 Just a Hook 线段树区间更新
- HDU 1698 Just A Hook (线段树,区间修改)
- HDU - 1698 Just a Hook (线段树区间修改)
- 【Unity+Hololens开发】识别二维码
- UDP通信
- C++ struct 与class
- 【nginx-rtmp】06、指令(Directives)之 访问控制(Access)
- C++函数
- HDU.1689 Just a Hook (线段树 区间替换 区间总和)
- 哪类的运营岗位适合我?
- eclipse 搭建环境时workspace注意点
- 12864.c
- ffmpeg获取码流信息
- 深入理解Java集合框架系列-第一章Java对象的hashCode哈希码
- 【nginx-rtmp】07、指令(Directives)之 执行命令(Exec)
- 百度编辑器UEditor关闭css,js,html过滤
- 【初学者视角】线性回归实践