Description

有个脑筋急转弯是这样的:有距离很近的一高一低两座桥,两次洪水之后高桥被淹了两次,低桥却只被淹了一次,为什么?答案是:因为低桥太低了,第一次洪水退去之后水位依然在低桥之上,所以不算“淹了两次”。举例说明:

假定高桥和低桥的高度分别是5和2,初始水位为1

第一次洪水:水位提高到6(两个桥都被淹),退到2(高桥不再被淹,但低桥仍然被淹)

第二次洪水:水位提高到8(高桥又被淹了),退到3。

没错,文字游戏。关键在于“又”的含义。如果某次洪水退去之后一座桥仍然被淹(即水位不小于桥的高度),那么下次洪水来临水位提高时不能算“又”淹一次。

输入n座桥的高度以及第i次洪水的涨水水位ai和退水水位bi,统计有多少座桥至少被淹了k次。初始水位为1,且每次洪水的涨水水位一定大于上次洪水的退水水位。

Input

输入文件最多包含25组测试数据。每组数据第一行为三个整数n, m, k(1<=n,m,k<=105)。第二行为n个整数hi(2<=hi<=108),即各个桥的高度。以下m行每行包含两个整数ai和bi(1<=bi<ai<=108, ai>bi-1)。输入文件不超过5MB。

Output

对于每组数据,输出至少被淹k次的桥的个数。

Sample Input

2 2 2
2 5
6 2
8 3
5 3 2
2 3 4 5 6
5 3
4 2
5 2

Sample Output

Case 1: 1
Case 2: 3
题目中有一句关键的话:初始水位为1,且每次洪水的涨水水位一定大于上次洪水的退水水位。
解决办法,线段树统计次数+二分法查找优化
AC代码1:
 #include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
const int N = 1e5+;
int c[N],m,n,k,a[N];
int x[N],y[N];
int lowbit(int k)
{
return k&(-k);
}
void add(int k,int he)//每一项增加一个值
{
while(k>)
{
c[k]+=he;
k-=lowbit(k);
}
}
int search(int x)
{
int tmp=x;
int l=;
int r=n;
int mid;
while(l<r)
{
//printf("%d %d\n",l,r);
mid=((l+r)>>);
if(a[mid]>=tmp) r=mid;
else l=mid+;
}
return r;
}
int Q(int k)
{
int query=;
while(k<=n)
{
query+=c[k];
k+=lowbit(k);
}
return query;
}
int main()
{
int t,from,to,he,kkk=;
while(~scanf("%d%d%d",&n,&m,&k))
{
memset(c,,sizeof(c));
for(int i=;i<=n;i++)
scanf("%d",&a[i]);
sort(a+,a+n+);
for(int i=;i<=m;i++)
{
scanf("%d %d",&x[i],&y[i]);
if(i == )
{
from = i;
to = search(x[i]);
}
else
{
from = search(y[i-]);
to = search(x[i]);
}
add(from,-);
add(to,);
}
int ans = ;
for(int i=;i<=n;i++)
{
int kk =Q(i);
if(kk>=k)
ans = ans+;
}
printf("Case %d: %d\n",kkk++,ans);
}
return ;
}

AC代码二:

 #include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
#include<cmath>
#include<cstdio>
#include<queue>
#define maxn 100000
using namespace std;
int v[maxn];
int f[maxn];
int main()
{
int n,m,qu,i,j,k,sum,a,b,t,da,o=;
int lp;int rp;int *p;
while(~scanf("%d %d %d",&n,&m,&qu))
{
memset(f,,sizeof(f));
a=-,sum=,da=;
for(i=;i<n;i++)
scanf("%d",&v[i]);
sort(v,v+n);
for(i=;i<m;i++)
{
scanf("%d %d",&b,&t);
lp=lower_bound(v,v+n,a+)-v;
rp=lower_bound(v,v+n,b+)-v;
f[lp]+=;
f[rp]-=;
a=t;
}
for(i=;i<n;i++)
{
f[i]+=sum;
sum=f[i];
if(f[i]>=qu)
da++;
//cout<<f[i]<<'\t';
}
printf("Case %d: %d\n",o++,da);
}
return ;
}

