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 的拆分方案 \(| ...
随机推荐
- Delphi keydown与keyup、keypress的区别(KeyDown 和KeyUp 通常可以捕获键盘除了PrScrn所有按键)
Shift 是一个集合变量.type TShiftState = set of (ssShift, ssAlt, ssCtrl, ssLeft, ssRight, ssMiddle, ssDouble ...
- 鼠标键盘无法进入:(EE) config/hal: couldn’t initialise context: (null)
vi /var/log/Xorg.0.log 发现有一行:(EE) config/hal: couldn’t initialise context: (null) 在xorg.conf里面加上下面选项 ...
- hdu2082:简单母函数
题目大意: a,b,c,d...z这些字母的价值是1,2,3......26 给定 这26个字母分别的数量,求总价值不超过50的单词的数量 分析: 标准做法是构造母函数 把某个单词看作是,关于x的多项 ...
- 合天网安实验室学习笔记----Linux基础
一.Linux的发展 linux kernel的版本是:2.6.32-279.el6.x86_64,此格式为:主版本.次版本.释出版本-修改版本 次版本为奇数:测试版: 次版本为偶数:稳定版: Lin ...
- cocos2d-x ios 设置横屏/竖屏(全)
Cocos2d-x项目\iOS\RootViewController.mm文件中. 以下方法任选其一即可… 本人机子函数二ok! 函数一: (BOOL)shouldAutorotateToI ...
- n%i之和
题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1168 题意:给定一个n,注意这里n小于10^12,求 分析:早些时 ...
- Java 反射 方法调用
在使用Java 反射时,对方法的调用,可能碰到最多的问题是,方法的变量如何使用.其实,调用方法的变量全部在参数数组里,不管有多少个参数,你都要把它放在参数数组里,如果是单个非数组参数,则可不使用参数数 ...
- java后台訪问url连接——HttpClients
java后台訪问url,并传递数据--通过httpclient方式 须要的包,包可能多几个额外的,假设无用或者冲突删除就可以.httpclient是使用的是4.4.1的版本号:http://downl ...
- Angular单页应用&AngularJS内部实现原理
回顾 自定义指令 登录后获取登录信息session 首先在登录验证的时候保存一个user 在学生管理页面中运用ajax调用获取到登录的用户信息 对注销按钮添加点击事件:调用ajax在表现层给user赋 ...
- 通过maven创建自己的archetype
最近项目组做好一套框架,为了推广需要创建一些空白项目给项目组使用,因为所有的空白项目里面的配置基本上都是一样的,为了减少重复工作,想通过maven创建一个自己的archetype,于是在网上大致搜了一 ...