CF915E Physical Education Lessons(珂朵莉树)

还是模板题。。。直接暴力即可。。。ODT是个好的数据结构啊。。。

 #include
 #include
 #include<string.h>
 #include
 #include<set>
 #define LL long long
 using namespace std;
 const int N = 1e5+6,mod = 1e9+7;
 struct node{
   int l,r;
   mutable int v;
   node(int L,int R,int V):l(L),r(R),v(V){}
   inline bool operator < (const node& b)const{
       return l<b.l;
   }
};
sets;
typedef set::iterator IT;
int ans;
inline IT split(int pos){
   IT it = s.lower_bound(node(pos,pos,0));
   if(it!=s.end() && it->l==pos)return it;
   --it;
   int l=it->l,r=it->r,v=it->v;
   s.erase(it);
   s.insert(node(l,pos-1,v));
   return s.insert(node(pos,r,v)).first;
}
inline void assigns(int l,int r,int v){
    ///注意分裂应该是从右边先开始分裂,
    ///因为如果先从左边分裂,那么在L和R相同的时候,把R+1的区间给分裂掉,造成找不到R导致RE
    ///但是先分裂右边,那么it2不会把it1分裂掉
    IT it2=split(r+1),it1=split(l);
    IT it=it1;
    for (;it!=it2;++it){
        ans-=it->v*(it->r - it->l+1);
    }
    s.erase(it1,it2);
    ans+=(r-l+1)*v;
    s.insert(node(l,r,v));
}
int main(){
   int n,m;
   int l,r,op;
   scanf("%d",&n);
   scanf("%d",&m);
   ans=n;
   s.insert(node(1,n,1));
   while(m--){
       scanf("%d%d%d",&l,&r,&op);
       if (op==1){
          assigns(l,r,0);
       }else {
          assigns(l,r,1);
       }
       printf("%d\n",ans);
   }
   return 0;
}

 

你可能感兴趣的:(CF915E Physical Education Lessons(珂朵莉树))