这个题目要求和 还有 设置区间值 区间增值,明显要用线段树来

由于行数不超过20 而列数多达 10^5,所以对每一行建一棵线段树。

然后主要是在懒惰标记方面是难点 针对两种操作 分别设置 set 和 add 方法,但是优先级方面要好好考虑

可能出现的结果无非是 单独的 set 或者 add  以及 先set再add  或者 先add再set,单独的那两种就按常规写法,然后先set再add,则明显 add标记不能清除set,所以在pushdown的时候 先set 再 add,先set 再add ,则直接清除当前的add标记,在pushdown的时候同样清除子节点的add标记

其实只要搞清优先级 也挺简单的。。。懒惰标记用的还不熟练,要继续加强

#include <iostream>
#include <cstdio>
#include <cstring>
#define lson rt<<1,l,mid
#define rson rt<<1|1,mid+1,r
using namespace std;
const int N = +;
int d[][N*],dmax[][N*],dmin[][N*],setv[][N*],addv[][N*];
int r,c,m;
struct node
{
int tot,maxn,mini;
};
void up(int num,int rt)
{
d[num][rt]=d[num][rt<<]+d[num][rt<<|];
dmax[num][rt]=max(dmax[num][rt<<],dmax[num][rt<<|]);
dmin[num][rt]=min(dmin[num][rt<<],dmin[num][rt<<|]);
}
void build(int num,int rt,int l,int r)
{
setv[num][rt]=-;
addv[num][rt]=;
d[num][rt]=dmax[num][rt]=dmin[num][rt]=;
if (l>=r){
return;
}
int mid=(l+r)>>;
build(num,lson);
build(num,rson);
}
void pushdown(int num,int rt,int l,int r)
{
if (l>=r) return;
int mid=(l+r)>>;
if (setv[num][rt]>=){
d[num][rt<<]=(mid-l+)*setv[num][rt];
dmax[num][rt<<]=setv[num][rt];
dmin[num][rt<<]=setv[num][rt]; d[num][rt<<|]=(r-mid)*setv[num][rt];
dmax[num][rt<<|]=setv[num][rt];
dmin[num][rt<<|]=setv[num][rt]; setv[num][rt<<]=setv[num][rt<<|]=setv[num][rt];
setv[num][rt]=-;
addv[num][rt<<]=addv[num][rt<<|]=;
}
if (addv[num][rt]){
d[num][rt<<]+=(mid-l+)*addv[num][rt];
dmax[num][rt<<]+=addv[num][rt];
dmin[num][rt<<]+=addv[num][rt]; d[num][rt<<|]+=(r-mid) *addv[num][rt];
dmax[num][rt<<|]+=addv[num][rt];
dmin[num][rt<<|]+=addv[num][rt]; addv[num][rt<<]+=addv[num][rt];
addv[num][rt<<|]+=addv[num][rt];
addv[num][rt]=;
}
}
void pushdown2(int num,int rt,int l,int r)
{
if (l>=r) return;
int mid=(l+r)>>;
if (setv[num][rt]>=){
d[num][rt<<]=(mid-l+)*setv[num][rt];
dmax[num][rt<<]=setv[num][rt];
dmin[num][rt<<]=setv[num][rt]; d[num][rt<<|]=(r-mid)*setv[num][rt];
dmax[num][rt<<|]=setv[num][rt];
dmin[num][rt<<|]=setv[num][rt]; setv[num][rt<<]=setv[num][rt<<|]=setv[num][rt];
setv[num][rt]=-;
addv[num][rt<<]=addv[num][rt<<|]=;
}
if (addv[num][rt]){
d[num][rt<<]+=(mid-l+)*addv[num][rt];
dmax[num][rt<<]+=addv[num][rt];
dmin[num][rt<<]+=addv[num][rt]; d[num][rt<<|]+=(r-mid) *addv[num][rt];
dmax[num][rt<<|]+=addv[num][rt];
dmin[num][rt<<|]+=addv[num][rt]; addv[num][rt<<]+=addv[num][rt];
addv[num][rt<<|]+=addv[num][rt];
addv[num][rt]=;
}
} void add(int num,int v,int L,int R,int rt,int l,int r)
{ if (L<=l && r<=R){
d[num][rt]+=v*(r-l+);
dmax[num][rt]+=v;
dmin[num][rt]+=v;
addv[num][rt]+=v;
return;
}
pushdown(num,rt,l,r);
int mid=(l+r)>>;
if (L<=mid) add(num,v,L,R,lson);
if (R>mid) add(num,v,L,R,rson);
up(num,rt);
}
void sets(int num,int v,int L,int R,int rt,int l,int r)
{ if (L<=l && r<=R){
d[num][rt]=v*(r-l+);
dmax[num][rt]=v;
dmin[num][rt]=v;
setv[num][rt]=v;
addv[num][rt]=; //set标记直接清除当前的add标记 这里要注意别漏掉
return;
}
pushdown(num,rt,l,r);
int mid=(l+r)>>;
if (L<=mid) sets(num,v,L,R,lson);
if (R>mid) sets(num,v,L,R,rson);
up(num,rt);
}
node query(int num,int L,int R,int rt,int l,int r)
{
int mid=(l+r)>>;
pushdown2(num,rt,l,r);
if (L<=l && r<=R){
node tmp=(node){d[num][rt],dmax[num][rt],dmin[num][rt]};
return tmp;
}
node t1=(node){-,,};
node t2=(node){-,,};
if (L<=mid) t1=query(num,L,R,lson);
if (R>mid) t2=query(num,L,R,rson);
if (t1.tot<) return t2;
if (t2.tot<) return t1;
t1.tot+=t2.tot;
t1.maxn=max(t2.maxn,t1.maxn);
t1.mini=min(t1.mini,t2.mini);
return t1; }
int main()
{
while (scanf("%d%d%d",&r,&c,&m)!=EOF)
{
for (int i=;i<r;i++){
build(i,,,c);
}
while (m--){
int deno,x1,y1,x2,y2,v;
scanf("%d",&deno);
if (deno<=){
scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&v);
x1--;x2--;
for (int i=x1;i<=x2;i++){
if (deno==) add(i,v,y1,y2,,,c);
else sets(i,v,y1,y2,,,c);
}
}
else{
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
x1--;x2--;
node ans;
for (int i=x1;i<=x2;i++){
if (i==x1) ans=query(i,y1,y2,,,c);
else {
node tmp=query(i,y1,y2,,,c);
ans.tot+=tmp.tot;
ans.maxn=max(tmp.maxn,ans.maxn);
ans.mini=min(tmp.mini,ans.mini);
}
}
printf("%d %d %d\n",ans.tot,ans.mini,ans.maxn);
}
}
}
return ;
}

