珂朵莉树吼啊!!!
操作唯一:区间赋值,上模板就阔以了
代码:
#include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #include<set> #define Set set<Node>::iterator #define N 1000000007 using namespace std; struct Node { int l,r; mutable int val; Node(int L,int R,int V):l(L),r(R),val(V){} Node(int L):l(L){} bool operator<(const Node &it)const { return l<it.l; } }; set<Node> st; int n,m,num; Set Split(int x) { Set it=st.lower_bound(Node(x)); if(it!=st.end()&&it->l==x) return it; --it; int L=it->l,R=it->r,V=it->val; st.erase(it); st.insert(Node(L,x-1,V)); return st.insert(Node(x,R,V)).first; } void Change(int l,int r,int v) { int now=0; Set rr=Split(r+1),ll=Split(l); for(Set it=ll;it!=rr;++it) if(it->val!=v) now+=it->r-it->l+1; num+=(v==1?now:-now); st.erase(ll,rr); st.insert(Node(l,r,v)); } int main() { scanf("%d%d",&n,&m); num=n; st.insert(Node(1,n,1)); st.insert(Node(n+1)); for(int i=1;i<=m;++i) { int opt,l,r; scanf("%d%d%d",&l,&r,&opt); if(opt==1) Change(l,r,0); else Change(l,r,1); printf("%d ",num); } return 0; }