UVA11992不错的线段树段更新
题意:
给你一个矩阵,最大20*50000的,然后有三个操作
1 x1 y1 x2 y2 v 把子矩阵的值全部都加上v
2 x1 y1 x2 y2 v 把子矩阵的值全部都变成v
2 x1 y1 x2 y2 查询子矩阵的和,最大值,最小值
思路:
首先我们观察,矩阵的行最多20行,那么我们就可以把每一行都建一颗线段树,这样就变成了一个一维的线段树段更新问题了,然后还有一个问题,就是操作1,和操作2,这两个操作放在一起感觉有些棘手,看白书上的思路不懂,没办法自己想了好久,想到了一个比较笨的思路,但感觉应该容易理解点,最近天天写软件,没怎么刷题,今天1a了感觉很开心啊,废话补多少回来说1,2的问题,我是这样想的,主要就是处理好延迟跟新的那个地方,总结就是一句话,在关系(延迟更新的是更改还是增加)传递的时候遇到“更改”那么下面的所有经过的点的属性都变成更改,其他情况直接由父节点传递过来,这么说可能不懂,我再换个角度说,对于某一个点,无论之前做过什么操作,如果现在是面临"更改"(不是增加)那么之前的操作全都无效,直接更改,如果面临的是增加操作,那么如果上一步是更改操作的话,那么从这一步起,之后就变成更改操作,具体细节可以看下面代码,自己想的思路可能不是很正宗,有点乱。
#include<stdio.h>
#include<string.h>
#define R 20 + 2
#define C 200000 + 100
#define lson l ,mid ,t << 1
#define rson mid + 1 ,r ,t << 1 | 1
typedef struct
{
int sum ,min ,max;
}NODE;
int Sum[R][C] ,Max[R][C] ,Min[R][C];
int mark[R][C] ,mks[R][C];
int NOWI;
int maxx(int x ,int y)
{
return x > y ? x : y;
}
int minn(int x ,int y)
{
return x < y ? x : y;
}
void Pushup(int t)
{
Sum[NOWI][t] = Sum[NOWI][t << 1] + Sum[NOWI][t << 1 | 1];
Max[NOWI][t] = maxx(Max[NOWI][t << 1] ,Max[NOWI][t << 1 | 1]);
Min[NOWI][t] = minn(Min[NOWI][t << 1] ,Min[NOWI][t << 1 | 1]);
return ;
}
void Pushdown(int l ,int r ,int t)
{
if(mark[NOWI][t])
{
int ll = r - l + 1;
if(mks[NOWI][t] == 1)
{
mark[NOWI][t<<1] = mark[NOWI][t<<1|1] = mark[NOWI][t];
mks[NOWI][t<<1] = mks[NOWI][t<<1|1] = mks[NOWI][t];
Sum[NOWI][t<<1] = (ll - ll / 2) * mark[NOWI][t];
Sum[NOWI][t<<1|1] = (ll / 2) * mark[NOWI][t];
Max[NOWI][t<<1] = Max[NOWI][t<<1|1] = mark[NOWI][t];
Min[NOWI][t<<1] = Min[NOWI][t<<1|1] = mark[NOWI][t];
}
else
{
mark[NOWI][t<<1] += mark[NOWI][t];
mark[NOWI][t<<1|1] += mark[NOWI][t];
if(mks[NOWI][t<<1] != 1) mks[NOWI][t<<1] = 2;
if(mks[NOWI][t<<1|1] != 1) mks[NOWI][t<<1|1] = 2;
Sum[NOWI][t<<1] += (ll - ll / 2) * mark[NOWI][t];
Sum[NOWI][t<<1|1] += (ll / 2) * mark[NOWI][t];
Max[NOWI][t<<1] += mark[NOWI][t];
Max[NOWI][t<<1|1] += mark[NOWI][t];
Min[NOWI][t<<1] += mark[NOWI][t];
Min[NOWI][t<<1|1] += mark[NOWI][t];
}
mark[NOWI][t] = mks[NOWI][t] = 0;
}
}
void BuidTree()
{
memset(mark ,0 ,sizeof(mark));
memset(mks ,0 ,sizeof(mks));
memset(Sum ,0 ,sizeof(Sum));
memset(Max ,0 ,sizeof(Max));
memset(Min ,0 ,sizeof(Min));
}
void Update(int l ,int r ,int t ,int a ,int b ,int c ,int mk)
{
if(a <= l && b >= r)
{
if(mk == 1)
{
Sum[NOWI][t] = (r - l + 1) * c;
Max[NOWI][t] = Min[NOWI][t] = c;
mark[NOWI][t] = c;
mks[NOWI][t] = 1;
}
else
{
Sum[NOWI][t] += (r - l + 1) * c;
Max[NOWI][t] += c;
Min[NOWI][t] += c;
mark[NOWI][t] += c;
if(mks[NOWI][t] != 1) mks[NOWI][t] = 2;
}
return;
}
Pushdown(l ,r ,t);
int mid = (l + r) >> 1;
if(a <= mid) Update(lson ,a ,b ,c ,mk);
if(b > mid) Update(rson ,a ,b ,c ,mk);
Pushup(t);
return;
}
NODE Query(int l ,int r ,int t ,int a ,int b)
{
if(a <= l && b >= r)
{
NODE Ans;
Ans.sum = Sum[NOWI][t];
Ans.max = Max[NOWI][t];
Ans.min = Min[NOWI][t];
return Ans;
}
Pushdown(l ,r ,t);
int tsum = 0 ,tmin = 1000000000 ,tmax = -1000000000;
int mid = (l + r) >> 1;
if(a <= mid)
{
NODE now = Query(lson ,a ,b);
tsum += now.sum;
if(tmin > now.min) tmin = now.min;
if(tmax < now.max) tmax = now.max;
}
if(b > mid)
{
NODE now = Query(rson ,a ,b);
tsum += now.sum;
if(tmin > now.min) tmin = now.min;
if(tmax < now.max) tmax = now.max;
}
NODE Ans;
Ans.sum = tsum ,Ans.min = tmin ,Ans.max = tmax;
return Ans;
}
int main ()
{
int x1 ,y1 ,x2 ,y2 ,key ,v ,r ,c ,m ,i;
while(~scanf("%d %d %d" ,&r ,&c ,&m))
{
BuidTree();
while(m--)
{
scanf("%d" ,&key);
if(key == 1)
{
scanf("%d %d %d %d %d" ,&x1 ,&y1 ,&x2 ,&y2 ,&v);
for(i = x1 ;i <= x2 ;i ++)
{
NOWI = i;
Update(1 ,c ,1 ,y1 ,y2 ,v ,2);
}
}
else if(key == 2)
{
scanf("%d %d %d %d %d" ,&x1 ,&y1 ,&x2 ,&y2 ,&v);
for(i = x1 ;i <= x2 ;i ++)
{
NOWI = i;
Update(1 ,c ,1 ,y1 ,y2 ,v ,1);
}
}
else
{
scanf("%d %d %d %d" ,&x1 ,&y1 ,&x2 ,&y2);
NODE Ans ,NOW;
for(i = x1 ;i <= x2 ;i ++)
{
NOWI = i;
NOW = Query(1 ,c ,1 ,y1 ,y2);
if(i == x1) Ans = NOW;
else
{
Ans.sum += NOW.sum;
Ans.max = maxx(Ans.max ,NOW.max);
Ans.min = minn(Ans.min ,NOW.min);
}
}
printf("%d %d %d\n" ,Ans.sum ,Ans.min ,Ans.max);
}
}
}
}
/*
4 4 8
1 1 2 4 4 5
3 2 1 4 4
1 1 1 3 4 2
3 1 2 4 4
3 1 1 3 4
2 2 1 4 4 2
3 1 2 4 4
1 1 1 4 3 3
45 0 5
78 5 7
69 2 7
39 2 7
*/
UVA11992不错的线段树段更新的更多相关文章
- hdu4267线段树段更新,点查找,55棵线段树.
题意: 给你N个数,q组操作,操作有两种,查询和改变,查询就是查询当前的这个数上有多少,更改是给你a b k c,每次从a到b,每隔k的数更改一次,之间的数不更改,就相当于跳着更新. 思路: ...
- hdu4046 不错的线段树单点更新
题意: 给一个字符串,两种操作 0 a b 询问a,b之间有多少个wbw, 1 a c 就是把第a个改成c. 思路: 这个题目我们可以用线段树的点更新来做,一开始写了个好长好长 ...
- hdu1556 线段树段更新(简单题)
题意: N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的"小飞鸽"牌电动车从气球a开始到气球b依次给每个 ...
- POJ2528线段树段更新逆序异或(广告牌)
题意: 可以这样理解,有一条直线,然后用n条线段去覆盖,最后问全部都覆盖完之后还有多少是没有被完全覆盖的. 思路: 一开始想的有点偏,想到起点排序,然后..失败了,原因是忘记了题目 ...
- POJ3277 线段树段更新,点询问+二分离散化+暴力
题意: x轴上有一些矩形,问你这些矩形覆盖的面积和是多少. 思路: 首先范围很大,n很小,果断离散化,然后我们就是求出任意区间的最大值作为当前区间的高,最后在算一遍答案就行了, ...
- ZOJ 1610 Count the Colors (线段树区间更新)
题目链接 题意 : 一根木棍,长8000,然后分别在不同的区间涂上不同的颜色,问你最后能够看到多少颜色,然后每个颜色有多少段,颜色大小从头到尾输出. 思路 :线段树区间更新一下,然后标记一下,最后从头 ...
- zoj 1610 Count the Colors(线段树延迟更新)
所谓的懒操作模板题. 学好acm,英语很重要.做题的时候看不明白题目的意思,我还拉着队友一块儿帮忙分析题意.最后确定了是线段树延迟更新果题.我就欣欣然上手敲了出来. 然后是漫长的段错误.... 第一次 ...
- HDU 1166 敌兵布阵(线段树单点更新,板子题)
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- UESTC 1591 An easy problem A【线段树点更新裸题】
An easy problem A Time Limit: 2000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others ...
随机推荐
- 记离线部署docker,以及docker下部署zabbix
一.离线安装docker 下载地址:https://download.docker.com/linux/static/stable/x86_64/ 上传软件并解压 [root@localhost op ...
- python分离不同后缀名的文件
功能描述 根据文件后缀名处理文件,分别拷贝到对应的文件夹下 example >>> .jpg 后缀 和.mp4 后缀文件处理 代码实现 #!/usr/bin/env python # ...
- Netty源码 reactor 模型
翻阅源码时,我们会发现netty中很多方法的调用都是通过线程池的方式进行异步的调用, 这种 eventLoop.execute 方式的调用,实际上便是reactor线程.对应项目中使用广泛的NioE ...
- 迷宫问题(DFS)
声明:图片及内容基于https://www.bilibili.com/video/BV1oE41177wk?t=3245 问题及分析 8*8的迷宫,最外周是墙,0表示可以走,1表示不可以走 设置迷宫 ...
- 【.net core】三种注入方式的区别
AddTransient瞬时模式:每次请求,都获取一个新的实例.即使同一个请求获取多次也会是不同的实例 AddScoped:每次请求,都获取一个新的实例.同一个请求获取多次会得到相同的实例 AddSi ...
- Python接口自动化实现
一.代码结构: 二.接口签名实现: 1. 设所有发送的数据集合为M,将集合M内非空参数值的参数按照[参数名+"="+参数值]的ASCII码从小到大排序(字典序),然后按拼接key1 ...
- 10 分钟轻松学会 Jackson 反序列化自动适配子类
作者:丁仪 来源:https://chengxuzhixin.com/blog/post/Jackson-fan-xu-lie-hua-zi-dong-shi-pei-zi-lei.html json ...
- 美图录爬虫(requests模块,re模块)
Python 爬虫 最近学正则表达式,刚好知道这个网站美图录,就做了个爬虫拿来练练手,说一说遇到的问题 一 404问题 问题: 由于图片显示页面是分页的,每一页展示5张图片,为了方便没有每次去获取下一 ...
- DNS 缓存中毒--Kaminsky 攻击复现
0x00 搭建实验环境 使用3台Ubuntu 16.04虚拟机,可到下面的参考链接下载 攻击的服务是BIND9,由于条件限制,这里使用本地的一台虚拟机当作远程DNS解析器,关闭了DNSSEC服务,其中 ...
- 文件连接--ln
ln -n file1 file2 将文件2设置为文件1的软连接:file1和file2 任何一个改动都会反馈到另一方,删除源文件, 软连接文件不可用 ln -s file1 file2 将文件2 ...