简单的线段树的题;

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

不过不知道怎么老是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. java窗体与Flash交互

    最近在研究flash,用flash去读取文件很简单,但是存储文件就很麻烦了. 因此想到用java的窗体进行交互. 下面是DJNativeSwing-SWT-1-0-3-20140708的下载链接: h ...

  2. iOS UIKit:TableView之编辑模式(3)

    一般table view有编辑模式和正常模式,当table view进入编辑模式时,会在row的左边显示编辑和重排控件,如图 42所示的编辑模式时的控件布局:左边的editing control有表 ...

  3. MVC小系列(十四)【MVC+ZTree大数据异步树加载】

    ZTree是一个jquery的树插件可以异步加载 第一步定义一个标准的接口(指的是与ztree默认的数据元素保持一致) /// <summary> /// ZTree数据结构 /// &l ...

  4. C#数组按值和按引用传递数组区别

    C#中,存储数组之类对象的变量并不是实际存储对象本身,而是存储对象的引用.按值传递数组时,程序将变量传递给方法时,被调用方法接受变量的一个副本,因此在被调用时试图修改数据变量的值时,并不会影响变量的原 ...

  5. WebSocket使用教程 - 带完整实例

    http://my.oschina.net/u/1266171/blog/357488 什么是WebSocket?看过html5的同学都知道,WebSocket protocol 是HTML5一种新的 ...

  6. Spring的多配置文件加载

    如果配置文件存在多个的情况下,加载配置文件的方式是:1--可以指定总的配置文件去包含子的配置文件,然后只加载总的配置文件即可在总配置文件applicationContext.xml 中引入子文件 &l ...

  7. Flexbox盒子弹性布局

    Can I Use? 2. 概念: 当你给一个元素使用了flexbox模块,那么它的子元素就会指定的方向在水平或者纵向方向排列.这些子元素会按照一定的比例进行扩展或收缩来填补容器的可用空间. < ...

  8. 快速排序 javascript实现

    Quicksort(快速排序) 是由 东尼·霍尔 所发展的一种排序. 它比其他的Ο(n log n)算法更快, 因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来.当然, ...

  9. Jquery 动态生成表单 并将表单数据 批量通过Ajax插入到数据库

    利用Jquery 动态生成 Table 表单 之后利用each 方法来遍历所有文本框获取文本的value值  并通过Ajax 将数据 提交到Web服务里把数据插入数据库 Html页面 <!DOC ...

  10. linux - Mysql 创建用户和授权

    CREATE USER 'cui'@'%' IDENTIFIED BY 'xxxxxxxxxxxxxxxxxx'; GRANT ALL ON test_db.* TO 'cui'@'%'; REVOK ...