[BZOJ1651] [Usaco2006 Feb]Stall Reservations 专用牛棚
2015-10-14 19:28
417 查看
传送门
http://www.lydsy.com/JudgeOnline/problem.php?id=1651题目大意
给出奶牛运动的时间段,询问同一时间最多的奶牛数题解
线段树或差分序列线段树
var x:array[0..3000000,1..4]of longint; i,j,k:longint; n,a,b,m:longint; function max(a,b:longint):longint; begin if a>b then exit(a) else exit(b); end; procedure build(a,l,r:longint); var mid:longint; begin x[a,1]:=l; x[a,2]:=r; if l=r then exit; mid:=(l+r)>>1; build(a*2,l,mid); build(a*2+1,mid+1,r); end; procedure pushdown(a:longint); begin if x[a,1]=x[a,2] then begin x[a,4]:=0; exit; end; inc(x[a*2,3],x[a,4]); inc(x[a*2,4],x[a,4]); inc(x[a*2+1,3],x[a,4]); inc(x[a*2+1,4],x[a,4]); x[a,4]:=0; end; procedure update(a,l,r:longint); var mid:longint; begin if x[a,4]<>0 then pushdown(a); if (l=x[a,1])and(r=x[a,2]) then begin inc(x[a,3]); inc(x[a,4]); exit; end; mid:=(x[a,1]+x[a,2])>>1; if r<=mid then update(a*2,l,r) else if l>mid then update(a*2+1,l,r) else begin update(a*2,l,mid); update(a*2+1,mid+1,r); end; x[a,3]:=max(x[a*2,3],x[a*2+1,3]); end; begin readln(n); build(1,1,1000000); for i:=1 to n do begin readln(a,b); update(1,a,b); end; writeln(x[1,3]); end.
差分序列
学习了一下~差分是相邻两个数的差值,序列是所有的差值排成序列
我们考虑区间加上一个相同的数a,[L,R],那么对于差分序列x[l]+a,x[r+1]-a
最后用前缀和判断最大值即可
var sum,x:array[0..1000005]of longint; i,j,k:longint; n,a,b,ans:longint; begin fillchar(x,sizeof(x),0); fillchar(sum,sizeof(sum),0); readln(n); for i:=1 to n do begin readln(a,b); inc(x[a]); dec(x[b+1]); end; ans:=0; for i:=1 to 1000005 do begin sum[i]:=sum[i-1]+x[i]; if ans<sum[i] then ans:=sum[i]; end; writeln(ans); end.
相关文章推荐
- js求字符长度
- 实例演示(列表一个开其余的关)
- Buffett saying
- JS连续滚动幻灯片:原理与实现
- Java StringBuffer类
- bootstrap的流式布局
- JavaScript的面向对象
- html分析器——jericho-html-3.3分解table
- jQuery EasyUI API 中文文档 - ComboGrid 组合表格
- thread-safe 和 reentrant
- JS学习之闭包、this关键字、预解释、作用域综合
- 东北大学地理位置数据JSON版
- javascript循环性能优化的几种方法
- Jquery中$.ajax $.post load用法与区别
- JavaScript中字体浮动的简单演示实例
- WEB前端性能分析--工具篇
- JS控制div显示隐藏
- 前端学习笔记
- 键盘事件 提交表单 JQUERY
- js ajax 加载图片 img的简单方法