思路

注意到最多20行,拆成20颗线段树即可

注意set标记清空左右儿子的add,不要清空自己的add,因为这个set操作之后可能还有add存在这个节点上

代码

#include <cstdio>
#include <algorithm>
#include <cstring>
#define int long long
using namespace std;
struct Node{
int minx,maxx,sum,add,set,lson,rson;
}Seg[5000000];
struct QNode{
int minx,maxx,sum;
};
int Nodecnt,r,c,m,root[30];
void pushup(int o){
Seg[o].sum=Seg[Seg[o].lson].sum+Seg[Seg[o].rson].sum;
Seg[o].maxx=max(Seg[Seg[o].lson].maxx,Seg[Seg[o].rson].maxx);
Seg[o].minx=min(Seg[Seg[o].lson].minx,Seg[Seg[o].rson].minx);
}
int New_Node(void){
int o=++Nodecnt;
Seg[o].add=Seg[o].lson=Seg[o].rson=Seg[o].maxx=Seg[o].minx=Seg[o].sum=0;
Seg[o].set=-1;
return o;
}
void pushdown(int o,int l,int r){
int mid=(l+r)>>1;
if(!Seg[o].lson)
Seg[o].lson=New_Node();
if(!Seg[o].rson)
Seg[o].rson=New_Node();
if(Seg[o].set!=-1){
Seg[Seg[o].lson].set=Seg[o].set;
Seg[Seg[o].rson].set=Seg[o].set;
Seg[Seg[o].lson].sum=Seg[o].set*(mid-l+1);
Seg[Seg[o].rson].sum=Seg[o].set*(r-mid);
Seg[Seg[o].lson].maxx=Seg[o].set;
Seg[Seg[o].rson].maxx=Seg[o].set;
Seg[Seg[o].lson].minx=Seg[o].set;
Seg[Seg[o].rson].minx=Seg[o].set;
Seg[Seg[o].lson].add=0;
Seg[Seg[o].rson].add=0;
Seg[o].set=-1;
}
if(Seg[o].add){
Seg[Seg[o].lson].add+=Seg[o].add;
Seg[Seg[o].rson].add+=Seg[o].add;
Seg[Seg[o].lson].sum+=Seg[o].add*(mid-l+1);
Seg[Seg[o].rson].sum+=Seg[o].add*(r-mid);
Seg[Seg[o].lson].maxx+=Seg[o].add;
Seg[Seg[o].rson].maxx+=Seg[o].add;
Seg[Seg[o].lson].minx+=Seg[o].add;
Seg[Seg[o].rson].minx+=Seg[o].add;
Seg[o].add=0;
}
}
void add(int L,int R,int l,int r,int &o,int c){
if(!o)
o=New_Node();
if(L<=l&&r<=R){
Seg[o].add+=c;
Seg[o].maxx+=c;
Seg[o].minx+=c;
Seg[o].sum+=c*(r-l+1);
return;
}
pushdown(o,l,r);
int mid=(l+r)>>1;
if(L<=mid)
add(L,R,l,mid,Seg[o].lson,c);
if(R>mid)
add(L,R,mid+1,r,Seg[o].rson,c);
pushup(o);
}
void set(int L,int R,int l,int r,int &o,int c){
if(!o)
o=New_Node();
if(L<=l&&r<=R){
Seg[o].add=0;
Seg[o].set=c;
Seg[o].maxx=c;
Seg[o].minx=c;
Seg[o].sum=c*(r-l+1);
return;
}
pushdown(o,l,r);
int mid=(l+r)>>1;
if(L<=mid)
set(L,R,l,mid,Seg[o].lson,c);
if(R>mid)
set(L,R,mid+1,r,Seg[o].rson,c);
pushup(o);
}
QNode query(int L,int R,int l,int r,int &o){
if(!o)
o=New_Node();
QNode tmp;
if(L<=l&&r<=R){
tmp.maxx=Seg[o].maxx;
tmp.minx=Seg[o].minx;
tmp.sum=Seg[o].sum;
return tmp;
}
pushdown(o,l,r);
int mid=(l+r)>>1;
if(R<=mid)
return query(L,R,l,mid,Seg[o].lson);
else if(L>mid)
return query(L,R,mid+1,r,Seg[o].rson);
else{
QNode lx,rx;
lx=query(L,R,l,mid,Seg[o].lson);
rx=query(L,R,mid+1,r,Seg[o].rson);
tmp.minx=min(lx.minx,rx.minx);
tmp.maxx=max(lx.maxx,rx.maxx);
tmp.sum=lx.sum+rx.sum;
return tmp;
}
}
void init(void){
Nodecnt=0;
memset(root,0,sizeof(root));
Seg[0].maxx=-0x3f3f3f3f;
Seg[0].minx=0x3f3f3f3f;
Seg[0].sum=0;
}
signed main(){
// freopen("test.in","r",stdin);
// freopen("test.out","w",stdout);
while(scanf("%lld %lld %lld",&r,&c,&m)==3){
init();
int x1,y1,x2,y2,v,opt;
for(int i=1;i<=m;i++){
scanf("%lld %lld %lld %lld %lld",&opt,&x1,&y1,&x2,&y2);
if(opt==1){
scanf("%lld",&v);
for(int j=x1;j<=x2;j++)
add(y1,y2,1,c,root[j],v);
}
else if(opt==2){
scanf("%lld",&v);
for(int j=x1;j<=x2;j++)
set(y1,y2,1,c,root[j],v);
}
else{
QNode ans={0x3f3f3f3f,-0x3f3f3f3f,0},tmp;
for(int j=x1;j<=x2;j++){
tmp=query(y1,y2,1,c,root[j]);
ans.maxx=max(ans.maxx,tmp.maxx);
ans.minx=min(ans.minx,tmp.minx);
ans.sum=ans.sum+tmp.sum;
}
printf("%lld %lld %lld\n",ans.sum,ans.minx,ans.maxx);
}
}
// printf("0:%lld %lld %lld\n",Seg[0].maxx,Seg[0].minx,Seg[0].sum);
}
return 0;
}

