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 ...
随机推荐
- C#泛型集合—Dictionary<K,V>使用技巧
转载:http://blog.csdn.net/a125138/article/details/7742022 1.要使用Dictionary集合,需要导入C#泛型命名空间 System.Collec ...
- RazorEngine在非MVC下的使用,以及使用自定义模板
---恢复内容开始--- RazorEngine模板引擎大大的帮助了我们简化字符串的拼接与方法的调用,开源之后,现在在简单的web程序,winform程序,甚至控制台程序都可以利用它来完成. 但如何在 ...
- android 中在CMD中查看sqlite
今天第一次学习Sqlite,在代码中执行了sql,但是不知道在上面地方才能直观的查看sqlite中的数据,下面是查看资料后的找到的查看方法: 通过上述可以从cmd进入数据库查看原文地址:http:// ...
- 怎么用js代码改变单选框的选中状态
今天突然有一个需求要用到,使用js代码改变单选框的选中状态.当时想也不想直接 function doGender(gender) { if (gender == "男") { ge ...
- java中对除法取2位小数的一点试验
如下程序, double a = 12.3333333,b = 11.22222222222; double c = 0; String d = String.format("%.2f&qu ...
- Android线程与异步消息处理机制
在程序开发时,对于一些比较耗时的操作,我们通常会为其开辟一个单独的线程来执行,这样可以尽可能的减少用户等待的时间.在Android中,默认情况下,所有的操作都是在主线程中进行的,这个主线程负责管理与U ...
- c语言学习之基础知识点介绍(十六):文件操作
一.文件的分类 1.文本文件:打开之后能看得懂的文件 2.二进制文件:打开之后看不懂,类似乱码之类的文件(视频,音频打开之后,能看.听,是应为电脑中装有播放器,播放器中含有解码器). 二.操作文件的步 ...
- IrisSkin4控件使用方法
参考如下: 1. 将IrisSkin4.dll动态文件导入当前项目引用中.具体操作为:解决方案资源管理器->当前项目->引用->右键->添加引用,找到IrisSkin4.dll ...
- u盘的超级用法
转自360 U盘是大家最常用的移动存储设备,不过它的即插即用特性在给我们带来方便同时,也带来了极大的安全隐患.一款没有加密功能的U盘,在借给他人使用或不慎丢失时,其中所保存的资料将很容 ...
- 类库探源——System.Configuration 配置信息处理
按照MSDN描述 System.Configuration 命名空间 包含处理配置信息的类型 本篇文章主要两方面的内容 1. 如何使用ConfigurationManager 读取AppSetting ...