传送门
【题目分析】
线段树大板题,主要就是靠码量和debug能力。。。
既然涉及到区间取反,那么同时记录0和1的信息。
对于0,1操作,打上区间覆盖标记即可。
对于2操作,打区间取反标记,但注意如果该区间已经打了区间覆盖标记,那么其实取反标记作用只是将0改为1,所以可以直接将区间取反标记赋为0,覆盖标记取亦或。
对于3操作,直接统计即可。
对于操作4,考虑两种情况:1.当前区间maxmid为区间长,那么可以取左右两区间的左右最长。2.否则直接取左边最长,右边最长再与中间作比较取最大值即可。
代码细节很多,调起来很难受qwq
【代码~】
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e5+10;
const int INF=0x3f3f3f3f;
int n,q,ans,maxx;
int a[MAXN];
struct Tree{
int l,r;
int maxl[2],maxr[2],mmid[2];
int cnt[2];
int cov;
int rev;
}tr[MAX