http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1335

1335: 高桥和低桥

Time Limit: 1 Sec  Memory Limit: 128 MB

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

HINT

分析:

数据比较大,更新 + 查找 + 遍历 时间复杂度很高,会有超时,所以想到用树状数组来存储,用lowbit()查找 更新。

AC代码:

 #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 ;
}

还可以用lower_bound()解决。

 #include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std; int h[];
int f[]; int main() {
int n,m,k,kase = ;
while(~scanf("%d %d %d",&n,&m,&k)) {
memset(f,,sizeof(f)); for(int i = ;i < n;i++) {
scanf("%d",&h[i]);
} sort(h,h+n); int s = ,t;
int up,dwn;
for(int i = ;i < m;i++) {
scanf("%d %d",&up,&dwn);
int lft = lower_bound(h,h+n,s+) - h;
int rit = lower_bound(h,h+n,up+) - h;
s = dwn;
f[lft]++;
f[rit]--;
//printf("---\n");
} int ss = ,res = ;
//printf("------\n");
for(int i = ;i < n;i++) {
ss += f[i];
if(ss >= k) res++;
//printf("2---\n");
}
printf("Case %d: %d\n",kase++,res);
}
return ;
}

csuoj 1335: 高桥和低桥的更多相关文章

  1. CSU 1335: 高桥和低桥 (二分查找,树状数组)

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

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

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

  3. CSU 1335 高桥和低桥

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

  4. H - 高桥和低桥

    H - 高桥和低桥 Time Limit:1000MS     Memory Limit:131072KB     64bit IO Format:%lld & %llu Submit Sta ...

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

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

  6. UVA 12663 第九届省赛 高桥与低桥 线段树

    题意很简单,n个桥的高度是事先给出来的,然后有m次涨水与落水的高度,问有多少座桥在这m次涨落之后 被淹超过了k次,如果某桥本身被水淹了,此时再涨水,就不能算多淹一次 看下数据10的五次方,10的五次方 ...

  7. 科普TPF知识

    https://tieba.baidu.com/p/4926092734?see_lz=1&pn=1 707680700 https://tieba.baidu.com/p/492609273 ...

  8. 对GBK的理解(内附全部字符编码列表):扩充的2万汉字低字节的高位不等于1,而且还剩许多编码空间没有利用

    各种编码查询表:http://bm.kdd.cc/ 由于GB 2312-80只收录6763个汉字,有不少汉字,如部分在GB 2312-80推出以后才简化的汉字(如“啰”),部分人名用字(如中国前总理朱 ...

  9. Tarjan算法:求解图的割点与桥(割边)

    简介: 割边和割点的定义仅限于无向图中.我们可以通过定义以蛮力方式求解出无向图的所有割点和割边,但这样的求解方式效率低.Tarjan提出了一种快速求解的方式,通过一次DFS就求解出图中所有的割点和割边 ...

随机推荐

  1. Iphone H5上传照片被旋转

    最近做项目发现在Iphone下,我们上传图片都会被翻转,最后查阅资料发现,的确是IOS的问题 不说过程,直接解决方法 iOS下,html方式使用<input type="file&qu ...

  2. Java实验报告五:Java网络编程及安全

    Java实验报告五:Java网络编程及安全                                                                               ...

  3. PHP 日期比较

    $temptime = mktime(8,2,12,4,4,2014);$dt1 = date("Y-m-d",time());$dt2 = date("Y-m-d&qu ...

  4. start from here

    简单介绍下,小码农一只,工作两年左右,从事移动端游戏开发工作. 人类,精神正常,男,爱好游戏音乐足球美女,if(有妹子) 喜欢旅游;,取向正常. 很喜欢java,喜欢关注新技术, 应一些朋友的建议,今 ...

  5. (leetcode)Implement Stack using Queues

    Implement the following operations of a stack using queues. push(x) -- Push element x onto stack. po ...

  6. Four Operations---hdu5938(暴力)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5938 题意:给一个不超过20位并且大于2位的数字字符串(只包含1-9)然后找到适当的位置依次放入&qu ...

  7. Mockups

    Balsamiq Mockups 是一款免费的手绘风格的产品原型设计软件,它一经推出就广受好评,它比纸质的产品原型设计图更加方便存储,而且是简约清爽的手绘风格,UI控件支持自动拖拽,并且可以实现自动对 ...

  8. JS-004-判断元素显示状态

    在日常的 web 编程或 UI自动化脚本编写过程中,经常会遇到判断页面元素的显示状态,以对应的执行相应的操作.此文主要以 js 判断页面元素的存在状态为例,简单叙述一下 js 是如何判断元素的显示状态 ...

  9. asp.net mvc 简单搜索功能

    View中代码: <input type="text" class="searchText" id="searchText"/> ...

  10. I.MX6 WIFI wireless_tools 移植

    /******************************************************************************** * I.MX6 WIFI wirel ...