UVA - 11992
来源:互联网 发布:架子鼓软件哪个好 编辑:程序博客网 时间:2024/05/22 08:18
自写线段树,难点既每次节点的维护pushDOWN函数, add && set#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;#define lson l,m,rt<<1#define rson m+1,r,(rt<<1|1)#define INF 1000000100const int maxn = 1000010;int sum[21][maxn<<2],MAX[21][maxn<<2],MIN[21][maxn<<2],add[21][maxn<<2],val[21][maxn<<2];void pushUP(int l,int r,int rt,int i){sum[i][rt]=sum[i][rt<<1]+sum[i][rt<<1|1];MIN[i][rt]=min(MIN[i][rt<<1],MIN[i][rt<<1|1]);MAX[i][rt]=max(MAX[i][rt<<1],MAX[i][rt<<1|1]);}void setpushDOWN(int l,int r,int rt,int m,int i){if(l==r){ val[i][rt]=INF; return ;}val[i][rt<<1]=val[i][rt<<1|1]=val[i][rt];sum[i][rt<<1]=(m-(m>>1))*val[i][rt];sum[i][rt<<1|1]=((m>>1))*val[i][rt];MAX[i][rt<<1]=val[i][rt];MAX[i][rt<<1|1]=val[i][rt];MIN[i][rt<<1]=val[i][rt];MIN[i][rt<<1|1]=val[i][rt];add[i][rt<<1]=add[i][rt<<1|1]=INF;val[i][rt]=INF;}void addpushDOWN(int l,int r,int rt,int M,int i){if(l==r){ add[i][rt]=INF; return ;}int m=(l+r)>>1;if(val[i][rt<<1]!=INF){ setpushDOWN(lson,m-l+1,i); val[i][rt<<1]=INF; add[i][rt<<1]=add[i][rt];}else{ if(add[i][rt<<1]!=INF) add[i][rt<<1]+=add[i][rt]; else add[i][rt<<1]=add[i][rt];}if(val[i][rt<<1|1]!=INF){ setpushDOWN(rson,r-m,i); val[i][rt<<1|1]=INF; add[i][rt<<1|1]=add[i][rt];}else{ if(add[i][rt<<1|1]!=INF) add[i][rt<<1|1]+=add[i][rt]; else add[i][rt<<1|1]=add[i][rt];}sum[i][rt<<1]+=(M-(M>>1))*add[i][rt];sum[i][rt<<1|1]+=((M>>1))*add[i][rt];MAX[i][rt<<1]+=add[i][rt];MAX[i][rt<<1|1]+=add[i][rt];MIN[i][rt<<1]+=add[i][rt];MIN[i][rt<<1|1]+=add[i][rt];add[i][rt]=INF;}void pushDOWN(int l,int r,int rt,int m,int i){if(val[i][rt]!=INF){ setpushDOWN(l,r,rt,m,i);}else if(add[i][rt]!=INF){ addpushDOWN(l,r,rt,m,i);}}void build(int l,int r,int rt,int i){add[i][rt]=val[i][rt]=INF;if(l==r){ sum[i][rt]=MIN[i][rt]=MAX[i][rt]=0; return ;}int m=(l+r)>>1;build(lson,i);build(rson,i);pushUP(l,r,rt,i);}int ql,qr,addv;void update(int l,int r,int rt,int i){pushDOWN(l,r,rt,r-l+1,i);if(ql<=l&&r<=qr){ add[i][rt]=addv; sum[i][rt]+=(r-l+1)*addv; MIN[i][rt]+=addv; MAX[i][rt]+=addv; return ;}int m=(l+r)>>1;if(ql<=m) update(lson,i);if(qr >m) update(rson,i);pushUP(l,r,rt,i);}int value;void Update(int l,int r,int rt,int i){pushDOWN(l,r,rt,r-l+1,i);if(ql<=l&&r<=qr){ val[i][rt]=value; sum[i][rt]=(r-l+1)*value; MIN[i][rt]=value; MAX[i][rt]=value; return ;}int m=(l+r)>>1;if(ql<=m) Update(lson,i);if(qr >m) Update(rson,i);pushUP(l,r,rt,i);}int _sum,_min,_max;void query(int l,int r,int rt,int i){pushDOWN(l,r,rt,r-l+1,i);if(ql<=l&&r<=qr){ _min=min(_min,MIN[i][rt]); _max=max(_max,MAX[i][rt]); _sum+=sum[i][rt]; return ;}int m=(l+r)>>1;if(ql<=m) query(lson,i);if(qr >m) query(rson,i);}void Show(int l,int r,int rt,int i){if(l==r){ cout<<"L-->"<<" "<<l<<" "<<"R-->"<<" "<<r<<" "<<add[i][rt]<<" "<<sum[i][rt]<<endl; return ;}int m=(l+r)>>1;Show(lson,i);Show(rson,i);cout<<"L-->"<<" "<<l<<" "<<"R-->"<<" "<<r<<" "<<add[i][rt]<<" "<<sum[i][rt]<<endl;}int r,c,Q;int read(){for(int i=1;i<=r;i++) build(1,c,1,i);}int main(){ while(scanf("%d %d %d",&r,&c,&Q)!=EOF){ read(); while(Q--){ int cmd; int x1,x2,y1,y2; scanf("%d %d %d %d %d",&cmd,&x1,&y1,&x2,&y2); if(cmd==1){ scanf("%d",&addv); ql=y1; qr=y2; for(int i=x1;i<=x2;i++) update(1,c,1,i); } else if(cmd==2){ scanf("%d",&value); ql=y1; qr=y2; for(int i=x1;i<=x2;i++) Update(1,c,1,i); } else { _sum=0; _min=INF; _max=-INF; ql=y1; qr=y2; for(int i=x1;i<=x2;i++) query(1,c,1,i); printf("%d %d %d\n",_sum,_min,_max); } //Show(1,c,1,1); cout<<"_______________\n"; } // void show(); show(); }return 0;}void show(){for(int i=1;i<=r;i++){ for(int j=1;j<=c;j++){ ql=j,qr=j; _sum=0; _min=INF; _max=-INF; query(1,c,1,i); cout<<_sum<<" "; } cout<<endl;}cout<<"_______________\n";}
0 0
- UVA 11992
- UVA 11992
- UVa 11992
- Uva 11992
- UVA - 11992
- UVA 11992
- uva 11992(线段树)
- uva
- UVA
- UVA
- UVA
- uva
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- ZOJ-1708
- hdu 1712 ACboy needs your help(分组背包入门)
- 剑指Offer:面试题40 数组中只出现一次的数字
- 苹果种植成为群众增收致富有效途径
- Linux中单引号(''),双引号("")与反单引号(``)的用法与区别
- UVA - 11992
- Android开发之反编译与防止反编译
- java学习之---多线程
- c++笔试题
- ruby连接mysql数据库
- 剑指Offer:面试题41 和为s的两个数字
- 浅谈大型web系统架构
- 教你6步定制你的Ubuntu桌面
- 剑指Offer:面试题42 反转单词顺序