1948 NOI 嘉年华

2011年NOI全国竞赛

 时间限制: 1 s
 空间限制: 256000 KB
 题目等级 : 大师 Master
 查看运行结果
 
 
题目描述 Description

NOI2011 在吉林大学开始啦!为了迎接来自全国各地最优秀的信息学选手, 吉林大学决定举办两场盛大的 NOI 嘉年华活动,分在两个不同的地点举办。每 个嘉年华可能包含很多个活动,而每个活动只能在一个嘉年华中举办。 现在嘉年华活动的组织者小安一共收到了 n 个活动的举办申请,其中第 i 个 活动的起始时间为 Si,活动的持续时间为 Ti。这些活动都可以安排到任意一个嘉 年华的会场,也可以不安排。 小安通过广泛的调查发现,如果某个时刻,两个嘉年华会场同时有活动在进 行(不包括活动的开始瞬间和结束瞬间),那么有的选手就会纠结于到底去哪个 会场,从而变得不开心。所以,为了避免这样不开心的事情发生,小安要求不能 有两个活动在两个会场同时进行(同一会场内的活动可以任意进行)。 另外,可以想象,如果某一个嘉年华会场的活动太少,那么这个嘉年华的吸 引力就会不足,容易导致场面冷清。所以小安希望通过合理的安排,使得活动相 对较少的嘉年华的活动数量最大。 此外,有一些活动非常有意义,小安希望能举办,他希望知道,如果第 i 个 活动必须举办(可以安排在两场嘉年华中的任何一个),活动相对较少的嘉年华 的活动数量的最大值。

输入描述 Input Description

输入的第一行包含一个整数 n,表示申请的活动个数。 接下来 n 行描述所有活动,其中第 i 行包含两个整数 Si、Ti,表示第 i 个活 动从时刻 Si开始,持续 Ti的时间。

输出描述 Output Description

输出的第一行包含一个整数,表示在没有任何限制的情况下,活动较少的嘉 年华的活动数的最大值。 接下来 n 行每行一个整数,其中第 i 行的整数表示在必须选择第 i 个活动的 前提下,活动较少的嘉年华的活动数的最大值。

样例输入 Sample Input

5

8 2

1 5

5 3

3 2

5 3

样例输出 Sample Output

2

2

1

2

2

2

数据范围及提示 Data Size & Hint

【样例说明】 
在没有任何限制的情况下,最优安排可以在一个嘉年华安排活动 1, 4,而在 另一个嘉年华安排活动 3, 5,活动 2 不安排。

【数据规模与约定】 
1≤n≤200
0≤Si≤109

1≤Ti≤ 109

先看这个大神的详细题解,这个写得真的很清晰很好懂啊!

  

  然后说说那个什么递增单凸的。

  首先,显然pre[][x]和suf[][y]都是递减的。

  对于x确定,y在变,f[x][y]=min(x+y,pre[i][x]+num[i][j]+suf[j][y]),显然x+y随y递增而增,pre[i][x]+num[i][j]+suf[j][y]随y递增而减。

  

  就是这样的,下面标红的函数就是真正的函数,显然是上凸的了。

  所以程序里面y按顺序,找到一个now<当前最优值 就可以break了。

  然后说明一个就是随着x的增加,取最优值的y单调递减。这个画个图也可以看出来了。

  

  所以就是这样做了,y这里均摊的话,就是O(n^3)                                        --引自Konjakmoyu

#include<cstdio>
#include<algorithm>
#include<iostream>
using namespace std;
const int N=;
const int inf=1e9;
int n,p,ans,s[N],t[N];
struct node{int x,y;}a[N];
int num[N][N],pre[N][N],suf[N][N];
int g[N][N];
bool cmp(const node &a,const node &b){
return a.x<b.x;
}
int main(){
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%d%d",&s[i],&t[i]);t[i]+=s[i];
a[i<<].x=s[i];a[i<<].y=i;
a[i<<|].x=t[i];a[i<<|].y=-i;
}
sort(a+,a+n*+,cmp);
for(int i=;i<=*n+;i++){
if(i==||a[i].x!=a[i-].x) p++;
if(a[i].y>) s[a[i].y]=p;
else t[-a[i].y]=p;
}
for(int i=;i<=p;i++){
for(int j=i;j<=p;j++){
for(int k=;k<=n;k++){
if(s[k]>=i&&t[k]<=j){
num[i][j]++;
}
}
}
}
for(int i=;i<=p;i++){
for(int j=;j<=n;j++){
if(j>num[][i]){pre[i][j]=-inf;continue;}
for(int k=;k<=i;k++){
pre[i][j]=max(pre[i][j],pre[k][j]+num[k][i]);
if(j-num[k][i]>=) pre[i][j]=max(pre[i][j],pre[k][j-num[k][i]]);
}
}
}
for(int i=p;i>=;i--){
for(int j=;j<=n;j++){
if(j>num[i][p]){suf[i][j]=-inf;continue;}
for(int k=i;k<=p;k++){
suf[i][j]=max(suf[i][j],suf[k][j]+num[i][k]);
if(j-num[i][k]>=) suf[i][j]=max(suf[i][j],suf[k][j-num[i][k]]);
}
}
}
for(int i=,now,id;i<=p;i++){
for(int j=i;j<=p;j++){
int y=num[j][p];
for(int x=;x<=num[][i];x++){
for(;y>=;y--){
now=min(x+y,pre[i][x]+num[i][j]+suf[j][y]);
if(g[i][j]<=now){
g[i][j]=now;
id=y;
}
else break;
}
y=id;
}
ans=max(ans,g[i][j]);
}
}
for(int i=;i<=p;i++){
for(int j=p;j>=i;j--){
g[i][j]=max(g[i][j],g[i][j+]);
}
}
for(int i=;i<=p;i++){
for(int j=i;j<=p;j++){
g[i][j]=max(g[i][j],g[i-][j]);
}
}
printf("%d\n",ans);
for(int i=;i<=n;i++) printf("%d\n",g[s[i]][t[i]]);
return ;
}

