竟然还能发现这么水的题。就是线段树维护区间亦或嘛~~~~
1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cmath> 5 #include<cstring> 6 #include<cstdlib> 7 #include<stack> 8 #include<queue> 9 #include<vector> 10 #include<cctype> 11 using namespace std; 12 #define space putchar(' ') 13 #define enter puts("") 14 #define Mem(a) memset(a, 0, sizeof(a)) 15 typedef long long ll; 16 typedef double db; 17 const int INF = 0x3f3f3f3f; 18 const db eps = 1e-8; 19 const int maxn = 1e5 + 5; 20 inline ll read() 21 { 22 ll ans = 0; 23 char ch = getchar(), last = ' '; 24 while(!isdigit(ch)) {last = ch; ch = getchar();} 25 while(isdigit(ch)) {ans = (ans << 3) + (ans << 1) + ch - '0'; ch = getchar();} 26 if(last == '-') ans = -ans; 27 return ans; 28 } 29 inline void write(ll x) 30 { 31 if(x < 0) putchar('-'), x = -x; 32 if(x >= 10) write(x / 10); 33 putchar(x % 10 + '0'); 34 } 35 36 int n, m; 37 38 int l[maxn << 2], r[maxn << 2], sum[maxn << 2], lazy[maxn << 2]; 39 void build(int L, int R, int now) 40 { 41 l[now] = L; r[now] = R; 42 if(L == R) return; 43 int mid = (L + R) >> 1; 44 build(L, mid, now << 1); 45 build(mid + 1, R, now << 1 | 1); 46 } 47 void pushdown(int now) 48 { 49 if(lazy[now]) 50 { 51 sum[now << 1] = r[now << 1] - l[now << 1] + 1 - sum[now << 1]; 52 lazy[now << 1] ^= 1; 53 sum[now << 1 | 1] = r[now << 1 | 1] - l[now << 1 | 1] + 1 - sum[now << 1 | 1]; 54 lazy[now << 1 | 1] ^= 1; 55 lazy[now] = 0; 56 } 57 } 58 void update(int L, int R, int now) 59 { 60 if(l[now] == L && r[now] == R) 61 { 62 sum[now] = (R - L + 1) - sum[now]; 63 lazy[now] ^= 1; return; 64 } 65 pushdown(now); 66 int mid = (l[now] + r[now]) >> 1; 67 if(R <= mid) update(L, R, now << 1); 68 else if(L > mid) update(L, R, now << 1 | 1); 69 else update(L, mid, now << 1), update(mid + 1, R, now << 1 | 1); 70 sum[now] = sum[now << 1] + sum[now << 1 | 1]; 71 } 72 int query(int L, int R, int now) 73 { 74 if(l[now] == L && r[now] == R) return sum[now]; 75 pushdown(now); 76 int mid = (l[now] + r[now]) >> 1; 77 if(R <= mid) return query(L, R, now << 1); 78 else if(L > mid) return query(L, R, now << 1 | 1); 79 else return query(L, mid, now << 1) + query(mid + 1, R, now << 1 | 1); 80 } 81 82 int main() 83 { 84 n = read(); m = read(); 85 build(1, n, 1); 86 for(int i = 1; i <= m; ++i) 87 { 88 int d = read(), L = read(), R = read(); 89 if(!d) update(L, R, 1); 90 else write(query(L, R, 1)), enter; 91 } 92 return 0; 93 }