[BZOJ1637][Usaco2007 Mar]Balanced Lineup
2015-09-10 20:44
423 查看
传送门
http://www.lydsy.com/JudgeOnline/problem.php?id=1637题目大意
给n个位置上有两种物品,选出两种物品数相同的最大区间长度题解
非常神奇的前缀和ORZ我们可以发现两个种类如果分别定义为1和-1,那么要选取的[L,R]的区间和一定为0,那么sum[L-1]=sum[R],然后扫一遍就可以了
var sum,x,y:array[0..50000]of longint; t:array[-50000..50000]of longint; i,j,k:longint; ans,n:longint; function max(a,b:longint):longint; begin if a>b then exit(a) else exit(b); end; procedure sort(l,r:longint); var i,j,a,b: longint; begin i:=l; j:=r; a:=x[(l+r) div 2]; repeat while x[i]<a do inc(i); while a<x[j] do dec(j); if not(i>j) then begin b:=x[i]; x[i]:=x[j]; x[j]:=b; b:=y[i]; y[i]:=y[j]; y[j]:=b; inc(i); dec(j); end; until i>j; if l<j then sort(l,j); if i<r then sort(i,r); end; begin readln(n); for i:=1 to n do begin readln(y[i],x[i]); if y[i]=0 then y[i]:=-1; end; sort(1,n); {x[i]} ans:=0; sum[0]:=0; fillchar(t,sizeof(t),0); for i:=1 to n do begin sum[i]:=sum[i-1]+y[i]; if t[sum[i]]=0 then t[sum[i]]:=x[i+1] else ans:=max(ans,x[i]-t[sum[i]]); end; writeln(ans); end.
相关文章推荐
- Gradle Android它自己的编译脚本教程的最新举措(提供demo源代码)
- Codeforces Round #318 [RussianCodeCup Thanks-Round] (Div. 2)
- java 知识
- nginx优化
- 面向对象特性
- 赛码在线编程1001
- Android手机屏幕到手机间的距离
- oracle查看未提交事务
- Spring Framework 下载链接_现在有空
- CAN总线(一)
- 聚合算法总结
- MySQL之DDL、DML、读锁,写锁、显示锁、事务、隔离级别详解
- Android开发笔记——拨号器
- nginx源码安装
- Win7,Win8的扩展卷功能只能在分区的尾部继续向后延伸
- CodeForces 11A - Increasing Sequence
- 2015-9-10
- C++数据类型总结
- Android网络编程随想录(1)
- 自动备份网站