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(){;}