uva 11992 - Fast Matrix Operations
简单的线段树的题;
有两种方法写这个题,目前用的熟是这种慢点的;
不过不知道怎么老是T;
感觉网上A过的人的时间度都好小,但他们都是用数组实现的
难道是指针比数组慢?
好吧,以后多用数组写写吧!
超时的代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 1000009
using namespace std; struct node
{
int l,r;
int ma,mi,sum;
int ad,st;
bool flag1,flag2;
node *left,*right;
} no[maxn*];
int nonocount; void build(node *rt,int l,int r)
{
rt->l=l;
rt->r=r;
rt->sum=;
rt->ma=;
rt->mi=;
if(l==r)
return;
int mid=(l+r)>>;
rt->left=no+nonocount++;
rt->right=no+nonocount++;
build(rt->left,l,mid);
build(rt->right,mid+,r);
} void maintain(node *rt)
{
rt->ma=max(rt->left->ma,rt->right->ma);
rt->mi=min(rt->left->mi,rt->right->mi);
rt->sum=rt->left->sum+rt->right->sum;
} void pushdown(node *rt)
{
if(rt->flag1==)
{
rt->flag1=;
rt->ma+=rt->ad;
rt->mi+=rt->ad;
rt->sum+=(rt->r-rt->l+)*rt->ad;
if(rt->l!=rt->r)
{
rt->left->ad=rt->right->ad=rt->ad;
rt->left->flag1=rt->right->flag1=;
pushdown(rt->left);
pushdown(rt->right);
}
rt->ad=;
return;
}
if(rt->flag2==)
{
rt->flag2=;
rt->sum=(rt->r-rt->l+)*rt->ad;
rt->ma=rt->mi=rt->ad;
if(rt->l!=rt->r)
{
rt->left->ad=rt->right->ad=rt->ad;
rt->left->flag2=rt->right->flag2=;
pushdown(rt->left);
pushdown(rt->right);
}
rt->ad=;
return;
}
} void add(node *rt,int l,int r,int v)
{
if(l==rt->l&&r==rt->r)
{
rt->ad=v;
rt->flag1=;
pushdown(rt);
return;
}
int mid=(rt->l+rt->r)>>;
if(r<=mid)add(rt->left,l,r,v);
else if(l>=mid+)add(rt->right,l,r,v);
else
{
add(rt->left,l,mid,v);
add(rt->right,mid+,r,v);
}
maintain(rt);
} void set(node *rt,int l,int r,int v)
{
if(l==rt->l&&r==rt->r)
{
rt->ad=v;
rt->flag2=;
pushdown(rt);
return;
}
int mid=(rt->l+rt->r)>>;
if(r<=mid)set(rt->left,l,r,v);
else if(l>=mid+)set(rt->right,l,r,v);
else
{
set(rt->left,l,mid,v);
set(rt->right,mid+,r,v);
}
maintain(rt);
}
int ssum,mma,mmi;
void query(node *rt,int l,int r)
{
if(l==rt->l&&r==rt->r)
{
ssum+=rt->sum;
mma=max(rt->ma,mma);
mmi=min(rt->mi,mmi);
return;
}
int mid=(rt->l+rt->r)>>;
if(r<=mid)query(rt->left,l,r);
else if(l>=mid+)query(rt->right,l,r);
else
{
query(rt->left,l,mid);
query(rt->right,mid+,r);
}
} int main()
{
int n,m,q,cmd,x1,y1,x2,y2,v;
while(scanf("%d%d%d",&n,&m,&q)!=EOF)
{
nonocount=;
for(int i=; i<=n; i++)
build(no+i,,m);
while(q--)
{
scanf("%d",&cmd);
if(cmd==)
{
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
scanf("%d",&v);
for(int i=x1; i<=x2; i++)
add(no+i,y1,y2,v);
}
else if(cmd==)
{
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
scanf("%d",&v);
for(int i=x1; i<=x2; i++)
set(no+i,y1,y2,v);
}
else
{
int ans=;
mma=-,mmi=;
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
for(int i=x1; i<=x2; i++)
{
ssum=;
query(no+i,y1,y2);
ans+=ssum;
}
printf("%d %d %d\n",ans,mmi,mma);
}
}
}
return ;
}
uva 11992 - Fast Matrix Operations的更多相关文章
- UVA 11992 - Fast Matrix Operations(段树)
UVA 11992 - Fast Matrix Operations 题目链接 题意:给定一个矩阵,3种操作,在一个矩阵中加入值a,设置值a.查询和 思路:因为最多20列,所以全然能够当作20个线段树 ...
- uva 11992 Fast Matrix Operations 线段树模板
注意 setsetset 和 addvaddvaddv 标记的下传. 我们可以控制懒惰标记的优先级. 由于 setsetset 操作的优先级高于 addaddadd 操作,当下传 setsetset ...
- 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
题目传送门 题意:训练指南P207 分析:因为矩阵不超过20行,所以可以建20条线段的线段树,支持两个区间更新以及区间查询. #include <bits/stdc++.h> using ...
- UVA 11992 Fast Matrix Operations (二维线段树)
解法:因为至多20行,所以至多建20棵线段树,每行建一个.具体实现如下,有些复杂,慢慢看吧. #include <iostream> #include <cstdio> #in ...
- UVa 11992 Fast Matrix Operations (线段树,区间修改)
题意:给出一个row*col的全0矩阵,有三种操作 1 x1 y1 x2 y2 v:将x1 <= row <= x2, y1 <= col <= y2里面的点全部增加v: 2 ...
- UVA 11992 Fast Matrix Operations (降维)
题意:对一个矩阵进行子矩阵操作. 元素最多有1e6个,树套树不好开(我不会),把二维坐标化成一维的,一个子矩阵操作分解成多条线段的操作. 一次操作的复杂度是RlogC,很容易找到极端的数据(OJ上实测 ...
- 【UVA】11992 - Fast Matrix Operations(段树模板)
主体段树,要注意,因为有set和add操作,当慵懒的标志下推.递归优先set,后复发add,每次运行set行动add马克清0 WA了好几次是由于计算那一段的时候出问题了,可笑的是我对着模板找了一个多小 ...
- Fast Matrix Operations(UVA)11992
UVA 11992 - Fast Matrix Operations 给定一个r*c(r<=20,r*c<=1e6)的矩阵,其元素都是0,现在对其子矩阵进行操作. 1 x1 y1 x2 y ...
随机推荐
- jquery知识 属性 css
jquery基础知识 属性 css <!doctype html> <html lang="en"> <head> <meta chars ...
- postgresql行转列并拼接字符串
有这样一张表: ; id | kw ----+-------- 1 | big 1 | hello 2 | oracle 2 | small 2 | apple 3 | shit( ...
- json 转 javaBean
前言:经常在网络上看见一些关于json自动转换成javaBean的jar包,项目组里的人也在用,稍稍研究了下,都是用的反射来做的.我细细想了下里面的逻辑,我觉得直接生成JavaBean代码岂不是更加直 ...
- Android应用程序消息处理机制笔记
看老罗的Android源码情景分析学习的时候,边抄边理解再总结.希望能为面试提供点帮助吧. 1.Android应用程序是通过消息来驱动,Android应用程序每一个线程在启动时,都可以首先在内部创建一 ...
- 初识CoreText
一.基本知识介绍 1.字符(Character)和字形(Glyphs) 排版系统中文本显示的一个重要的过程就是字符到字形的转换,字符是信息本身的元素,而字形是字符的图形表征,字符还会有其它表征比如发音 ...
- 【制作镜像Win*】环境准备
1. 保证网络通 2. 保证系统为centos6.x/rhel 6.x 3. yum源正确,推荐使用utsc源,nailgun也ok 4.安装软件包 virsh list guestmount yum ...
- (hdu)5546 Ancient Go
Problem Description Yu Zhou likes to play Go with Su Lu. From the historical research, we found that ...
- Web Service 的服务端的引用
1.先说说服务端的引用 先写一个Web Service 的文件 上图 创建一个web 项目或者网站 然后添加新项 创建一个web服务 得到 下面的页面 然后运行起来 然后复制下地址 接下来创建另一 ...
- 360极速浏览器在XP系统下的一个bug
今天在做页面开发的时候,发现360浏览器在XP系统下不支持focus事件,而主流的IE(包括IE6),firefox,chrome都没有这个问题.前段开发的悲剧啊,各种浏览器兼容性的问题.
- java实现qq邮箱每天定时发送邮件
本周四的时候去学校的某机构值班,主要工作是帮老师送文件,干一些杂活.那天没有什么活儿,于是想起用Java实现发送邮件和接收邮件的功能.前几天接触过一点quartz框架,用来实现定时开始任务的功能.于是 ...