Mayor‘s posters

编程入门 行业动态 更新时间:2024-10-07 18:27:56

<a href=https://www.elefans.com/category/jswz/34/1758784.html style=Mayor‘s posters"/>

Mayor‘s posters

一维染色问题

这一类题目,一般都有一个固定的样式,当你对题目进行简化以后,总会得到类似与下面这种模型类似:

在一条数轴上,依次进行n次操作,每次操作读入3个数,x,y,z,表示在区间[x,y]中涂上颜色z,后涂上的颜色会覆盖之前涂上的颜色。问最后我们还能看到几种颜色,是哪几种,所覆盖的长度分别为多少?(1≤x≤y≤1e5,n≤1e5)

对于这种题目,初次见到这种题目的同学可能会一脸懵逼,毫无头绪。首先我们先观察一下数据范围,嗯,1≤x≤y≤1e5,n≤1e5,普通的暴力算法复杂度达到了O(n^2),是我们所不能接受的,这个时候,我们就可以考虑怎么样用线段树优化掉一维的n变为log n。

我们考虑可以对于从前往后进行染色,每一次染色都当作一次区间修改,每次强行进行区间修改染色,最后将线段树从上向下的pushup一下,把标记全部下传到根节点就好了

假如我们初始的空白线段长度为8,我们先新开一棵线段树:(注意建树时每个节点的是否被染色的标记都要初始化)

第一次操作,我们把[3,5]染成红色,按照区间修改的思路,把完全覆盖的区间改为红色,并且打上lazy标记:

第二次操作,我们把[5,8]染成绿色,按照区间修改的思路,把完全覆盖的区间改为绿色,并且打上lazy标记:

第三次操作,我们把[8,8]染成黄色,在经过绿色标记是时,我们有标记的点下传后再进行操作,按照区间修改的思路,把完全覆盖的区间改为黄色,并且打上lazy标记:

最后一次操作,把[1,4]染成紫色,按照区间修改的思路,把完全覆盖的区间改为紫色,并且打上lazy标记:


在操纵完成后,我们自上而下把标记全部下传到叶子节点就是最后序列的样子了:

金典题目:Mayor’s posters
注意一组数据

3
3
5 6
4 5
6 8
3
1 10
1 3
6 10

5
1 4
2 6
8 10
3 4
7 10
正确答案应该是:
2
3
4

首先要离散化但要注意上面指出的样例
简单的来说就是再距离大2的两个点中间加入一个点防止中间有染色区间在离散化后不出现的情况

#include<iostream>
#include<algorithm>
#include<set>
#include<vector>
using namespace std;typedef long long ll;
typedef unsigned long long ull;
typedef pair<ll, ll>pll;
typedef pair<int, int>pii;
const ll N = 1e6 + 5;
const ll MOD = 998244353;
const ll INF = 0x7fffffff;
int w[N];
struct node {int l, r;int color;//区间染色的情况,0为未染色
} tree[N <<

更多推荐

Mayor‘s posters

本文发布于:2024-02-13 13:04:39,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1758487.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:Mayor   posters

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!