[USACO08NOV]lites

嘟嘟嘟

 

竟然还能发现这么水的题。就是线段树维护区间亦或嘛~~~~

 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 }
View Code

 

posted @ 2018-08-23 16:22  mrclr  阅读(154)  评论(0编辑  收藏  举报