线段树,注意tag优先级

#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#define MAXN 1000005
using namespace std;
struct Node{
int sumv,maxv,minv,tag_add,tag_change;
Node(int p1=,int p2=,int p3=,int p4=,int p5=){
sumv=p1,maxv=p3,minv=p2,tag_add=p4,tag_change=p5;
}
}dat[][MAXN<<];
int a[][MAXN];
Node Merge(Node t1,Node t2){
if(t1.tag_add==-)return t2;
if(t2.tag_add==-)return t1;
Node ret;
ret.sumv=t1.sumv+t2.sumv;
ret.maxv=max(t1.maxv,t2.maxv);
ret.minv=min(t1.minv,t2.minv);
return ret;
}
void build(Node d[],int x,int k,int L,int R){
if(L+==R){
d[k].sumv=d[k].maxv=d[k].minv=a[x][L];
return;
}
build(d,x,k<<,L,(L+R)>>);
build(d,x,k<<|,(L+R)>>,R);
d[k]=Merge(d[k<<],d[k<<|]);
}
void pushdown(Node d[],int k,int L,int R){
int lc=(k<<),rc=(k<<|);
if(d[k].tag_change){
d[lc].tag_add=;
d[lc].tag_change=d[k].tag_change;
d[lc].sumv=d[k].tag_change*(((L+R)>>)-L);
d[lc].maxv=d[k].tag_change;
d[lc].minv=d[k].tag_change;
d[rc].tag_add=;
d[rc].tag_change=d[k].tag_change;
d[rc].sumv=d[k].tag_change*(R-((L+R)>>));
d[rc].maxv=d[k].tag_change;
d[rc].minv=d[k].tag_change;
d[k].tag_change=;
}
if(d[k].tag_add){
d[lc].tag_add+=d[k].tag_add;
d[lc].sumv+=d[k].tag_add*(((L+R)>>)-L);
d[lc].maxv+=d[k].tag_add;
d[lc].minv+=d[k].tag_add;
d[rc].tag_add+=d[k].tag_add;
d[rc].sumv+=d[k].tag_add*(R-((L+R)>>));
d[rc].maxv+=d[k].tag_add;
d[rc].minv+=d[k].tag_add;
d[k].tag_add=;
}
}
void add(Node d[],int a,int b,int k,int L,int R,int x){
if(b<=L||R<=a){
return;
}
else if(a<=L&&R<=b){
d[k].tag_add+=x;
d[k].sumv+=x*(R-L);
d[k].maxv+=x;
d[k].minv+=x;
}
else{
if(d[k].tag_add||d[k].tag_change){
pushdown(d,k,L,R);
}
add(d,a,b,k<<,L,(L+R)>>,x);
add(d,a,b,k<<|,(L+R)>>,R,x);
d[k]=Merge(d[k<<],d[k<<|]);
}
}
void change(Node d[],int a,int b,int k,int L,int R,int x){
if(b<=L||R<=a){
return;
}
else if(a<=L&&R<=b){
d[k].tag_add=;
d[k].tag_change=x;
d[k].sumv=x*(R-L);
d[k].maxv=x;
d[k].minv=x;
}
else{
if(d[k].tag_add||d[k].tag_change){
pushdown(d,k,L,R);
}
change(d,a,b,k<<,L,(L+R)>>,x);
change(d,a,b,k<<|,(L+R)>>,R,x);
d[k]=Merge(d[k<<],d[k<<|]);
}
}
Node query(Node d[],int a,int b,int k,int L,int R){
if(b<=L||R<=a){
return Node(-,-,-,-,-);
}
else if(a<=L&&R<=b){
return d[k];
}
else{
if(d[k].tag_add||d[k].tag_change){
pushdown(d,k,L,R);
}
Node lc=query(d,a,b,k<<,L,(L+R)>>);
Node rc=query(d,a,b,k<<|,(L+R)>>,R);
return Merge(lc,rc);
}
}
void debug(Node d[],int k,int L,int R){
if(d[k].tag_add||d[k].tag_change){
pushdown(d,k,L,R);
}
if(L+==R){
printf("%d ",d[k]);
return;
}
debug(d,k<<,L,(L+R)>>);
debug(d,k<<|,(L+R)>>,R);
}
int m,n,T;
void solve(){
for(int i=;i<=m;i++){
build(dat[i],i,,,n+);
}
while(T--){
int p;scanf("%d",&p);
int x1,y1,x2,y2;scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
if(==p){
int v;scanf("%d",&v);
for(int i=x1;i<=x2;i++){
add(dat[i],y1,y2+,,,n+,v);
}
}
else if(==p){
int v;scanf("%d",&v);
for(int i=x1;i<=x2;i++){
change(dat[i],y1,y2+,,,n+,v);
}
}
else{
Node ans=query(dat[x1],y1,y2+,,,n+);
for(int i=x1+;i<=x2;i++){
Node t=query(dat[i],y1,y2+,,,n+);
ans.sumv+=t.sumv;
ans.maxv=max(ans.maxv,t.maxv);
ans.minv=min(ans.minv,t.minv);
}
printf("%d %d %d\n",ans.sumv,ans.minv,ans.maxv);
}
}
}
int main()
{
// freopen("data.in","r",stdin);
// freopen("my.in","w",stdout);
while(~scanf("%d%d%d",&m,&n,&T)){
solve();
}
}

