中文题面,一排有n个馒头,用刷子把整个连续的区间刷成一种颜色.因为颜色会覆盖掉之前的.所以我们可以用线段树来反着处理.如果这段区间之前刷到过就不要再遍历进去了,因为这次已经被上次刷的颜色给覆盖了.最后遍历线段树到叶子节点,输出最后的值就行了. #include<bits/stdc++.h> using namespace std; #define ll long long #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1
/* 经典思路, 倒序并查集处理即可 */ #include<cstdio> #include<algorithm> #include<cstring> #include<queue> #include<iostream> #define ll long long #define mmp make_pair #define M 1000010 using namespace std; int read() { int nm = 0, f = 1;
题意:懒得写了有空再补上 链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2054 离线从后往前做,并查集维护下一个没染色的就可以啦- #include<bits/stdc++.h> using namespace std; ; long long n, m, p, q; int fa[MAXN], color[MAXN]; template <typename tn> void read (tn & a) { tn x
BZOJ 倒序处理,就是并查集傻题了.. 并查集就是确定下一个未染色位置的,直接跳到那个位置染.然而我越想越麻烦=-= 以为有线性的做法,发现还是要并查集.. 数据随机线段树也能过去. //18400kb 2520ms #include <cstdio> #include <algorithm> typedef long long LL; const int N=1e6+5; int fa[N],col[N]; char OUT[N*10],*O=OUT; inline int F
[题意]给定n个元素,m次给一段区间染色为i,求最终颜色. [算法]并查集 [题解]因为一个点只受最后一次染色影响,所以倒过来每次将染色区间用并查集合并,父亲指向最右边的点. 细节: 1.fa[n+1]=n+1!!!界外点要赋值为自身!!! 2.swap(l,r),涉及双端点的题都要注意. #include<cstdio> #include<algorithm> using namespace std; ; int n,m,p,q,fa[maxn],col[maxn]; int f