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. LeetCode_Binary Tree Inorder Traversal

    Given a binary tree, return the inorder traversal of its nodes' values. For example: Given binary tr ...

  2. 关于老驱动不能在windows 8下正常安装的问题

    问题: 老驱动(WDF),能在windows 7下安装并工作,但是不能在windows 8下安装. 先了解下windows 8驱动的新东西吧: New for windows 8 http://msd ...

  3. Oracle中对列加密的方法

    Oracle中对列加密的方法 2011-12-22 17:21:13 分类: Linux Oracle支持多种列加密方式: 1,透明数据加密(TDE):create table encrypt_col ...

  4. MVC4.0 Controller和View重复加载

    项目完成以后总是感觉有一些页面跑起来特别的慢,就仔细的调试了下,发现有很多也买年都是走了两遍,页面加载的时候Controller和View会连续走了两次,没有一点缘由 查了很久也不知道什么原因,这个问 ...

  5. Fiddler 的几个用法

    原文地址:http://wenku.baidu.com/link?url=VGYtzCpGdWzyvGFAIgCVS_KbSh5Oemd4rRYqyJORDchy4jxtEiRNWbp0tqPtlBR ...

  6. c++命名空间using

    #include<iostream> namespace run1 { ; } namespace run2 { ; void show() { std::cout << x ...

  7. spring简单入门示例

    1 控制反转IOC\依赖注入DI,因为翻译的不同,因此有两个名字.       控制反转意思就是说,当我们调用一个方法或者类时,不再有我们主动去创建这个类的对象,控制权交给别人(spring). 依赖 ...

  8. MongoDB分片技术[转]

    8天学通MongoDB——第六天 分片技术   在mongodb里面存在另一种集群,就是分片技术,跟sql server的表分区类似,我们知道当数据量达到T级别的时候,我们的磁盘,内存 就吃不消了,针 ...

  9. Unity 3D 动画帧事件

    前几天在项目开发中碰到一个这样的需求,RPG游戏中,特效和动画播放不同步的.假如主角在攻击NPC时,先实例化特效,后播放动画.动画毕竟是有一个时间长度的.等到动画播放攻击挥刀的那一瞬间时,特效可能早就 ...

  10. javascript 模仿 html5 placeholder

    <form action="?action=deliver" method="post" class="deliver-form"&g ...