您的位置:首页 > 运维架构

UVA 11992 Fast Matrix Operations

2014-08-06 11:52 483 查看
线段树

#include <iostream>
using namespace std;

const int maxn = 1000005;
const int INF = 1000000009;

struct node {
int sum,ma,mi;
int addv,setv;
void init (int nsum,int nma,int nmi,int naddv,int nsetv){
sum=nsum;ma=nma;mi=nmi;
addv=naddv;setv=nsetv;
}
}tree[30][maxn*2];

int r,c,m;

void init (){
for (int i=1;i<=r;i++){
for (int j=1;j<=c*2;j++){
tree[i][j].init (0,0,0,0,-1);
}
tree[i][1].setv=0;
}
}

//int sum[30][maxn],ma[30][maxn],mi[30][maxn];
//int addv[30][maxn],setv[30][maxn];

void maintain (int o,int l,int r,int i){
int lc=o<<1,rc=(o<<1)+1;
if (r>l){
tree[i][o].sum=tree[i][lc].sum+tree[i][rc].sum;
tree[i][o].mi=min (tree[i][lc].mi,tree[i][rc].mi);
tree[i][o].ma=max (tree[i][lc].ma,tree[i][rc].ma);
}
if (tree[i][o].setv!=-1){
tree[i][o].mi=tree[i][o].setv;
tree[i][o].ma=tree[i][o].setv;
tree[i][o].sum=tree[i][o].setv*(r-l+1);
}
if (tree[i][o].addv){
tree[i][o].mi+=tree[i][o].addv;
tree[i][o].ma+=tree[i][o].addv;
tree[i][o].sum+=tree[i][o].addv*(r-l+1);
}
}

void pushdown (int o,int i){
int lc=o<<1,rc=(o<<1)+1;
if (tree[i][o].setv!=-1){
tree[i][lc].setv=tree[i][rc].setv=tree[i][o].setv;
tree[i][lc].addv=tree[i][rc].addv=0;
tree[i][o].setv=-1;
}
if (tree[i][o].addv>0){
tree[i][lc].addv+=tree[i][o].addv;
tree[i][rc].addv+=tree[i][o].addv;
tree[i][o].addv=0;
}
}

void add (int o,int l,int r,int x1,int x2,int i,int v){
int m=l+(r-l)/2,lc=o<<1,rc=(o<<1)+1;
if (x1<=l&&r<=x2){
tree[i][o].addv+=v;
}
else {
pushdown (o,i);
if (x1<=m) add (lc,l,m,x1,x2,i,v);else maintain (lc,l,m,i);
if (m<x2) add (rc,m+1,r,x1,x2,i,v);else maintain (rc,m+1,r,i);
}
maintain (o,l,r,i);
return ;
}

void set (int o,int l,int r,int x1,int x2,int i,int v){
int m=l+(r-l)/2;
int lc=o<<1,rc=(o<<1)+1;
if (x1<=l&&r<=x2){
tree[i][o].setv=v;
tree[i][o].addv=0;
}
else {
pushdown (o,i);
if (x1<=m) set (lc,l,m,x1,x2,i,v);else maintain (lc,l,m,i);
if (m<x2) set (rc,m+1,r,x1,x2,i,v);else maintain (rc,m+1,r,i);
}
maintain (o,l,r,i);
return ;
}
int sum,ma,mi;
int query (int o,int l,int r,int x1,int x2,int i,int addv){
int m=l+(r-l)/2,lc=o<<1,rc=(o<<1)+1;
if (tree[i][o].setv!=-1){
int x=tree[i][o].setv+addv+tree[i][o].addv;
sum+=x*(min(r,x2)-max(l,x1)+1);
mi=min (mi,x);
ma=max (ma,x);
addv=0;
}
else if (x1<=l&&r<=x2){
sum+=tree[i][o].sum+addv*(r-l+1);
mi=min (mi,tree[i][o].mi+addv);
ma=max (ma,tree[i][o].ma+addv);
}
else {
if (x1<=m) query (lc,l,m,x1,x2,i,addv+tree[i][o].addv);
if (x2>m) query (rc,m+1,r,x1,x2,i,addv+tree[i][o].addv);
}
}

int main (){
while (cin>>r>>c>>m){
init ();
while (m--){
int f,x1,x2,y1,y2,v;
cin>>f>>x1>>y1>>x2>>y2;
if (f==1){
cin>>v;
for (int i=x1;i<=x2;i++)
add (1,1,c,y1,y2,i,v);
}
else if (f==2){
cin>>v;
for (int i=x1;i<=x2;i++)
set (1,1,c,y1,y2,i,v);
}
else if (f==3){
sum=0;ma=-INF;mi=INF;
for (int i=x1;i<=x2;i++)
query (1,1,c,y1,y2,i,0);
cout<<sum<<" "<<mi<<" "<<ma<<endl;
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: