csu 1335 高桥和低桥(树状数组+二分)
2014-10-10 18:50
218 查看
输入所有桥的高度后先对桥排序。
对于每次潮水,先二分求出当前在水面下的有多少桥a,再二分求出涨潮后水面下有多少桥b;
将a+1至b这些桥被淹次数+1;
将当前水面高度改为退潮后的。
这就变成了区间修改单点查询问题,使用树状数组
树状数组给区间a-b加上n的操作为add(a,n),add(b+1,-n)。查询某一点是sum(i)
代码:
对于每次潮水,先二分求出当前在水面下的有多少桥a,再二分求出涨潮后水面下有多少桥b;
将a+1至b这些桥被淹次数+1;
将当前水面高度改为退潮后的。
这就变成了区间修改单点查询问题,使用树状数组
树状数组给区间a-b加上n的操作为add(a,n),add(b+1,-n)。查询某一点是sum(i)
代码:
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define LL long long using namespace std; int N; int c[100005]; int a[100005]; int lowbit(int n){ return n&(-n); } int add(int p,int n){ while(p<=N){ c[p]+=n; p+=lowbit(p); } } int sum(int p){ int res=0; while(p>0){ res+=c[p]; p-=lowbit(p); } return res; } int main(){ int m,k; int flag=1; while(~scanf("%d%d%d",&N,&m,&k)){ memset(c,0,sizeof(c)); for(int i=0;i<N;i++){ scanf("%d",&a[i]); } sort(a,a+N); int cur=1; while(m--){ int s,t; scanf("%d%d",&s,&t); int now=upper_bound(a,a+N,cur)-a; int aft=upper_bound(a,a+N,s)-a; add(now+1,1); add(aft+1,-1); cur=t; } int res=0; for(int i=1;i<=N;i++){ if(sum(i)>=k){ res++; } } printf("Case %d: %d\n",flag++,res); } return 0; }
相关文章推荐
- 【扫描线或树状数组】CSU 1335 高桥和低桥
- CSU 1335 高桥和低桥(树状数组)
- CSU 1335 高桥和低桥(二分)
- CSU 1335 高桥和低桥(二分)
- CSU 1335 高桥和低桥(二分)
- CSU 1335 高桥和低桥(二分)
- CSU 1335 高桥和低桥(二分)
- CSU 1335 高桥和低桥(二分)
- CSU 1335 高桥和低桥(二分)
- csu 1335: 高桥和低桥(二分+扫气球)
- CSU 1335 高桥和低桥(二分)
- CSU 1335 高桥和低桥(二分)
- CSU 1335 高桥和低桥(二分)
- CSU 1335: 高桥和低桥(树状数组啊 二分查找啊 湖南省第九届大学生计算机程序设计竞赛)
- CSU 1335 高桥和低桥(二分)
- CSU 1335: 高桥和低桥 (二分查找,树状数组)
- CSU 1335 高桥和低桥(二分)
- CSU 1335 高桥和低桥(二分)
- CSU 1335 高桥和低桥(二分)
- HDU 2852 KiKi's K-Number(树状数组+二分)