UVA11992 Fast Matrix Operations的更多相关文章

  1. UVA11992 - Fast Matrix Operations(段树部分的变化)

    UVA11992 - Fast Matrix Operations(线段树区间改动) 题目链接 题目大意:给你个r*c的矩阵,初始化为0. 然后给你三种操作: 1 x1, y1, x2, y2, v ...

  2. [uva11992]Fast Matrix Operations(多延迟标记,二维线段树,区间更新)

    题目链接:https://vjudge.net/problem/UVA-11992 题意:n*m的矩阵,每次对一个子矩阵操作,有三种操作:加x,设置为x,查询.查询返回子矩阵和.最小值.最大值 n很小 ...

  3. Fast Matrix Operations

    A Simple Problem with Integers 每次将区间向下更新,或是用之前的方法,统计当前节点到父节点处的覆盖数目. #include <cstdio> #include ...

  4. UVA 11992 - Fast Matrix Operations(段树)

    UVA 11992 - Fast Matrix Operations 题目链接 题意:给定一个矩阵,3种操作,在一个矩阵中加入值a,设置值a.查询和 思路:因为最多20列,所以全然能够当作20个线段树 ...

  5. uva 11992 Fast Matrix Operations 线段树模板

    注意 setsetset 和 addvaddvaddv 标记的下传. 我们可以控制懒惰标记的优先级. 由于 setsetset 操作的优先级高于 addaddadd 操作,当下传 setsetset ...

  6. Fast Matrix Operations(UVA)11992

    UVA 11992 - Fast Matrix Operations 给定一个r*c(r<=20,r*c<=1e6)的矩阵,其元素都是0,现在对其子矩阵进行操作. 1 x1 y1 x2 y ...

  7. luogu题解 UVA11992 【Fast Matrix Operations】

    题目链接: https://www.luogu.org/problemnew/show/UVA11992 题目大意: 一个r*c的矩阵,一开始元素都是0,然后给你m次三种操作,分别是将一个子矩阵中所有 ...

  8. 线段树(多维+双成段更新) UVA 11992 Fast Matrix Operations

    题目传送门 题意:训练指南P207 分析:因为矩阵不超过20行,所以可以建20条线段的线段树,支持两个区间更新以及区间查询. #include <bits/stdc++.h> using ...

  9. UVA 11992 Fast Matrix Operations(线段树:区间修改)

    题目链接 2015-10-30 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=s ...

随机推荐

  1. poj3255 Roadblocks

    Roadblocks Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 13594   Accepted: 4783 Descr ...

  2. react ref获取dom对象

    react文档 step = React.createRef(); // init <div ref={this.step}></div> // bind componentD ...

  3. Spring Security的核心拦截器

    1. HttpSessionContextIntegrationFilter 位于过滤器顶端,第一个起作用的过滤器. 用途一,在执行其他过滤器之前,率先判断用户的session中是否已经存在一个Sec ...

  4. 15、js 原生基础总结

    Day1 一.什么是JS?   ==基于对象==和==事件驱动==的客户端脚本语言 二.哪一年?哪个公司?谁?第一个名字是什么? 1995,NetScape(网景公司),布兰登(Brendan Eic ...

  5. Nginx打卡

    Nginx打卡 此括号中的是干货 [ 直接说最关心的事:如何去掉访问路径的端口号? 答案:使用Nginx啊 具体安装还需看底下啰嗦的东东,安装OK且完美启动的同学,server proxy_pass ...

  6. STM32手记

    20k的ram,64k的Flash 2.3.7: 复位,内部8MHz工作. 外部时钟出错时,自动切换到内部RC时钟,可设置该中断,PLL同样能监测. 高速时钟最大72M,低速时钟,最大36M. 2.3 ...

  7. 电子产品使用感受之———我用过的最昂贵的手机壳:otter box 和 Apple 原装清水壳的对比

    2014年9月27日,我买到了我所使用的第一部 iPhone — iPhone 5C 蓝色.今天,2019年3月2日,我手里拿的是iPhoneXR 蓝色,两款手机如出一辙的设计和手感,让我充满了无限的 ...

  8. Codeforces 677 - A/B/C/D/E - (Undone)

    链接: A - Vanya and Fence - [水] AC代码: #include<bits/stdc++.h> using namespace std; ; int n,h; in ...

  9. consul服务配置维护

    1.命令参数 -advertise:通知展现地址用来改变我们给集群中的其他节点展现的地址,默认情况下-bind地址就是展现地址,然而也存在一些路由地址是不能受约束的,这时候会激活一个不同的地址来供应, ...

  10. 磁盘异步I / O在Windows上显示为同步

    概要 Microsoft Windows上的文件I / O可以是同步或异步的.I / O的默认行为是同步的,其中调用I / O函数并在I / O完成时返回.异步I / O允许I / O函数立即将执行返 ...