HDU-1698Just a Hook-线段树成段更新
2016-07-20 14:48
351 查看
#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> using namespace std; struct s{ int i,j,k,sum; }a[411111]; void pushdown(int r,int m) { if(a[r].k) { int k=a[r].k; a[r<<1].k=a[r<<1|1].k=k; a[r<<1].sum=k*(m-m/2); a[r<<1|1].sum=k*(m/2); a[r].k=0; } } void build(int r,int i,int j) { a[r].i=i; a[r].j=j; a[r].k=0; a[r].sum=1; if(i==j) { return ; } int k=(i+j)/2; build(r<<1,i,k); build(r<<1|1,k+1,j); a[r].sum=a[r<<1].sum+a[r<<1|1].sum; } void update(int r,int i,int j,int value) { if(a[r].i>=i&&a[r].j<=j) { a[r].k=value; a[r].sum=value*(a[r].j-a[r].i+1); return ; } pushdown(r,a[r].j-a[r].i+1); int k=(a[r].i+a[r].j)/2; if(j<=k) update(r<<1,i,j,value); else if(i>k) update(r<<1|1,i,j,value); else { update(r<<1,i,j,value); update(r<<1|1,i,j,value); } a[r].sum=a[r<<1].sum+a[r<<1|1].sum; } int query(int r,int i,int j) { if(a[r].i>=i&&a[r].j<=j) { return a[r].sum; } pushdown(r,a[r].j-a[r].i+1); int k=(a[r].i+a[r].j)/2; if(j<=k) return query(r<<1,i,j); else if(i>k) return query(r<<1|1,i,j); return query(r<<1,i,j)+query(r<<1|1,i,j); } int main() { int T , n , m; scanf("%d",&T); for (int cas = 1 ; cas <= T ; cas ++) { scanf("%d%d",&n,&m); build(1 , 1 , n); while (m --) { int a , b , c; scanf("%d%d%d",&a,&b,&c); update(1,a,b,c); } printf("Case %d: The total value of the hook is %d.\n",cas , query(1,1,n)); } return 0; }
相关文章推荐
- MySQL为什么会有一大堆在Sleep的进程? 【转】
- 二叉树入门
- 面向对象编程三大特性之一--封装
- 枚举
- Function Run Fun
- Linux下Redis主从复制(master-slave)配置
- Eclipse打包带mysql的java程序
- 今天
- MySQL 获得当前日期时间 函数
- 暑假训练赛20160720
- httpwebrequest 服务器提交了协议冲突. section=responsestatusline
- Struts2 学习笔记
- canvas arcTo()用法详解
- 用libmp4v2录制h264和aac rtp流为mp4文件
- Codeforces Round #363 (Div. 2)A Launch of Collider
- Html之 textarea 控件
- linux下利用fork()函数创建进程
- Android:interpolator用法
- vim基础命令
- 对字符串提取以及运算操作处理