hdu1198 Just a Hook 线段树区间赋值
2016-01-09 11:21
281 查看
继续补线段树>_<。一句话题意:多组数据,区间赋值修改,最后求总和。线段树lazy tag直接上:
AC代码如下:
by lych
2016.1.9
AC代码如下:
#include<iostream> #include<cstdio> #include<cstring> #define N 500005 using namespace std; int n,m,c [2],sum ,val ; int read(){ int x=0; char ch=getchar(); while (ch<'0' || ch>'9') ch=getchar(); while (ch>='0' && ch<='9'){ x=x*10+ch-'0'; ch=getchar(); } return x; } void pushdown(int k){ if (val[k]!=-1){ int l=c[k][0],r=c[k][1],mid=(l+r)>>1; val[k<<1]=val[k<<1|1]=val[k]; sum[k<<1]=val[k]*(mid-l+1); sum[k<<1|1]=val[k]*(r-mid); val[k]=-1; } } void build(int k,int x,int y){ c[k][0]=x; c[k][1]=y; val[k]=-1; if (x==y){ sum[k]=1; return; } int mid=(x+y)>>1; build(k<<1,x,mid); build(k<<1|1,mid+1,y); sum[k]=sum[k<<1]+sum[k<<1|1]; } void mdy(int k,int x,int y,int v){ int l=c[k][0],r=c[k][1],mid=(l+r)>>1; if (x==l && y==r){ val[k]=v; sum[k]=v*(r-l+1); return; } pushdown(k); if (y<=mid) mdy(k<<1,x,y,v); else if (x>mid) mdy(k<<1|1,x,y,v); else{ mdy(k<<1,x,mid,v); mdy(k<<1|1,mid+1,y,v); } sum[k]=sum[k<<1]+sum[k<<1|1]; } int main(){ int cas=read(),ri; for (ri=1; ri<=cas; ri++){ n=read(); m=read(); build(1,1,n); while (m--){ int x=read(),y=read(),z=read(); mdy(1,x,y,z); } printf("Case %d: The total value of the hook is %d.\n",ri,sum[1]); } return 0; }
by lych
2016.1.9
相关文章推荐
- eclipse插件maven的使用,web打包成WAR,tomcat下直接运行
- UIImage与UIColor互转
- 【已解决】PIL安装异常 “python version 2.7 required, which was not found in the registry.”
- 可变字典 添加 删除 遍历
- web页面布局思想
- 再来20 个免费的Bootstrap 的后台管理模板
- Android如何缩放应用中的字体大小
- Binder与Service 通信机制详解四 (源码分析AIDL工作机制)
- LinkedIn是如何优化Kafka的
- 【转载】LinkedIn是如何优化Kafka的
- Android中插件开发篇之----应用换肤原理解析
- R 语言绘图005-函数par()详解
- 好代码的科学定义
- 简单图像运算
- CDI进阶第一步 CDI拦截器
- MFC中ListControl控件的使用
- phonegap安装说明
- 在WEB项目中调用QQ通讯组件打开QQ聊天界面
- 施用 maven shade plugin 解决 jar 或类的多版本冲突
- js之静态方法与实例方法