1948 NOI 嘉年华的更多相关文章

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

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

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

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

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

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

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

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

  5. luogu P1973 [NOI2011]NOI 嘉年华 dp

    LINK:NOI 嘉年华 一道质量非常高的dp题目. 考虑如何求出第一问 容易想到dp. 按照左端点排序/右端点排序状态还是很难描述. 但是我们知道在时间上肯定是一次选一段 所以就可以直接利用时间点来 ...

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

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

  7. NOI2011 NOI嘉年华

    http://www.lydsy.com/JudgeOnline/problem.php?id=2436 首先离散化,离散化后时间范围为[1,cnt]. 求出H[i][j],表示时间范围在[i,j]的 ...

  8. bzoj2436: [Noi2011]Noi嘉年华

    我震惊了,我好菜,我是不是该退役(苦逼) 可以先看看代码里的注释 首先我们先考虑一下第一问好了真做起来也就这个能想想了 那么离散化时间是肯定的,看一手范围猜出是二维DP,那对于两个会场,一个放自变量, ...

  9. BZOJ 2436 NOI嘉年华(单调优化)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2436 题意:两个会场不能同时表演,但是同一个时间可以同时表演,要求让两个会场表演数量最小的最大,然后 ...

随机推荐

  1. ssh加密公私钥

    SSH公钥登录原理 在平时工作中我们经常要远程登录服务器,这就要用到SSH协议: $ ssh user@host 主要有两种登录方式:第一种为密码口令登录,第二种为公钥登录 密码口令登录 通过密码进行 ...

  2. PHP框架之ThinkPHP项目CMS内容管理系统源码及开发手册视频

    http://download.csdn.net/download/duguqing/4203042

  3. Message Code 【27796】 Failed to connect to server 'hostname';port_ld': 'reason'.

    Message Code [27796] Failed to connect to server 'hostname';port_ld': 'reason'.Unable to connect to  ...

  4. C++类的成员函数的形参列表后面的const

    看到(C++ Primer)类的成员函数这里,突然对成员函数形参列表后面的const感到迷惑. 因为书中开始说是修饰隐含形参this的,然后又说是声明该函数是只读的. 大为不解! 翻资料.找人讨论.. ...

  5. linux -- 进程的查看、进程id的获取、进程的杀死

    进程查看 ps ax : 显示当前系统进程的列表 ps aux : 显示当前系统进程详细列表以及进程用户 ps ax|less : 如果输出过长,可能添加管道命令 less查看具体进程, 如:ps a ...

  6. 学习:erlang开源项目。

    一.RabbitMQ:AMQP消息服务器 . 二.ejabberd是的Jabber / XMPP协议的即时通讯服务器. 三.cowboy/mochiweb.

  7. Javascript的setTimeOut和setInterval的定时器用法

    setTimeout() 方法用于在指定的毫秒数后调用函数或计算表达式,而setInterval()则是在每隔指定的毫秒数循环调用函数或表达式, 直到 clearInterval把它清除.也就是说se ...

  8. Extjs 下拉框

    刚刚熟练了easyui控件的使用,又開始了如今的这个项目. 这个项目是个半成品.前端使用的是Extjs控件,jsp中没有代码.就引用了非常多的js...于是乎有种不知所措了呀. . . 说实话特别的不 ...

  9. Javascript定义类(class)的最新方法

    极简主义法 3.1 封装 这种方法不使用this和prototype,代码部署起来非常简单,这大概也是它被叫做"极简主义法"的原因. 首先,它也是用一个对象模拟"类&qu ...

  10. 高级选项更改MathType数学公式样式

    MathType中系统的样式有很多种,我们将通过示例来演示如何更改样式定义达到修改等式的目的.使用样式将允许你迅速且方便的获得一种格式,这种格式将使你创建的等式具有统一的风格. 以下步骤中,我们将创建 ...