UVA - 11992:Fast Matrix Operations的更多相关文章

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

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

  2. Fast Matrix Operations(UVA)11992

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

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

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

  4. Fast Matrix Operations

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

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

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

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

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

  7. UVA 11992 Fast Matrix Operations (二维线段树)

    解法:因为至多20行,所以至多建20棵线段树,每行建一个.具体实现如下,有些复杂,慢慢看吧. #include <iostream> #include <cstdio> #in ...

  8. uva 11992 - Fast Matrix Operations

    简单的线段树的题: 有两种方法写这个题,目前用的熟是这种慢点的: 不过不知道怎么老是T: 感觉网上A过的人的时间度都好小,但他们都是用数组实现的 难道是指针比数组慢? 好吧,以后多用数组写写吧! 超时 ...

  9. UVa 11992 Fast Matrix Operations (线段树,区间修改)

    题意:给出一个row*col的全0矩阵,有三种操作 1 x1 y1 x2 y2 v:将x1 <= row <= x2, y1 <= col <= y2里面的点全部增加v: 2 ...

随机推荐

  1. 作业01-Java基本概念

    1.本周学习总结 本周学习了JVM,JDK,JRE三者之间的区别及联系,知道JDK包括JRE,JRE包括JVM,知道java语言与C语言的不同之处在于java语言可以依赖于虚拟机实现"编译一 ...

  2. python3爬虫之入门和正则表达式

    前面的python3入门系列基本上也对python入了门,从这章起就开始介绍下python的爬虫教程,拿出来给大家分享:爬虫说的简单,就是去抓取网路的数据进行分析处理:这章主要入门,了解几个爬虫的小测 ...

  3. Python内置函数(49)——isinstance

    英文文档: isinstance(object, classinfo) Return true if the object argument is an instance of the classin ...

  4. java 实现多文件打包下载

    jsp页面js代码: function downloadAttached(){ var id = []; id.push(infoid); var options = {}; options.acti ...

  5. hadoop2.6.0实践:000 虚拟机配置

  6. RSA的公钥、私钥

    一.举个例子 1.发消息 用对方的公钥给对方发消息 2.发公告 发公告的时候,用自己的私钥形成签名! 二.加密和签名 RSA的公钥.私钥是互相对应的,RSA会生成两个密钥,你可以把任何一个用于公钥,然 ...

  7. Hive函数:rank()、dense_rank()

    数据准备: G1,KING, G1,BING, G2,FING, G1,FORD, G2,SCOTT, G1,JONES, G2,BLAKE, G1,CLARK, G1,ALLEN, G1,CELL1 ...

  8. Struts(二十七):使用token或tokenSession防止表单重复提交

    什么是表单重复提交 表单重复提交包括以下几种情况: 前提:不刷新表单页面 1.多次点击“提交”按钮后,重复提交了多次: 2.已经提交成功之后,按“回退”按钮之后,在点击“提交”按钮后,提交成功: 3. ...

  9. hdu1018 Big Number---N!的位数

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1018 题目大意: 求n阶乘的位数思路: N的阶乖的位数等于LOG10(N!)=LOG10(1)+.. ...

  10. DBSCAN

    DBSCAN,英文全写为Density-based spatial clustering of applications with noise ,是在 1996 年由Martin Ester, Han ...