http://uva.onlinejudge.org/index.php?

option=com_onlinejudge&Itemid=8&page=show_problem&problem=3143

矩阵变成一行,然后计算位置。lrj给了线段树数组做法 可是我做的线段树空间过大,直接爆掉,所以换方法了

主要还是測试自己的线段树区间更新的模板

各种RE+WA之后AC,,,,。

做的时候出现的几个错误:

1、行和列弄错

2、build初始化的时候,mmin mmax 都初始化为0才对

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std; #define lson(i) l , mid , (i)*2
#define rson(i) mid + 1 , r , ((i)*2 +1)
#define ll rt*2
#define rr (rt*2+1) const int INFMIN = 0xffffffff;
const int INFMAX = 1000000009;//0x80000000;
const int MAXN = 30001000;
struct Node{
int l,r;
int mmax,mmin,sum,add,s;/*s去标记是不是被set*/
};
Node nodes[MAXN]; int mmax,mmin,sum;
void PushUp(int rt)
{
nodes[rt].mmax = max(nodes[ll].mmax,nodes[rr].mmax);
nodes[rt].mmin = min(nodes[ll].mmin,nodes[rr].mmin);
nodes[rt].sum = nodes[ll].sum + nodes[rr].sum;
}
void PushDown(int rt)
{
//if(nodes[rt].add && flag == 1)
if(nodes[rt].add)
{
nodes[ll].add += nodes[rt].add;
nodes[ll].mmin += nodes[rt].add;
nodes[ll].mmax += nodes[rt].add;
nodes[rr].add += nodes[rt].add;
nodes[rr].mmin += nodes[rt].add;
nodes[rr].mmax += nodes[rt].add; nodes[ll].sum += nodes[rt].add*(nodes[ll].r-nodes[ll].l+1);
nodes[rr].sum += nodes[rt].add*(nodes[rr].r-nodes[rr].l+1);
nodes[rt].add = 0;
}
//if(nodes[rt].s && flag == 2)
if(nodes[rt].s)
{
nodes[ll].s = nodes[rr].s=nodes[rt].s;
nodes[ll].mmin = nodes[ll].mmax = nodes[rr].mmax = nodes[rr].mmin = nodes[rt].mmax;
nodes[ll].sum = nodes[rt].mmin*(nodes[ll].r-nodes[ll].l+1);
nodes[rr].sum = nodes[rt].mmin*(nodes[rr].r-nodes[rr].l+1);
nodes[ll].add = nodes[rr].add = 0;//////////////
nodes[rt].s=0;
}
}
void Build(int l,int r,int rt)
{
nodes[rt].l=l;
nodes[rt].r=r;
nodes[rt].add =0;
nodes[rt].s=0;
nodes[rt].sum =0;
nodes[rt].mmin=0;
nodes[rt].mmax=0;
if(l == r)
{
//nodes[rt].mmin = nodes[rt].mmax = nodes[rt].sum =a[l];
nodes[rt].mmin = nodes[rt].mmax = nodes[rt].sum =0;////////////////
return ;
}
int mid = (nodes[rt].l+nodes[rt].r)/2;
Build(lson(rt));
Build(rson(rt));
//PushUp(rt);
} void Update(int l,int r,int add,int rt,int flag)
{
/////////////////////////////////////////////////////////////////
//printf("rt=%d l=%d r=%d add=%d flag =%d nodes[rt].l=%d nodes[rt].r=%d\n",rt,l,r,add,flag,nodes[rt].l,nodes[rt].r);
if(l<=nodes[rt].l && nodes[rt].r<=r)
{
if(flag == 1)/*increase*/
{
nodes[rt].mmax += add;
nodes[rt].mmin += add;
nodes[rt].add += add;
nodes[rt].sum += add*(nodes[rt].r-nodes[rt].l+1); }
else
{
nodes[rt].mmax = add;
nodes[rt].mmin = add;
nodes[rt].add=0;
nodes[rt].s=1;
nodes[rt].sum = add*(nodes[rt].r-nodes[rt].l+1);
}
return;
}
PushDown(rt);
int mid = (nodes[rt].l+nodes[rt].r)/2;
if(l<=mid)Update(l,r,add,ll,flag);
if(r>mid)Update(l,r,add,rr,flag);
PushUp(rt);
}
void Query(int l,int r,int rt)/*1表示mmin 2--mmax 3-sum*/
{
/////////////////////////////////////////////////////////////////
//printf("rt=%d l=%d r=%d nodes[rt].l=%d nodes[rt].r=%d\n",rt,l,r,nodes[rt].l,nodes[rt].r);
///////////////////////////////////////////////////////////////////////////
if(l<=nodes[rt].l && nodes[rt].r<=r)
{
mmin = min(mmin,nodes[rt].mmin);
mmax = max(mmax,nodes[rt].mmax);
sum += nodes[rt].sum;
return ;
}
PushDown(rt);
int mid = (nodes[rt].l+nodes[rt].r)/2;
if(l<=mid)Query(l,r,ll);
if(r>mid)Query(l,r,rr);
PushUp(rt);
}
void clr()/*每次查询之前使用*/
{
sum =0;
mmin=INFMAX;
mmax=INFMIN;
} int main()
{
//freopen("uva11992.txt","r",stdin);
int r,c,m,v,flag,x1,y1,x2,y2; while(scanf("%d%d%d",&r,&c,&m)!=EOF)
{
Build(1,r*c,1);
while(m--)
{
scanf("%d%d%d%d%d",&flag,&x1,&y1,&x2,&y2);
if(flag<3)
{
scanf("%d",&v);
for(int i=x1;i<=x2;i++)/*此处注意*/
{
///////////////////////////////////////////////////////////////
//printf("i=%d\n",i); Update(y1+(i-1)*c,y2+(i-1)*c,v,1,flag);
}
}
else
{
int anssum=0,ansmin=INFMAX,ansmax=INFMIN;
for(int i=x1;i<=x2;i++)
{
clr();
Query(y1+(i-1)*c,y2+(i-1)*c,1);
////////////////////////
// printf("**min=%d\n",mmin);
/////////////////
anssum+=sum;
ansmax=max(ansmax,mmax);
ansmin=min(ansmin,mmin);
}
printf("%d %d %d\n",anssum,ansmin,ansmax);
}
}
} return 0;
}

