kb-07线段树-05-区间整体修改查询;(水)
2015-05-30 23:37
330 查看
/* */ #include<iostream> #include<cstring> #include<cstdio> using namespace std; struct P { int l,r,value; int add; }tr[400005]; void Pushup(int rt) { tr[rt].value=tr[rt<<1].value+tr[rt<<1|1].value; } void build(int rt,int l,int r) { tr[rt].l=l; tr[rt].r=r; tr[rt].add=0; if(l==r) { tr[rt].value=1; return ; } int mid=(l+r)/2; build(rt<<1,l,mid); build(rt<<1|1,mid+1,r); Pushup(rt); } /* 区间修改,整体改成一个数,所以只需要记录这个数就可以了,区间的和可以用这个数乘以区间长度来求; */ void Pushdown(int rt) { if(tr[rt].add<=0) return ; tr[rt<<1].value=tr[rt].add*(tr[rt<<1].r-tr[rt<<1].l+1); tr[rt<<1|1].value=tr[rt].add*(tr[rt<<1|1].r-tr[rt<<1|1].l+1); tr[rt<<1].add=tr[rt].add; tr[rt<<1|1].add=tr[rt].add; tr[rt].add=0; } void Update(int rt,int l,int r,int begin,int end,int x) { if(begin<=l&&end>=r) { tr[rt].add=x; tr[rt].value=x*(r-l+1);//把区间更新成x return ; } Pushdown(rt); if(begin <=tr[rt<<1].r) { Update(rt<<1,l,tr[rt<<1].r,begin,end,x); } if(end >=tr[rt<<1|1].l) { Update(rt<<1|1,tr[rt<<1|1].l,r,begin,end,x); } Pushup(rt);//区间下面的值发生变化,所以要pushup } int main() { int T,k=1; scanf("%d",&T); while(T--) { int n,q; scanf("%d%d",&n,&q); memset(tr,0,sizeof(tr)); build(1,1,n); for(int i=0;i<q;i++) { int ll,rr,v; scanf("%d%d%d",&ll,&rr,&v); Update(1,1,n,ll,rr,v); // for(int j=1;j<=25;j++) // printf("%d:%d\n",j,tr[j].value); } int ans=tr[1].value; printf("Case %d: The total value of the hook is %d.\n",k++,ans); } return 0; }
相关文章推荐
- 最新最准确各大搜索引擎蜘蛛名称2014-4-15 10:02:52
- Hadoop1.x目录结构及Eclipse导入Hadoop源码项目
- 上传列表模板,并使用列表模板创建列表
- 基于STM32的函数信号发生器设计(下:软件设计)
- Struts2+Ajax实现检测用户名是否唯一
- IOS的控制器
- ns3的基础学习
- Android四大组件之一之service
- HDU2955
- iOS多线程-------线程的状态
- UG为何不能够直接使用空间曲线构建实体?
- Bootstrap 学习笔记 之代码和表格 (3 day)
- 使用buildroot编译和使用开发板上的gcc[native gcc]
- 一些自学的html/javascript代码(setTimeout, alert, 定格动画)
- WF 绘制图片的部分
- 使用matlab版本计算HOG 最为简单的计算方法 使用 vlfeat
- Python通过文件头来判断文件的真实类型
- SQLi Labs【level 1-5】
- 飞机大战-GameGoods商品的实现
- 使用命令部署wsp包,并将其部署到不同的web应用程序