COGS——T 2739. 凯伦和咖啡

http://www.cogs.pro/cogs/problem/problem.php?pid=2739

★★☆   输入文件:coffee.in   输出文件:coffee.out   简单对比
时间限制:1 s   内存限制:512 MB

【题目描述】

为了在上课时保持清醒,凯伦需要一些咖啡。咖啡爱好者凯伦想知道最佳的温度来冲煮完美的咖啡。因此,她花了一些时间阅读几本食谱,其中包括广受好评的“咖啡的艺术”。

她知道有n个食谱,其中第i个食谱建议应当在li和ri度之间冲煮以达到最佳的味道。凯伦认为如果至少k个食谱推荐某个温度,那么那个温度是可以接受的。

凯伦的性格比较多变,因此她会问q个问题,对于每一个问题,她会给出一个温度区间[a,b],你要告诉她有多少可接受的整数温度在这个范围内。

【输入格式】

第一行输入包含三个整数,n,k(1≤k≤n≤200000)和q(1≤q≤200000),如题中所描述。

接下来n行描述每一个食谱,具体来说,其中的第i行包含两个整数li和ri(1≤li≤ri≤200000),描述第i个食谱建议咖啡在li和ri度之间进行冲煮(包括端值)。

接下来q行为q个询问。这些行中的每一行都包含a和b,(1≤a≤b≤200000),表示她想知道a和b度之间的可接受的整数温度的数量,包括a和b。

【输出格式】

对于每个询问,一行输出一个答案。

【样例输入】

3 2 4

91 94

92 97

97 99

92 94

93 97

95 96

90 100

【样例输出】

3

3

0

4

【提示】

数据进行了更新,卡掉了部分暴力程序。

【来源】

线段树//分块//(好像有线性作法呃呃呃)

 1 #include <cstdio>
 2 
 3 const int N(200000+5);
 4 int n,q,k;
 5 struct Tree
 6 {
 7     int l,r,sum,flag,ret;
 8 }tr[N<<2];
 9 #define lc (now<<1)
10 #define rc (now<<1|1)
11 #define mid (tr[now].l+tr[now].r>>1)
12 void Tree_build(int now,int l,int r)
13 {
14     tr[now].l=l,tr[now].r=r;
15     if(l==r)
16     {
17         tr[now].flag=1;
18         tr[now].sum=0;
19         return ;
20     }
21     Tree_build(lc,l,mid);
22     Tree_build(rc,mid+1,r);
23 }
24 void Tree_add(int now,int l,int r)
25 {
26     if(tr[now].l>=l&&tr[now].r<=r)
27     {
28         tr[now].sum++;
29         return ;
30     }
31     if(r<=mid) Tree_add(lc,l,r);
32     else if(l>mid) Tree_add(rc,l,r);
33     else Tree_add(lc,l,mid),Tree_add(rc,mid+1,r);
34 }
35 int Tree_query(int now,int l,int r)
36 {
37     if(tr[now].l==l&&tr[now].r==r) return tr[now].sum;
38     if(r<=mid) return Tree_query(lc,l,r);
39     else if(l>mid) return Tree_query(rc,l,r);
40     else return Tree_query(lc,l,mid)+Tree_query(rc,mid+1,r);
41 }
42 void Tree_push(int now)
43 {
44     if(tr[now].flag)
45     {
46         if(tr[now].sum>=k) tr[now].sum=1;
47         else tr[now].sum=0;
48         return ;
49     }
50     tr[lc].sum+=tr[now].sum;
51     tr[rc].sum+=tr[now].sum;
52     tr[now].sum=0;
53     Tree_push(lc); Tree_push(rc);
54     tr[now].sum=tr[lc].sum+tr[rc].sum;
55 }
56 
57 inline void read(int &x)
58 {
59     x=0; register char ch=getchar();
60     for(;ch>'9'||ch<'0';) ch=getchar();
61     for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0';
62 }
63 
64 #define swap(a,b) {int tmp=a;a=b;b=tmp;}
65 int AC()
66 {
67     freopen("coffee.in","r",stdin);
68     freopen("coffee.out","w",stdout);
69     read(n),read(k),read(q);
70     Tree_build(1,1,N);
71     for(int l,r;n--;)
72     {
73         read(l),read(r);
74         if(l>r) swap(l,r);
75         Tree_add(1,l,r);
76     }
77     Tree_push(1);
78     for(int l,r;q--;)
79     {
80         read(l),read(r);
81         if(l>r) swap(l,r);
82         printf("%d
",Tree_query(1,l,r));
83     }
84     return 0;
85 }
86 
87 int Hope=AC();
88 int main(){;}
——每当你想要放弃的时候,就想想是为了什么才一路坚持到现在。
原文地址:https://www.cnblogs.com/Shy-key/p/7465273.html