还是模板题。。。直接暴力即可。。。ODT是个好的数据结构啊。。。 #includeiostream #include stdio.h #include string .h #include algorithm #include set #define LL long long using namespace std; const int N = 1e5+ 6 ,
还是模板题。。。直接暴力即可。。。ODT是个好的数据结构啊。。。
#include<iostream> #include<stdio.h> #include<string.h> #include<algorithm> #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; } }; set<node>s; typedef set<node>::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; }