CSU 1335: 高桥和低桥 (二分查找,树状数组)的更多相关文章

  1. TZOJ 4602 高桥和低桥(二分或树状数组+二分)

    描述 有个脑筋急转弯是这样的:有距离很近的一高一低两座桥,两次洪水之后高桥被淹了两次,低桥却只被淹了一次,为什么?答案是:因为低桥太低了,第一次洪水退去之后水位依然在低桥之上,所以不算“淹了两次”.举 ...

  2. 【扫描线或树状数组】CSU 1335 高桥和低桥

    http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1335 [题意] 给定n座桥的高度,给定m次洪水每次的涨水水位ai和退水水位bi 询问有多少座桥 ...

  3. Holedox Eating HDU - 4302 2012多校C 二分查找+树状数组/线段树优化

    题意 一个长度$n<=1e5$的数轴,$m<=1e5$个操作 有两种一些操作 $0$  $x$ 在$x$放一个食物 $1$ 一个虫子去吃最近的食物,如果有两个食物一样近,不转变方向的去吃 ...

  4. CSU 1335 高桥和低桥

    开始队友说是线段树,看了看貌似也是,上手敲了个嵌套的线段树,O(nlognlogn)的复杂度果断tle了 TAT 思路:对h[i]排序,对每次涨水退水,先用二分查找,再用一个数组保存当前点之后所有点被 ...

  5. SPOJ TEMPLEQ - Temple Queues(二分查找+树状数组)

    题意: 有N个队伍(1 <= N <= 100,000),每个队伍开始有ai个人[0 <= ai<= 100,000,000],有Q个操作[0<=Q<= 500,0 ...

  6. csuoj 1335: 高桥和低桥

    http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1335 1335: 高桥和低桥 Time Limit: 1 Sec  Memory Limit: 1 ...

  7. [luogu4479][BJWC2018]第k大斜率【二维偏序+二分+离散化+树状数组】

    传送门 https://www.luogu.org/problemnew/show/P4479 题目描述 在平面直角坐标系上,有 n 个不同的点.任意两个不同的点确定了一条直线.请求出所有斜率存在的直 ...

  8. 【BZOJ4009】[HNOI2015]接水果 DFS序+整体二分+扫描线+树状数组

    [BZOJ4009][HNOI2015]接水果 Description 风见幽香非常喜欢玩一个叫做 osu!的游戏,其中她最喜欢玩的模式就是接水果.由于她已经DT FC 了The big black, ...

  9. BZOJ 4009: [HNOI2015]接水果 (整体二分+扫描线 树状数组)

    整体二分+扫描线 树状数组 具体做法看这里a CODE #include <cctype> #include <cstdio> #include <cstring> ...

随机推荐

  1. Ubuntu下Wine使用教程

    转自:http://blog.csdn.net/wangchangshuai0010/article/details/12057251 用了段时间的Ubuntu,感觉很好!可是工作的时候还是要用到 w ...

  2. AS3.0 效率优化

    1.显示对象:1.1.静态的不需互动的图形,使用Shape对象.(eg:getSize(newShape())=236) 1.2.不需要时间轴的互动图形,使用Sprite对象.(eg:getSize( ...

  3. HTTPS 信任证书

    使用HttpsURLConnection访问HTTPS链接时一般需要引入证书,否则会产生异常. 但是也可以使用信任所有证书的方式来达到访问的目的. 经上网查询资料发现一个很好用的类来实现信任所有证书的 ...

  4. war后缀的文件

    其实war文件就是Java中web应用程序的打包.借用一个老兄的话,"当你一个web应用程序很多的时候,如果你想把它部署到别的机器上,来回拷这些文件是件挺郁闷的事情,如果要是一个文件就好了. ...

  5. 流畅的python第十八章使用asyncio包处理并发

    对比一个简单的多线程程序和对应的 asyncio 版,说明多线程和异步任务之间的关系asyncio.Future 类与 concurrent.futures.Future 类之间的区别摒弃线程或进程, ...

  6. 用sencha touch的Cmd创建的MVC工程需要注意的问题

    用ST的cmd创建的js文件都是ANSI编码格式的,所以导致无法正常显示中文.例如传输的参数为中文时就为乱码,导致各种问题... 解决办法:将js文件用记事本打开,另存为,选择编码为UTF-8,覆盖原 ...

  7. g++ 静态库连接顺序的巨坑

    在编译最新版本(12.04)的alljoyn的chat示例的时候,想使用bundle daemon,依照在以前的经验修改文件:alljoyn-14.02.00-src/build/linux/x86_ ...

  8. 如何使用 awk 按模式筛选文本或字符串

    在筛选文本时,有时你可能想根据某个给定的条件或使用一个可被匹配的特定模式,去标记某个文件或数行字符串中的某几行.使用 awk 来完成这个任务是非常容易的,这也正是 awk 中可能对你有所帮助的几个功能 ...

  9. tomcat在ubuntu中设置开机启动

    #!/bin/bash export JAVA_HOME=/usr/lib/jdk/jdk1.7.0_72 WEBROOT_PATH=/home/zhengze/workspace WEBSERVER ...

  10. 绘制函数y=(x^2-2x+1)/(x^2+x+2)的曲线

    代码: <!DOCTYPE html> <html lang="utf-8"> <meta http-equiv="Content-Type ...