csuoj 1335: 高桥和低桥
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: 高桥和低桥的更多相关文章
- CSU 1335: 高桥和低桥 (二分查找,树状数组)
Description 有个脑筋急转弯是这样的:有距离很近的一高一低两座桥,两次洪水之后高桥被淹了两次,低桥却只被淹了一次,为什么?答案是:因为低桥太低了,第一次洪水退去之后水位依然在低桥之上,所以不 ...
- 【扫描线或树状数组】CSU 1335 高桥和低桥
http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1335 [题意] 给定n座桥的高度,给定m次洪水每次的涨水水位ai和退水水位bi 询问有多少座桥 ...
- CSU 1335 高桥和低桥
开始队友说是线段树,看了看貌似也是,上手敲了个嵌套的线段树,O(nlognlogn)的复杂度果断tle了 TAT 思路:对h[i]排序,对每次涨水退水,先用二分查找,再用一个数组保存当前点之后所有点被 ...
- H - 高桥和低桥
H - 高桥和低桥 Time Limit:1000MS Memory Limit:131072KB 64bit IO Format:%lld & %llu Submit Sta ...
- TZOJ 4602 高桥和低桥(二分或树状数组+二分)
描述 有个脑筋急转弯是这样的:有距离很近的一高一低两座桥,两次洪水之后高桥被淹了两次,低桥却只被淹了一次,为什么?答案是:因为低桥太低了,第一次洪水退去之后水位依然在低桥之上,所以不算“淹了两次”.举 ...
- UVA 12663 第九届省赛 高桥与低桥 线段树
题意很简单,n个桥的高度是事先给出来的,然后有m次涨水与落水的高度,问有多少座桥在这m次涨落之后 被淹超过了k次,如果某桥本身被水淹了,此时再涨水,就不能算多淹一次 看下数据10的五次方,10的五次方 ...
- 科普TPF知识
https://tieba.baidu.com/p/4926092734?see_lz=1&pn=1 707680700 https://tieba.baidu.com/p/492609273 ...
- 对GBK的理解(内附全部字符编码列表):扩充的2万汉字低字节的高位不等于1,而且还剩许多编码空间没有利用
各种编码查询表:http://bm.kdd.cc/ 由于GB 2312-80只收录6763个汉字,有不少汉字,如部分在GB 2312-80推出以后才简化的汉字(如“啰”),部分人名用字(如中国前总理朱 ...
- Tarjan算法:求解图的割点与桥(割边)
简介: 割边和割点的定义仅限于无向图中.我们可以通过定义以蛮力方式求解出无向图的所有割点和割边,但这样的求解方式效率低.Tarjan提出了一种快速求解的方式,通过一次DFS就求解出图中所有的割点和割边 ...
随机推荐
- oracle utf8字符集转gbk(转)
近日有同事在外面部署系统时,安装数据库时可能选择了UTF-8编码格式,导入insert语句时,一个汉字被认为三个字节,这是不行的. 结合上网搜到的资料,将oracle数据库的编码格式,从utf-8改为 ...
- ubuntu12.04 安装 php5.4/php5.5
1:修改源(我使用163的源)直接修改/etc/apt/sources.list deb http://mirrors.163.com/ubuntu/ precise main universe re ...
- Bootstrap 输入框和导航组件
一.输入框组件 //在左侧添加文字 <div class="input-group"> <span class="input-group-addon&q ...
- self.nsme 和 _name 的问题
.h文件 @interface myclass:NSObject @property(nonatomic,retain)NSArray*MyArray; @end .m文件 @implementati ...
- JQuery直接调用asp.net后台WebMethod方法
利用JQuery的$.ajax()可以很方便的调用asp.net的后台方法.[WebMethod] 命名空间 1.无参数的方法调用, 注意:1.方法一定要静态方法,而且要有[WebMethod]的 ...
- swift-03-构造器(Designated&&Convenience)
类里面所有的存储型属性--包括所有继承自父类的属性,都必须在构造过程中设置初始值. 构造器,为了确保所有类实例中的存储型属性都能获得初始值,设置了两个构造器--他们分别是指定构造器和便利构造器. ...
- js保留n位小数
1.功能:将浮点数四舍五入,取小数点后2位 function toDecimal(num) { var f = parseFloat(num); if (isNaN(f)) { return; } f ...
- C# RichTextBox 滚动条 滚动到最后一行
使用RichTextBox控件用于显示数据时,滚动条只停留在开头,而我希望能够一直更新,显示最后一行的内容.解决方法记录于此. 转载自以下链接: http://blog.csdn.net/xelone ...
- iOS GCD简单使用
Grand Central Dispatch (GCD) 1)运行在主线程的Main queue,通过dispatch_get_main_queue获取. /*!* @function dispatc ...
- thinkphp 最简单的引入百度编辑器的方法
后台肯定是框架了...编辑器放在框架里面... 后台首页比如是这样的... <html> <frameset cols="10%,90%"> <fra ...