[CF816B] Karen and Coffee(前缀和,思维)

题目链接:http://codeforces.com/contest/816/problem/B

题意:一个大区间被n条线覆盖,接下来有q次询问,询问[l,r]内有多少个点被>=k个线覆盖。

区间两头左闭右开打标记,左边+1右边-1,维护这个标记的前缀和,再维护一个前缀和,找到上一个前缀和里>=k的点,更新到当前的前缀和里就是了。 
 1 #include <algorithm>
 2 #include <iostream>
 3 #include <iomanip>
 4 #include <cstring>
 5 #include <climits>
 6 #include <complex>
 7 #include <cassert>
 8 #include <cstdio>
 9 #include <bitset>
10 #include <vector>
11 #include <deque>
12 #include <queue>
13 #include <stack>
14 #include <ctime>
15 #include <set>
16 #include <map>
17 #include <cmath>
18 using namespace std;
19 #define fr first
20 #define sc second
21 #define cl clear
22 #define BUG puts("here!!!")
23 #define W(a) while(a--)
24 #define pb(a) push_back(a)
25 #define Rint(a) scanf("%d", &a)
26 #define Rll(a) scanf("%lld", &a)
27 #define Rs(a) scanf("%s", a)
28 #define Cin(a) cin >> a
29 #define FRead() freopen("in", "r", stdin)
30 #define FWrite() freopen("out", "w", stdout)
31 #define Rep(i, len) for(int i = 0; i < (len); i++)
32 #define For(i, a, len) for(int i = (a); i < (len); i++)
33 #define Cls(a) memset((a), 0, sizeof(a))
34 #define Clr(a, x) memset((a), (x), sizeof(a))
35 #define Full(a) memset((a), 0x7f7f7f, sizeof(a))
36 #define lrt rt << 1
37 #define rrt rt << 1 | 1
38 #define pi 3.14159265359
39 #define RT return
40 #define lowbit(x) x & (-x)
41 #define onenum(x) __builtin_popcount(x)
42 typedef long long LL;
43 typedef long double LD;
44 typedef unsigned long long ULL;
45 typedef pair<int, int> pii;
46 typedef pair<string, int> psi;
47 typedef pair<LL, LL> pll;
48 typedef map<string, int> msi;
49 typedef vector<int> vi;
50 typedef vector<LL> vl;
51 typedef vector<vl> vvl;
52 typedef vector<bool> vb;
53 
54 const int maxn = 200200;
55 int n, k, q;
56 int line[maxn];
57 int sum[maxn];
58 
59 signed main() {
60     // FRead();
61     int x, y;
62     while(~Rint(n)) {
63         Rint(k); Rint(q);
64         Cls(line); Cls(sum);
65         Rep(i, n) {
66             Rint(x); Rint(y);
67             line[x]++; line[y+1]--;
68         }
69         For(i, 1, 200020) {
70             line[i] += line[i-1];
71             if(line[i] >= k) sum[i] = sum[i-1] + 1;
72             else sum[i] = sum[i-1];
73         }
74         W(q) {
75             Rint(x); Rint(y);
76             printf("%d\n", sum[y]-sum[x-1]);
77         }
78     }
79     RT 0;
80 }

 

posted @ 2017-06-18 11:55  Kirai  阅读(232)  评论(0编辑  收藏  举报