bzoj2436
不难发现两边的活动是交替进行的,我们可以dp
先对时间离散化,设f[i,j]到时间i一个会场选j个活动,另一个会场最多有多少活动,那么f[i,j]=max(f[k,j]+s[k,i],f[k,j-s[k,i]])
然后第一问的答案就是max(min(f[n*2,i],i))
第二问是要求必选一个,那这一定形如中间一段必须选,向左向右分别dp
假设中间那段是(i,j)时最优值是g[i,j]
肯定要预处理时间i前一个会场选j个活动,另一个会场最多有多少活动和时间i到结束一个会场选j个活动,另一个会场最多有多少活动
我们记为fl[i,j],fr[i,j],不难得到g[i,j]=max{min(x+y+s[i,j],fl[i,x]+fr[j,y])} (注意到f[]数组的两个会场取值是对称的)
处理g[i,j]是O(n4)的,拍几组数据可以发现当i,j固定时,随着x的增大,对应最优的y减小
其实主观上也很好理解,肯定是两个会场活动尽量平衡,证明吗……不会……
var fl,fr,f,g:array[..,..] of longint;
a,s,e:array[..] of longint;
i,n,m,k,j,x,y,ans,t:longint; procedure max(var a:longint; b:longint);
begin
if a<b then a:=b;
end; function min(a,b:longint):longint;
begin
if a>b then exit(b) else exit(a);
end; procedure swap(var a,b:longint);
var c:longint;
begin
c:=a;
a:=b;
b:=c;
end; procedure sort(l,r:longint);
var i,j,x:longint;
begin
i:=l;
j:=r;
x:=a[(l+r) shr ];
repeat
while a[i]<x do inc(i);
while x<a[j] do dec(j);
if not(i>j) then
begin
swap(a[i],a[j]);
inc(i);
dec(j);
end;
until i>j;
if l<j then sort(l,j);
if i<r then sort(i,r);
end; function find(l,r,x:longint):longint;
var m:longint;
begin
while l<=r do
begin
m:=(l+r) shr ;
if a[m]=x then exit(m);
if a[m]>x then r:=m- else l:=m+;
end;
end; begin
readln(n);
for i:= to n do
begin
readln(s[i],e[i]);
e[i]:=s[i]+e[i];
inc(t);
a[t]:=s[i];
inc(t);
a[t]:=e[i];
end;
sort(,t);
m:=;
for i:= to t do
if a[i]<>a[m] then
begin
inc(m);
a[m]:=a[i];
end;
for i:= to n do
begin
s[i]:=find(,m,s[i]);
e[i]:=find(,m,e[i]);
inc(g[s[i],e[i]]);
end;
for i:= to m do
for j:=i+ to m do
inc(g[i,j],g[i,j-]);
for j:= to m do
for i:=j- downto do
inc(g[i,j],g[i+,j]);
for i:= to m+ do
for j:= to n do
begin
fl[i,j]:=-n;
fr[i,j]:=-n;
end;
fl[,]:=; fr[m+,]:=;
for i:= to m do
for j:= to i- do
for k:= to n do
begin
max(fl[i,k],fl[j,k]+g[j,i]);
if k>=g[j,i] then max(fl[i,k],fl[j,k-g[j,i]]);
end;
for i:=m downto do
for j:=i+ to m+ do
for k:= to n do
begin
max(fr[i,k],fr[j,k]+g[i,j]);
if k>=g[i,j] then max(fr[i,k],fr[j,k-g[i,j]]);
end;
ans:=;
for i:= to n do
max(ans,min(fl[m,i],i));
writeln(ans);
for i:= to m do
for j:=i to m do
begin
y:=g[j,m];
for x:= to g[,i] do
begin
while (y>) and (min(x+y-+g[i,j],fl[i,x]+fr[j,y-])>=min(x+y+g[i,j],fl[i,x]+fr[j,y])) do dec(y);
max(f[i,j],min(x+y+g[i,j],fl[i,x]+fr[j,y]));
end;
end; for i:= to n do
begin
ans:=;
for x:= to s[i] do
for y:=e[i] to m do
max(ans,f[x,y]);
writeln(ans);
end;
end.
bzoj2436的更多相关文章
- BZOJ2436 [Noi2011]Noi嘉年华 【dp】
题目链接 BZOJ2436 题解 看这\(O(n^3)\)的数据范围,可以想到区间\(dp\) 发现同一个会场的活动可以重叠,所以暴力求出\(num[l][r]\)表示离散化后\([l,r]\)的完整 ...
- 【BZOJ2436】【NOI2011】NOI嘉年华(动态规划)
[BZOJ2436]NOI嘉年华(动态规划) 题面 BZOJ 题解 考虑第一问如何求解 发现状态与选择了哪些活动无关,只与时间有关 设\(f[i][j]\)表示前\(i\)个单位时间(离散后),一个嘉 ...
- 【BZOJ-2436】嘉年华 DP + 优化
2436: [Noi2011]Noi嘉年华 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 529 Solved: 382[Submit][Statu ...
- bzoj2436: [Noi2011]Noi嘉年华
我震惊了,我好菜,我是不是该退役(苦逼) 可以先看看代码里的注释 首先我们先考虑一下第一问好了真做起来也就这个能想想了 那么离散化时间是肯定的,看一手范围猜出是二维DP,那对于两个会场,一个放自变量, ...
- OI动态规划&&优化 简单学习笔记
持续更新!! DP的难点主要分为两类,一类以状态设计为难点,一类以转移的优化为难点. DP的类型 序列DP [例题]BZOJ2298 problem a 数位DP 常用来统计或者查找一个区间满足条件的 ...
- Noip前的大抱佛脚----赛前任务
赛前任务 tags:任务清单 前言 现在xzy太弱了,而且他最近越来越弱了,天天被爆踩,天天被爆踩 题单不会在作业部落发布,所以可(yi)能(ding)会不及时更新 省选前的练习莫名其妙地成为了Noi ...
随机推荐
- 学习KnockOut第三篇之List
学习KnockOut第三篇之List 欲看此篇---------------------------------------------可先看上篇. 第一步,先搭建一个大概的框架起来 ...
- python pip和easy_install使用方式(转载)
easy_install 跟 pip 都是Python 的套件管理程式,有了它们,在使用 Python 开发程式的时候会带来不少方便. easy_install 和pip 有什麼不一样?据 pip 官 ...
- HTML教程XHTML教程:HTML标记嵌套使用技巧
网页制作Webjx文章简介:WEB标准-HTML元素嵌套. 先来看以下这样一段代码: <ul> <li><h4><a href="" ...
- css3选择器笔记
通用选择器ul~p{} 为ul之后的所有p标签设置属性 (ul和p为同级元素)ul+p{} 仅为ul之后的p标签设置属性 (ul和p为相邻元素)div>p 为div之后的p标签设置属性{ d ...
- 【WCF--初入江湖】04 WCF通信模式
04 WCF通信模式 WCF的通信模式有三种 [1]请求响应模式: 只能是客户端调用服务器; 客户端请求并等待服务器的响应后才继续执行后续操作(异步调用除外) [2]单工模式: 只能是客户端调用服务器 ...
- OpenLDAP配置信息记录
随着各种研发工具使用越来越多,单独为每个工具维护一个账号系统的开销越来越大,而且作为用户多个账号密码使用也越来越不方便.所以需要做一个统一账号登陆. 查询了多个方法,又因为之前用过LDAP,所以选择了 ...
- NGINX的奇淫技巧 —— 6. IF实现数学比较功能 (1)
NGINX的奇淫技巧 —— 6. IF实现数学比较功能 (1) ARGUS 1月13日 发布 推荐 0 推荐 收藏 3 收藏,839 浏览 nginx的if支持=.!= 逻辑比较, 但不支持if中 & ...
- WAF安恒
http://wenku.baidu.com/view/c242927f581b6bd97e19ea1a.html?from=search
- Opc
http://www.tuicool.com/articles/nymUz2 http://blog.chinaunix.net/uid-20692368-id-3434001.html http:/ ...
- ****Git 常用命令和使用思维导图
Git 是一个很强大的分布式版本控制系统.它不但适用于管理大型开源软件的源代码,管理私人的文档和源代码也有很多优势. 本来想着只把最有用.最常用的 Git 命令记下来,但是总觉得这个也挺有用.那个也用 ...