uva 11992 为矩阵更新查询段树的更多相关文章

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

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

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

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

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

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

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

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

  5. poj 3468 线段树区间更新/查询

    Description You have N integers, A1, A2, ... , AN. You need to deal with two kinds of operations. On ...

  6. HDU 6356.Glad You Came-线段树(区间更新+剪枝) (2018 Multi-University Training Contest 5 1007)

    6356.Glad You Came 题意就是给你一个随机生成函数,然后从随机函数里确定查询的左右区间以及要更新的val值.然后最后求一下异或和就可以了. 线段树,区间最大值和最小值维护一下,因为数据 ...

  7. HDU 6315.Naive Operations-线段树(两棵树合并)(区间单点更新、区间最值、区间求和)+思维 (2018 Multi-University Training Contest 2 1007)

    6315.Naive Operations 题意很好理解,但是因为区间求和求的是向下取整的a[i]/b[i],所以直接分数更新区间是不对的,所以反过来直接当a[i]==b[i]的时候,线段树对应的位置 ...

  8. lintocde-247-线段树的查询 II

    247-线段树的查询 II 对于一个数组,我们可以对其建立一棵 线段树, 每个结点存储一个额外的值 count 来代表这个结点所指代的数组区间内的元素个数. (数组中并不一定每个位置上都有元素) 实现 ...

  9. lintcode-202-线段树的查询

    202-线段树的查询 对于一个有n个数的整数数组,在对应的线段树中, 根节点所代表的区间为0-n-1, 每个节点有一个额外的属性max,值为该节点所代表的数组区间start到end内的最大值. 为Se ...

随机推荐

  1. struts2错误验证

    在登陆的时候一般要用错误验证功能.效果如图: 在action层的写法: this.addActionError("username或password错误"); 在jsp页面上取值: ...

  2. Note:This element neither has attached source nor attached Javadoc

    在用Eclipse编写程序时,发现把鼠标放到类名上时出现标题的提示 解决方法: 右击项目,选择 properties –> Java Build Path –> Libraries,如图 ...

  3. 获取Jenkins project build结果

    当Jenkins管理的build project越来越多的时候,须要脚本收集每一个project的近期一次build结果,从而集中管理.依据业务规则,决定是否重算和何时重算. 以下的命令是利用curl ...

  4. (读书笔记).NET大局观-.NET语言(1)

    通用语言运行时 通用语言运行时被明确设计为支持多种语言,一般而言,建立于CLR之上的语言可以获得共同的良好处理.通过一个宏大的核心语义集,CLR还界定了一个以它为基础的典型编程语言的大体部分.例如对于 ...

  5. 什么是Java “实例化”

    实例化:对象也是引用数据类型,只能使用new运算符从堆中分配内存: 使用已经定义好的类,创建该类对象的过程称为“实例化”. 只有先实例化类的对象,才可以访问到类中的成员(属性和方法). 使用成员运算符 ...

  6. Java生成目录

    Java生成目录 1.说明 推断目录是否存在,假设不存在就创建该目录.并打印其路径.假设存在,打印其路径 2.实现源代码 /** * @Title:BuildFolder.java * @Packag ...

  7. asp.net mvc4中自定义404页面

    原文地址:http://www.chuchur.com/asp-net-mvc4-404/ 定义404 方法当然有很多种.不同的方法所展现的形式也不一样,用户所体验也不一样.以下提供2两种 方法一: ...

  8. Effective C++ -- 构造析构赋值运算

    05.了解C++默默编写并调用哪些函数 编译产生的析构函数时non-virtual,除非这个类的基类析构函数为virtual 成员变量中有引用和const成员时,无法自己主动生成copy assign ...

  9. RequireJS和JQuery的模块化编程

    基于RequireJS和JQuery的模块化编程 由于js的代码逻辑越来越重,一个js文件可能会有上千行,十分不利于开发与维护.最近正在把逻辑很重的js拆分成模块,在一顿纠结是使用requirejs还 ...

  10. ElasticSearch+Kibana 索引操作

    ElasticSearch+Kibana 索引操作 一 前言 ElasticiSearch 简介 ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引 ...