传送门
一眼看下来感觉就是线段树,但修了很久才修好.这题有一个很坑的点,不只有线段染色,还有单点染色,所以不能用i表示i-i+1有线段,不然的话单点染色无法操作.所以只能用i表示点.而维护线段的连通性可以在左右两端加两个标记,lc,rc.lc表示左端有线段连到左边,rc表示右端有线段连到右边.然后在修改的过程中修改这两个标记.
#define LL long long
#define pq priority_queue
#define ULL unsigned long long
#define pb push_back
#define mem(a,x) memset(a,x,sizeof a)
#define pii pair<int,int>
#define fir(i,a,b) for(int i=a;i<=(int)b;++i)
#define afir(i,a,b) for(int i=(int)a;i>=b;--i)
#define ft first
#define vi vector<int>
#define sd second
#define ALL(a) a.begin(),a.end()
#define bug puts("-------")
#define mpr(a,b) make_pair(a,b)
#define lson(i) tree[i].l
#define rson(i) tree[i].r
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5+10;
inline void read(int &a){
int x = 0,f=1;char ch = getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')f=-1;ch=getchar();}
while(ch<='9'&&ch>='0'){
x=x*10+ch-'0';ch=getchar();}
a = x*f