UVA 11992 懒惰标记应用的更多相关文章

  1. 【HDU 4614】Vases and Flowers(线段树区间更新懒惰标记)

    题目0到n-1的花瓶,操作1在下标a开始插b朵花,输出始末下标.操作2清空[a,b]的花瓶,求清除的花的数量.线段树懒惰标记来更新区间.操作1,先查询0到a-1有num个空瓶子,然后用线段树的性质,或 ...

  2. bzoj1251 序列终结者(Splay Tree+懒惰标记)

    Description 网上有许多题,就是给定一个序列,要你支持几种操作:A.B.C.D.一看另一道题,又是一个序列 要支持几种操作:D.C.B.A.尤其是我们这里的某人,出模拟试题,居然还出了一道这 ...

  3. 【POJ】3468 A Simple Problem with Integers ——线段树 成段更新 懒惰标记

    A Simple Problem with Integers Time Limit:5000MS   Memory Limit:131072K Case Time Limit:2000MS Descr ...

  4. 【HDU】4092 Nice boat(多校第四场1006) ——线段树 懒惰标记

    Nice boat Time Limit: 30000/15000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) To ...

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

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

  6. poj3468 线段树的懒惰标记

    题目链接:poj3468 题意:给定一段数组,有两种操作,一种是给某段区间加c,另一种是查询一段区间的和 思路:暴力的方法是每次都给这段区间的点加c,查询也遍历一遍区间,复杂度是n*n,肯定过不去,另 ...

  7. FZU-1608 Huge Mission 线段树(更新懒惰标记)

    题目链接: https://cn.vjudge.net/problem/FZU-1608 题目大意: 长度n,m次操作:每次操作都有三个数:a,b,c:意味着(a,b]区间单位长度的价值为c,若某段长 ...

  8. hdu1698 Just a Hook (线段树区间更新 懒惰标记)

    Just a Hook Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  9. HDU 4107 Gangster(线段树 特殊懒惰标记)

    两种做法. 第一种:标记区间最大值和最小值,若区间最小值>=P,则本区间+2c,若区间最大值<P,则本区间+c.非常简单的区间更新. 最后发一点牢骚:最后query查一遍就行,我这个2B竟 ...

