【差分+前缀和】BZOJ1637: [Usaco2007 Mar]Balanced Lineup
2015-06-09 01:45
417 查看
Description
Farmer John 决定给他的奶牛们照一张合影,他让 N (1 ≤ N ≤ 50,000) 头奶牛站成一条直线,每头牛都有它的坐标(范围: 0..1,000,000,000)和种族(0或1)。 一直以来 Farmer John 总是喜欢做一些非凡的事,当然这次照相也不例外。他只给一部分牛照相,并且这一组牛的阵容必须是“平衡的”。平衡的阵容,指的是在一组牛中,种族0和种族1的牛的数量相等。 请算出最广阔的区间,使这个区间内的牛阵容平衡。区间的大小为区间内最右边的牛的坐标减去最做边的牛的坐标。 输入中,每个种族至少有一头牛,没有两头牛的坐标相同。Solution
设s[i]为前i头牛为1的牛数-为0的牛数显然对于合法区间(l,r],s[l]==s[r]
扫一遍对于每个s统计下最左和最右就行了
秒之
Code
#include<cstdio> #include<algorithm> using namespace std; const int maxn=1e5+5; struct cow{ int dfn,dis; bool operator<(const cow&b) const{return dis<b.dis;} }a[maxn]; int s[maxn],l[maxn],r[maxn]; int n; int main(){ scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d%d",&a[i].dfn,&a[i].dis); sort(a+1,a+n+1); for(int i=1;i<=n;i++){ if(a[i].dfn) s[i]=s[i-1]+1; else s[i]=s[i-1]-1; int x=s[i]+n; if(!l[x]) l[x]=i; else r[x]=i; } int ans=0; for(int i=0;i<=2*n;i++) if(l[i]&&r[i]) ans=max(ans,a[r[i]].dis-a[l[i]+1].dis); printf("%d\n",ans); return 0; }
相关文章推荐
- 【POJ 1753】Flip Game
- LeetCode | Palindrome Number
- linux fdisk 下磁盘查看命令分享很简单
- Codeforces Round #306 (Div. 2) (ABCE题解)
- OpenLayers学习笔记5——使用jQuery UI实现查询并标注(UI篇)
- Java NIO使用及原理分析 (四)
- [Swust OJ 1094]--中位数(巧用set,堆排序)
- shutdown reboot init 重启命令 关机命令 简单介绍
- HDU 5266 pog loves szh III ( LCA + SegTree||RMQ )
- qt大全(连接)
- EXCEL文件行交替背景色设置
- HDU 5265 pog loves szh II
- win8中如何设定editplus为txt默认打开程序
- 循环顺序队列2——使用标示位判断队满或空
- EXCEL内的字符比较公式
- 2015区域赛起航
- 菜鸟学Android笔记(二十六):Response数据输出
- APP Launchimage软件启动图片
- 黑马程序员_多线程间通信
- UVA 10635 Prince and Princess 最长公共子序列(nlongn)