UVA - 11992:Fast Matrix Operations
线段树,注意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的更多相关文章
- UVA 11992 - Fast Matrix Operations(段树)
UVA 11992 - Fast Matrix Operations 题目链接 题意:给定一个矩阵,3种操作,在一个矩阵中加入值a,设置值a.查询和 思路:因为最多20列,所以全然能够当作20个线段树 ...
- Fast Matrix Operations(UVA)11992
UVA 11992 - Fast Matrix Operations 给定一个r*c(r<=20,r*c<=1e6)的矩阵,其元素都是0,现在对其子矩阵进行操作. 1 x1 y1 x2 y ...
- uva 11992 Fast Matrix Operations 线段树模板
注意 setsetset 和 addvaddvaddv 标记的下传. 我们可以控制懒惰标记的优先级. 由于 setsetset 操作的优先级高于 addaddadd 操作,当下传 setsetset ...
- Fast Matrix Operations
A Simple Problem with Integers 每次将区间向下更新,或是用之前的方法,统计当前节点到父节点处的覆盖数目. #include <cstdio> #include ...
- UVA11992 - Fast Matrix Operations(段树部分的变化)
UVA11992 - Fast Matrix Operations(线段树区间改动) 题目链接 题目大意:给你个r*c的矩阵,初始化为0. 然后给你三种操作: 1 x1, y1, x2, y2, v ...
- UVA 11992 Fast Matrix Operations(线段树:区间修改)
题目链接 2015-10-30 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=s ...
- UVA 11992 Fast Matrix Operations (二维线段树)
解法:因为至多20行,所以至多建20棵线段树,每行建一个.具体实现如下,有些复杂,慢慢看吧. #include <iostream> #include <cstdio> #in ...
- uva 11992 - Fast Matrix Operations
简单的线段树的题: 有两种方法写这个题,目前用的熟是这种慢点的: 不过不知道怎么老是T: 感觉网上A过的人的时间度都好小,但他们都是用数组实现的 难道是指针比数组慢? 好吧,以后多用数组写写吧! 超时 ...
- UVa 11992 Fast Matrix Operations (线段树,区间修改)
题意:给出一个row*col的全0矩阵,有三种操作 1 x1 y1 x2 y2 v:将x1 <= row <= x2, y1 <= col <= y2里面的点全部增加v: 2 ...
随机推荐
- djangoueditor 集成xadmin
1.安装Python3兼容版本 https://github.com/twz915/DjangoUeditor3/ 2.model加入字段 from DjangoUeditor.models impo ...
- 前端双引号单引号,正则反向引用,js比较jq
1.js,jq,css,html属性必须双,如果同时出现需要嵌套使用,属性的规范是双但是也可以用单测试有效 单引号现象举例:jq中获取元素标签是单引号:$('input').click:弹出也是单引号 ...
- 分贝块---dBblock
分贝,用英语来表达的话,是decibel,是量度两个相同单位之数量比例的计量单位,主要用于度量声音强度,常用dB表示. 块,block,在百度百科中,指数据库中的最小存储和处理单位,包含块本身的头信息 ...
- Mock API是如何在开发中发光发热的?
在长期的服务过程中,我们经常会遇到前来咨询的用户与我们反馈以下这种情况:咨询者是一个前端人员,在项目开发的过程中需要与后端进行对接,遇到后端还没完成数据输出的情况下,他只好写静态模拟数据,在遇到大型项 ...
- ELK学习总结(3-2)elk的过滤查询
和一般查询比较,filter查询:能够缓存数据在内存中,应该尽可能使用 建立测试数据 查看测试数据 1.filtered查询 GET /store/products/_search { "q ...
- SQL Server数据库优化的10多种方法
巧妙优化sql server数据库的几种方法,在实际操作中导致查询速度慢的原因有很多,其中最为常见有以下的几种:没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷). I/O吞吐量小, ...
- Django之views系统
Django的View(视图)简介 一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应. 响应可以是一张网页的HTML内容,一个重定向,一个404错 ...
- Tesseract-OCR4.0识别中文与训练字库实例
关于中文的识别,效果比较好而且开源的应该就是Tesseract-OCR了,所以自己亲身试用一下,分享到博客让有同样兴趣的人少走弯路. 文中所用到的身份证图片资源是百度找的,如有侵权可联系我删除. 一. ...
- leetcode算法:Next Greater Element I
You are given two arrays (without duplicates) nums1 and nums2 where nums1's elements are subset of n ...
- Sublime Text3 运行Python 出现Error:Decode error - output not utf-8
问题描述: Sublime Text 3 在build Python时,如果python源代码输出有中文,例如"print('中文')",Sublime Text 会报 [Deco ...