CF915E Physical Education Lessons
珂朵莉树吼啊!!!
操作唯一:区间赋值,上模板就阔以了
代码:
#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\n",num);
}
return 0;
}

浙公网安备 33010602011771号