BZOJ 2436 NOI嘉年华(单调优化)
http://www.lydsy.com/JudgeOnline/problem.php?id=2436
题意:两个会场不能同时表演,但是同一个时间可以同时表演,要求让两个会场表演数量最小的最大,然后限制某一个必须表演,最小的要最大是多少。。
思路:先将时间离散化,预处理数组num[i][j],代表时间i到时间j一共包含了几个表演。
然后进行dp,pre[i][j],代表1~时间i,会场A表演了j个,此时会场B最多能表演几个。
pre[i][j]=max(pre[i][j+1],pre[k][j]+num[k][i],pre[k][j-num[k][i]]) 后两个分别代表这个区间的表演放到B,和这个区间的表演放到A,
suf[i][j]代表i~时间m,会场A表演了j个,此时会场B最多能表演几个,这个就是同理了
然后第一问的答案就是max(min(i,pre[m][i]))
对于第二问,我们考虑这样设计:
ans[i][j]=max(min(x+y+num[i][j],pre[i][x]+suf[j][y]))
这样的转移是n^4的,不能通过全部数据。
我们考虑令i和j固定,f[x][y]=min(x+y+num[i][j],pre[i][x]+suf[j][y])
再令x固定,y逐渐增大,发现f[x][y]是单峰的!,因此当f[x][y+1]<f[x][y]就可以break了。
原因是x+y+num[i][j]中只有y是在不断增大的,而pre[i][x]+suf[j][y]中suf[j][y]是不断减小的,由于是取min
因此会有一个瞬间x+y+num[i][j]和pre[i][x]+suf[j][y]会达到最接近,然后此时就是最大的答案,之前的和之后的都不是最优的!
#include<cstdio>
#include<cmath>
#include<iostream>
#include<cstring>
#include<algorithm>
struct node{
int s,e;
}a[];
int p[],ans[][],n,suf[][],pre[][],num[][];
int read(){
int t=,f=;char ch=getchar();
while (ch<''||ch>'') {if (ch=='-') f=-;ch=getchar();}
while (''<=ch&&ch<=''){t=t*+ch-'';ch=getchar();}
return t*f;
}
int find(int x){
int l=,r=p[];
while (l<=r){
int mid=(l+r)>>;
if (p[mid]==x) return mid;
else
if (p[mid]<x) l=mid+;
else r=mid-;
}
return ;
}
void init(){
n=read();
for (int i=;i<=n;i++)
a[i].s=read(),a[i].e=read()+a[i].s,p[++p[]]=a[i].s,p[++p[]]=a[i].e;
std::sort(p+,p++p[]);
int j=;
for (int i=;i<=p[];i++)
if (p[i]!=p[j]) p[++j]=p[i];
p[]=j;
for (int i=;i<=n;i++) a[i].s=find(a[i].s),a[i].e=find(a[i].e);
for (int i=;i<=p[];i++)
for (int j=i;j<=p[];j++)
for (int k=;k<=n;k++)
if (i<=a[k].s&&a[k].e<=j) num[i][j]++;
}
void dp(){
for (int i=;i<=;i++)
for (int j=;j<=;j++)
pre[i][j]=suf[i][j]=-;
pre[][]=suf[p[]+][]=;
for (int i=;i<=p[];i++)
for (int k=i;k>=;k--){
pre[i][k]=pre[i][k+];
for (int j=;j<=i-;j++)
pre[i][k]=std::max(pre[i][k],std::max(pre[j][k]+num[j][i],pre[j][k-num[j][i]]));
}
for (int i=p[];i>=;i--)
for (int k=p[]-i+;k>=;k--){
suf[i][k]=suf[i][k+];
for (int j=i+;j<=p[]+;j++)
suf[i][k]=std::max(suf[i][k],std::max(suf[j][k]+num[i][j],suf[j][k-num[i][j]]));
}
for (int i=;i<=p[];i++)
for (int j=i;j<=p[];j++){
int k=+p[]-j;
for (int x=;x<=i;x++)
for (int y=;y<=k;y++)
if (x+y<=n){
int sx=std::min(x+y+num[i][j],pre[i][x]+suf[j][y]);
if (sx<) break;
if (ans[i][j]<sx){
ans[i][j]=sx;
}else break;
}else break;
}
}
void Output(){
int Ans=;
for (int i=;i<=n;i++)
Ans=std::max(std::min(pre[p[]][i],i),Ans);
printf("%d\n",Ans);
for (int i=;i<=n;i++){
Ans=;
for (int j=;j<=p[];j++)
for (int k=j;k<=p[];k++)
if (j<=a[i].s&&a[i].e<=k) Ans=std::max(Ans,ans[j][k]);
printf("%d\n",Ans);
}
}
int main(){
init();
dp();
Output();
}
BZOJ 2436 NOI嘉年华(单调优化)的更多相关文章
- BZOJ 2436 Noi嘉年华(优化DP)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2436 题意:有一些活动,起始时间持续时间已知.有两个场地.每个活动最多只能在一个场地举行 ...
- bzoj 2436: [Noi2011]Noi嘉年华
Description NOI2011 在吉林大学开始啦!为了迎接来自全国各地最优秀的信息学选手,吉林大学决定举办两场盛大的 NOI 嘉年华活动,分在两个不同的地点举办.每个嘉年华可能包含很多个活动, ...
- 2436: [Noi2011]Noi嘉年华 - BZOJ
Description NOI2011 在吉林大学开始啦!为了迎接来自全国各地最优秀的信息学选手,吉林大学决定举办两场盛大的 NOI 嘉年华活动,分在两个不同的地点举办.每个嘉年华可能包含很多个活动, ...
- 【BZOJ 2436】 2436: [Noi2011]Noi嘉年华 (区间DP)
2436: [Noi2011]Noi嘉年华 Description NOI2011 在吉林大学开始啦!为了迎接来自全国各地最优秀的信息学选手,吉林大学决定举办两场盛大的 NOI 嘉年华活动,分在两个不 ...
- 【BZOJ2436】【NOI2011】NOI嘉年华(动态规划)
[BZOJ2436]NOI嘉年华(动态规划) 题面 BZOJ 题解 考虑第一问如何求解 发现状态与选择了哪些活动无关,只与时间有关 设\(f[i][j]\)表示前\(i\)个单位时间(离散后),一个嘉 ...
- [BZOJ 1563] [NOI 2009] 诗人小G(决策单调性)
[BZOJ 1563] [NOI 2009] 诗人小G(决策单调性) 题面 一首诗包含了若干个句子,对于一些连续的短句,可以将它们用空格隔开并放在一行中,注意一行中可以放的句子数目是没有限制的.小 G ...
- 【BZOJ-2436】嘉年华 DP + 优化
2436: [Noi2011]Noi嘉年华 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 529 Solved: 382[Submit][Statu ...
- [LOJ 2134][UOJ 132][BZOJ 4200][NOI 2015]小园丁与老司机
[LOJ 2134][UOJ 132][BZOJ 4200][NOI 2015]小园丁与老司机 题意 给定平面上的 \(n\) 个整点 \((x_i,y_i)\), 一共有两个问题. 第一个问题是从原 ...
- [LOJ 2083][UOJ 219][BZOJ 4650][NOI 2016]优秀的拆分
[LOJ 2083][UOJ 219][BZOJ 4650][NOI 2016]优秀的拆分 题意 给定一个字符串 \(S\), 求有多少种将 \(S\) 的子串拆分为形如 AABB 的拆分方案 \(| ...
随机推荐
- puppetSvn集成
- css中的7中属性选择器
在CSS的选择符中有七个属性选择符.它们分别是: 1.E[att] 选择具有att属性的E元素. 2.E[att="val"] 选择具有att属性且属性值等于val的E元素. 3. ...
- HDU 2845 Beans (DP)
Problem Description Bean-eating is an interesting game, everyone owns an M*N matrix, which is filled ...
- 使用PLSql连接Oracle时报错ORA-12541: TNS: 无监听程序
非常多时候为了优化我们的启动项把oracle的服务禁止了.但是重新启动启动之后使用PLSQL登陆oracle时会出现无监听程序,这说明我们有一些服务没有启动.我们先查看一下oracle的服务是否启动, ...
- 仿糯米弹框效果demo
代码例如以下: <!doctype html> <html lang="en"> <head> <meta charset="U ...
- 漫话Unity3D(一)
前言 使用Unity已经有将近半年时间了,尽管项目还仅仅是个半成品,可是Unity差点儿相同玩熟了.这里把使用过程中碰到的问题梳理一遍.不会涉及到太过详细的功能和代码,可是假设开发一个网游又都会涉及到 ...
- web工程调用hadoop集群1.2
本实例代码在lz的资源中有上传,有需要的可以参考(下载后的文件解压后有两个,一个直接导入myeclipse工程,另外的jar放在hadoop的lib下面,只需修改Utils中的ip即可运行该程序): ...
- traceroute原理
traceroute原理 ICMP ICMP全称为Internet Control Message Protocol,即,网络控制报文协议. 当一个IP数据报发送失败时,最后一个路由器会向发送发传递一 ...
- spark 高级算子
mapPartitionsWithIndex val func = (index: Int, iter: Iterator[(Int)]) => { iter.toList.map(x ...
- Mybatis 插入操作时获取主键 (Oracle 触发器与SEQ)
1.通过Oracle序列 -- Create sequence create sequence SEQ_DW_EWSYSTEM minvalue 1 maxvalue 9999999999999999 ...