随机推荐

  1. 留学Essay写作:精准用词很重要

    很多觉得自己英语成绩还行的同学经常在自己的文章里用一些浮夸或者是难度特别大的词语,以显示自己的英语水平.当然了,成功了倒也无可厚非,要是有些词语用错了那可是会被别人笑掉大牙的.因此英语中的精准用词就成 ...

  2. CF 1198 A. MP3 模拟+滑动窗口

    A. MP3   题意:给你n个数,一个大小为8*I的容量,保存一个数需要多少容量取决于给定n个数的种类k,用公式 log2 k   计算,如果给定的容量不能保存所有数,选择减少数的种类来降低保存一个 ...

  3. HihoCoder第一周与POJ3974:最长回文字串

    这个题目是hihoCoder第一周的题目,自己打算从第一周开始做起,不知道能追上多少,更不知道这一篇写完,下一篇会是什么时候... 题意很简单. 输入: abababa aaaabaa acacdas ...

  4. springboot自定义属性文件与bean映射注入属性值

    主要有几点: 一.导入依赖 springboot的包和: <dependency> <groupId>org.springframework.boot</groupId& ...

  5. JS动态判断设备类型为PC或者移动端,然后根据设备加载相应的代码

    这里是通过JS判断设备之后加载相应的网站,如果是移动端加载m开头的网站域名,如果是PC端就加载 www.开头的正式域名 <script> (function () { var url = ...

  6. Day6 - G - 立方体大作战tet HYSBZ - 1106

    一个叫做立方体大作战的游戏风靡整个Byteotia.这个游戏的规则是相当复杂的,所以我们只介绍他的简单规则:给定玩家一个有2n个元素的栈,元素一个叠一个地放置.这些元素拥有n个不同的编号,每个编号正好 ...

  7. Redis详解(五)——主从复制

    Redis详解(五)--主从复制 面临问题 机器故障.我们部署到一台 Redis 服务器,当发生机器故障时,需要迁移到另外一台服务器并且要保证数据是同步的.而数据是最重要的,如果你不在乎,基本上也就不 ...

  8. Make the PE file consistent when code not changed

    参考:http://www.mouseos.com/assembly/06.html 参考:http://www.cnblogs.com/tk091/archive/2012/04/18/245617 ...

  9. yolov3.cfg参数解读

    对于模型的优化,我们可以通过适当修改网络基本配置信息完成训练上的优化. yolov3.cfg文件: [net]# Testing #测试模式 batch=1 subdivisions=1# Train ...

  10. 四、Vue过渡与动画、过渡css类名、自定义指定、过滤器

    一.过渡 动画 1.1简单的过渡动画使用 parent.vue [0]定义一个待显示的数据 [1]定义一个显示隐藏flag [2]使用动画过滤标签,name用来连接style样式:v-show用来控制 ...