Flowers(二分水过。。。)

Flowers

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 2579    Accepted Submission(s): 1265

Problem Description

As
is known to all, the blooming time and duration varies between
different kinds of flowers. Now there is a garden planted full of
flowers. The gardener wants to know how many flowers will bloom in the
garden in a specific time. But there are too many flowers in the garden,
so he wants you to help him.

Input

The first line contains a single integer t (1 <= t <= 10), the number of test cases.
For
each case, the first line contains two integer N and M, where N (1
<= N <= 10^5) is the number of flowers, and M (1 <= M <=
10^5) is the query times.
In the next N lines, each line contains two integer Si and Ti (1 <= Si <= Ti <= 10^9), means i-th flower will be blooming at time [Si, Ti].
In the next M lines, each line contains an integer Ti, means the time of i-th query.

Output

For
each case, output the case number as shown and then print M lines. Each
line contains an integer, meaning the number of blooming flowers.
Sample outputs are available for more details.

Sample Input

2
1 1
5 10
4
2 3
1 4
4 8
1
4
6

Sample Output

Case #1:
0
Case #2:
1
2
1

题解:类似颜色段那题,突发奇想,二分搞了搞,upper,lower那错了半天,想了一组数据才发现问题;

代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<cstring>
 5 #include<algorithm>
 6 using namespace std;
 7 const int INF=0x3f3f3f3f;
 8 const double PI=acos(-1);
 9 #define mem(x,y) memset(x,y,sizeof(x))
10 const int MAXN=1e5+100;
11 int s[MAXN],e[MAXN];
12 int main(){
13     int t,M,N,flot=0;
14     scanf("%d",&t);
15     while(t--){
16         scanf("%d%d",&N,&M);
17         for(int i=0;i<N;i++){
18             scanf("%d%d",&s[i],&e[i]);
19         }
20         sort(s,s+N);sort(e,e+N);
21         int q;
22         printf("Case #%d:\n",++flot);
23     //    for(int i=0;i<N;i++)printf("%d ",s[i]);puts("");
24     //    for(int i=0;i<N;i++)printf("%d ",e[i]);puts("");
25         while(M--){
26             scanf("%d",&q);
27             int x=upper_bound(s,s+N,q)-s;
28             int y=lower_bound(e,e+N,q)-e;
29             //printf("%d %d\n",x,y);
30         //    if(e[y-1]==q)y--;
31         //    if(s[x]==q)x++;
32             printf("%d\n",x-y);
33         }
34     }
35     return 0;
36 }
时间: 2024-12-28 21:18:53

Flowers(二分水过。。。)的相关文章

cogs 942. [東方S3] 比那名居天子

二次联通门 : cogs 942. [東方S3] 比那名居天子 /* cogs 942. [東方S3] 比那名居天子 二分水题 二分所求区间长度 判断后缩小范围即可 */ #include <cstring> #include <cstdio> #define Max 1000000 void read (int &now) { now = 0; register char word = getchar (); while (word < '0' || word &g

AC日记——[Sdoi2010]粟粟的书架 bzoj 1926

1926 思路: 主席树+二分水题: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 500005 #define maxr 205 #define maxn_ maxn*13 #define FalseAns "Poor QLW" int n,m,q,lc[maxn_],rc[maxn_],num[maxn_],ci[maxn_],tot,root[maxn]; int ai[maxn],bi[

【POJ 1019】 Number Sequence

[POJ 1019] Number Sequence 二分水题 放组合数学里...可能有什么正规姿势吧Orz 112123123412345...这种串 分成长度1 2 3 4 5...的串 注意有多位数 把长度累加到一个数组里 注意要累加 因为查询的时候查的是原串中对应位置的数 因此要累加上前一次的长度 然后二分处该串前的总长 用查询的位置-之前串的总长 就是在最长的串中的位置 因此还要打个最长串的表 这些我都写一个循环里了 看着有点乱 可以拆开写... 代码如下: #include <ios

codeVS1138 聪明的质监员

二分水题.为什么要写这道题呢,因为要辨明long long的读入与输出. 经过俩天的调试(我还以为我代码写错了)... 发现codeVS,tyvj输入输出用lld,vijos用I64d 这篇题解除了我应该也不会有人看见..所以肯定还会有大量人入坑. 呜呼哀哉. #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> #include<iostream> usin

bzoj1816: [Cqoi2010]扑克牌(二分答案判断)

1816: [Cqoi2010]扑克牌 题目:传送门 题解: 被一道毒瘤题搞残了...弃了坑来刷刷水题 一开始还想复杂了...结果发现二分水过: 二分答案...然后check一下,joker肯定尽量用mid次,那么哪种牌不够就补(因为每次只能补一种,所以如果次数用完就return false) 代码: 1 #include<cstdio> 2 #include<cstring> 3 #include<cstdlib> 4 #include<cmath> 5

bzoj4129 Haruna’s Breakfast 树上带修莫队+分块

题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4129 题解 考虑没有修改的序列上的版本应该怎么做: 弱化的题目应该是这样的: 给定一个序列,每次询问区间 \([l, r]\) 中元素的最小没有出现的自然数. 这个弱化的版本可以用离线+线段树二分水掉.但是这个做法显然不太好搬到树上做. 上面的弱化版还有一个莫队做法:可以用莫队维护出来每一个区间的每一个数的出现为次数.把出现过的数通过分块表示出来,于是查询的时候枚举每一个块,寻找第一个不满的

Codeforces #258 Div.2 E Devu and Flowers

大致题意: 从n个盒子里面取出s多花,每个盒子里面的花都相同,并且每个盒子里面花的多数为f[i],求取法总数. 解题思路: 我们知道如果n个盒子里面花的数量无限,那么取法总数为:C(s+n-1, n-1) = C(s+n-1, s). 可以将问题抽象成:x1+x2+...+xn = s, 其中0<=xi <= f[i],求满足条件的解的个数. 两种方法可以解决这个问题: 方法一:这个问题的解可以等价于:mul = (1+x+x^2+...+x^f[1])*(1+x+x^2+...+x^f[2]

表视图控制器(TableViewController)(二)

1 tableView的编辑模式 1.1 问题 表视图可以进入编辑模式,当进入编辑模式就可以进行删除.插入.移动单元等操作,本案例还是使用联系人界面学习如何进入编辑模式,以及进入编辑模式之后的删除.插入.移动等操作,如图-1所示: 图-1 1.2 方案 首先还是创建一个带导航的TRContactTableViewController对象做为根视图控制器. 其次创建一个TRContact类用于管理联系人信息,有两个NSString类型的属性分别为name和phoneNumber,本案例为了学习方便

605. Can Place Flowers【easy】

605. Can Place Flowers[easy] Suppose you have a long flowerbed in which some of the plots are planted and some are not. However, flowers cannot be planted in adjacent plots - they would compete for water and both would die. Given a flowerbed (represe