简单的线段树的题;

有两种方法写这个题,目前用的熟是这种慢点的;

不过不知道怎么老是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的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

  7. UVA 11992 Fast Matrix Operations (降维)

    题意:对一个矩阵进行子矩阵操作. 元素最多有1e6个,树套树不好开(我不会),把二维坐标化成一维的,一个子矩阵操作分解成多条线段的操作. 一次操作的复杂度是RlogC,很容易找到极端的数据(OJ上实测 ...

  8. 【UVA】11992 - Fast Matrix Operations(段树模板)

    主体段树,要注意,因为有set和add操作,当慵懒的标志下推.递归优先set,后复发add,每次运行set行动add马克清0 WA了好几次是由于计算那一段的时候出问题了,可笑的是我对着模板找了一个多小 ...

  9. Fast Matrix Operations(UVA)11992

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

随机推荐

  1. PHP中的超级全局变量

    PHP内置了一些超级全局变量,我们可以在脚本的任何地方使用和可见,下面记录一下这些全局变量的作用: 1.$_SERVER $_SERVER超级全局变量包含由web服务器创建的信息,它提供了服务器和客户 ...

  2. js中对象的创建

    json方式,构造函数方式,Object方式,属性的删除和对象的销毁 <html> <head> <title>js中的对象的创建</title> &l ...

  3. 20151214 jquery插件代码备份

    ;(function ($) { //局部性的 /*$.fn.extend({ 'nav' : function (color) { $(this).find('.nav').css({ 'list- ...

  4. 关于安卓应用(APK文件)的二次打包

    http://blog.csdn.net/baiyuliang2013/article/details/40426681 很多开发者,不管是个人或是公司都不太注重自己开发的应用的安全性,即是 否会被不 ...

  5. works-er

  6. [python] 字符串与列表、字典的转换

    1.字符串->字典:eval(str) 2.字符串->列表:list(str)

  7. IOS_OC_百度地图与社交分享

    前奏. 知识点介绍 一. 导航和画线 地图画线 (理解) 二. 百度地图 集成百度地图 (掌握) POI检索 (掌握) 三. 社交分享 系统自带分享 (了解) 友盟分享 (掌握) SSO授权 (理解) ...

  8. ipod nano 无法添加mp4视频 电影失败解决方法

    我的是nano7. 导入mp4各种错误, 同步资料库 无效等等方法都没用. 后来发现当中 多个mp4,少年pi.mp4竟然导入成功, 怀疑是mp4格式不符合nano 于是:(测试后成功) 先拉到资料库 ...

  9. javascript函数 第14节

    <html> <head> <title>function</title> </head> <body> 1.函数形式<b ...

  10. 2016.08.07计算几何总结测试day2

    T1 bzoj: [Usaco2010 OPen]Triangle Counting 数三角形 看到这个题n那么大, 于是想到极角排序搞一搞,然而排完序后立马懵逼,完全不知道接下来应该怎么写.... ...