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嘉年华(单调优化)的更多相关文章

  1. BZOJ 2436 Noi嘉年华(优化DP)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2436 题意:有一些活动,起始时间持续时间已知.有两个场地.每个活动最多只能在一个场地举行 ...

  2. bzoj 2436: [Noi2011]Noi嘉年华

    Description NOI2011 在吉林大学开始啦!为了迎接来自全国各地最优秀的信息学选手,吉林大学决定举办两场盛大的 NOI 嘉年华活动,分在两个不同的地点举办.每个嘉年华可能包含很多个活动, ...

  3. 2436: [Noi2011]Noi嘉年华 - BZOJ

    Description NOI2011 在吉林大学开始啦!为了迎接来自全国各地最优秀的信息学选手,吉林大学决定举办两场盛大的 NOI 嘉年华活动,分在两个不同的地点举办.每个嘉年华可能包含很多个活动, ...

  4. 【BZOJ 2436】 2436: [Noi2011]Noi嘉年华 (区间DP)

    2436: [Noi2011]Noi嘉年华 Description NOI2011 在吉林大学开始啦!为了迎接来自全国各地最优秀的信息学选手,吉林大学决定举办两场盛大的 NOI 嘉年华活动,分在两个不 ...

  5. 【BZOJ2436】【NOI2011】NOI嘉年华(动态规划)

    [BZOJ2436]NOI嘉年华(动态规划) 题面 BZOJ 题解 考虑第一问如何求解 发现状态与选择了哪些活动无关,只与时间有关 设\(f[i][j]\)表示前\(i\)个单位时间(离散后),一个嘉 ...

  6. [BZOJ 1563] [NOI 2009] 诗人小G(决策单调性)

    [BZOJ 1563] [NOI 2009] 诗人小G(决策单调性) 题面 一首诗包含了若干个句子,对于一些连续的短句,可以将它们用空格隔开并放在一行中,注意一行中可以放的句子数目是没有限制的.小 G ...

  7. 【BZOJ-2436】嘉年华 DP + 优化

    2436: [Noi2011]Noi嘉年华 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 529  Solved: 382[Submit][Statu ...

  8. [LOJ 2134][UOJ 132][BZOJ 4200][NOI 2015]小园丁与老司机

    [LOJ 2134][UOJ 132][BZOJ 4200][NOI 2015]小园丁与老司机 题意 给定平面上的 \(n\) 个整点 \((x_i,y_i)\), 一共有两个问题. 第一个问题是从原 ...

  9. [LOJ 2083][UOJ 219][BZOJ 4650][NOI 2016]优秀的拆分

    [LOJ 2083][UOJ 219][BZOJ 4650][NOI 2016]优秀的拆分 题意 给定一个字符串 \(S\), 求有多少种将 \(S\) 的子串拆分为形如 AABB 的拆分方案 \(| ...

随机推荐

  1. JAVA常用类库简介(转)

    Java编程语言中为方便学习者学习,编制了许多类,这些类已经经过测试,都是我们编程的基础.如果不利用这些已存在的类,我们的编程工作将变得异常复杂并且效率低下.所以我们应尽可能多的掌握Java基本类库的 ...

  2. DSP与单片机的区别

    以前刚学习单片机时,经过一订的编程,能实现很多不同的功能,当时就觉得单片机真的是神通广大.后来接触到DSP,发现DSP处理数字在通信上,更加方便.于是我就很好奇的问自己,DSP和单片机,究竟有什么区别 ...

  3. Hadoop集群上使用JNI,调用资源文件

    hadoop是基于java的数据计算平台,引入第三方库,例如C语言实现的开发包将会大大增强数据分析的效率和能力. 通常在是用一些工具的时候都要用到一些配置文件.资源文件等.接下来,借一个例子来说明ha ...

  4. hdu1695:数论+容斥

    题目大意: 求x属于[1,b]和 y属于[1,d]的 gcd(x,y)=k 的方案数 题解: 观察发现 gcd()=k 不好处理,想到将x=x/k,y=y/k 后 gcd(x,y)=1.. 即问题转化 ...

  5. iOS 提示音播放

    首先找到对应的素材 音频文件 写一个类继承 NSObject 命名为AudioUtil 导入支撑文件 #import <AVFoundation/AVFoundation.h> #impo ...

  6. pyqt颜色字符

    from PyQt4.QtGui import QPlainTextEdit, QWidget, QVBoxLayout, QApplication, \ QFileDialog, QMessageB ...

  7. banner背景通栏

     background: #76CEF6 url("../images/bg.jpg") repeat-x 0 0;  -webkit-background-size: 100%; ...

  8. Js获取元素样式值(getComputedStyle&currentStyle)兼容性解决方案

    因为:style(document.getElementById(id).style.XXX)只能获取元素的内联样式,内部样式和外部样式使用style是获取不到的. 一般js获取内部样式和外部样式使用 ...

  9. 多路复用I/O poll()

    1.基本知识 poll的机制与select类似,与select在本质上没有多大差别,管理多个描述符也是进行轮询,根据描述符的状态进行处理,但是poll没有最大文件描述符数量的限制.poll和selec ...

  10. [转] iOS使用NSMutableAttributedString 实现富文本(不同颜色字体、下划线等)

    转自: 在iOS开发中,常常会有一段文字显示不同的颜色和字体,或者给某几个文字加删除线或下划线的需求.之前在网上找了一些资料,有的是重绘UILabel的textLayer,有的是用html5实现的,都 ...