这题也算比较容易的了。
如果哪个区间已经没有黑色的话,就不用update了,就是因为这个原因WA了2发,唉……
#include <iostream> #include <cstdio> #include <algorithm> #include <cmath> #include <deque> #include <vector> #include <queue> #include <string> #include <cstring> #include <map> #include <stack> #include <set> #define PI acos(-1.0) #define mem(a,b) memset(a,b,sizeof(a)) #define sca(a) scanf("%d",&a) #define sc(a,b) scanf("%d%d",&a,&b) #define pri(a) printf("%d\n",a) #define lson i<<1,l,mid #define rson i<<1|1,mid+1,r #define MM 2000004 #define MN 1008 #define INF 2000000000 #define eps 1e-8 using namespace std; typedef long long ll; typedef unsigned long long ULL; ll sum[MM]; int val[MM]; void pushUp(int i) { sum[i]=sum[i<<1]+sum[i<<1|1]; } void pushDown(int i) { if(val[i]) { sum[i]=sum[i<<1]=sum[i<<1|1]=0; val[i]=0; } } void build(int i,int l,int r) { if(l==r) { sum[i]=1; return ; } int mid=(l+r)>>1; build(lson),build(rson); pushUp(i); } void update(int i,int l,int r,int L,int R) { if(L<=l&&r<=R) { val[i]=1; sum[i]=0; return ; } int mid=(l+r)>>1; pushDown(i); if(sum[i]) //如果这个i的区间已经为0就不用再进行下去了 { if(L>mid) update(rson,L,R); else if(R<=mid) update(lson,L,R); else { update(lson,L,mid); update(rson,mid+1,R); } } pushUp(i); } int main() { int n,m,l,r; sc(n,m); build(1,1,n); while(m--) { sc(l,r); update(1,1,n,l,r); printf("%lld\n",sum[1]); } return 0; }
Wikilo 1191线段树区间修改单点查询,布布扣,bubuko.com
原文地址:http://blog.csdn.net/u011466175/article/details/25420677