Description

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

Solution

正解:DP+单调性优化
第一问非常简单,有两个嘉年华,所以要固定一个,设 \(f[i][j]\) 表示目前在 \(i\) 这个活动的右端点上,选择了\(j\)个放入第一个嘉年华,第二个嘉年华的最大活动数量
转移有两种:枚举 \(k<i\),\(k\)到\(i\)之间活动的要不给第一个嘉年华要不给第二个,所以预处理一个 \(c[i][j]\) 表示 \(i\)到\(j\)时间段内的活动数量,就可以 \(O(1)\) 转移了

第二问可以直接用第一问的DP数组,同理再求一个后缀的 \(f\) 数组,设为 \(g\).
那么如果是固定时间在 \(i,j\) 之间的活动的话,那么就是从 \(f[i-1][a]+g[j+1][b]+c[i][j]\) 中决策了,枚举\(a,b\),讨论\(c[i][j]\)分给第一个嘉年华,分给第二个嘉年华即可.
这样做的话是 \(O(n^5)\),所以只需要离线询问,设 \(dp[i][j]\) 表示上面说的:固定时间在 \(i,j\) 之间的活动,两个嘉年华中的最小值的最大值为多少
回答询问就可以 O\((n^2)\) 了.

注意:预处理 \(dp\) 数组是 \(O(n^4)\),但是限制上界的话,暴力是可以过的.
正解是 \(O(n^3)\) 预处理的,利用一个单调性:
假设枚举\(a\)为左边分给第一个嘉年华的活动数量,\(b\)为右边分给第一个嘉年华的
那么 \(a\)增大,\(b\)只能减小,所以可以单调指针扫描 \(b\),复杂度就降下来了.

#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#define RG register
#define il inline
#define iter iterator
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
using namespace std;
typedef long long ll;
const int N=405;
int n,B[N],num=0,c[N][N],f[N][N],g[N][N],dp[N][N],m;
struct sub{int l,r;}e[N];
void work()
{scanf("%d",&n);m=n;for(int i=1;i<=n;i++){scanf("%d%d",&e[i].l,&e[i].r);e[i].r=e[i].l+e[i].r-1;B[++num]=e[i].l;B[++num]=e[i].r;}sort(B+1,B+num+1);num=unique(B+1,B+num+1)-B-1;for(int i=1;i<=m;i++){e[i].l=lower_bound(B+1,B+num+1,e[i].l)-B;e[i].r=lower_bound(B+1,B+num+1,e[i].r)-B;for(int j=e[i].l;j>=1;j--)for(int k=e[i].r;k<=num;k++)c[j][k]++;}memset(f,-127/3,sizeof(f));memset(g,-127/3,sizeof(g));n=num;f[0][0]=0;for(int i=1;i<=n;i++)for(int j=0;j<=c[1][i];j++){f[i][j]=f[i-1][j];for(int k=0;k<i;k++){f[i][j]=Max(f[i][j],f[k][j]+c[k+1][i]);if(j>=c[k+1][i])f[i][j]=Max(f[i][j],f[k][j-c[k+1][i]]);}}g[n+1][0]=0;for(int i=n;i>=1;i--)for(int j=0;j<=c[i][n];j++){g[i][j]=g[i+1][j];for(int k=i+1;k<=n+1;k++){g[i][j]=Max(g[i][j],g[k][j]+c[i][k-1]);if(j>=c[i][k-1])g[i][j]=Max(g[i][j],g[k][j-c[i][k-1]]);}}int ans=0;for(int i=1;i<=n;i++)for(int j=0;j<=i;j++)ans=max(ans,min(f[i][j],j));printf("%d\n",ans);int v1,v2,b;for(int i=1;i<=n;i++)for(int j=i;j<=n;j++){b=c[j+1][n];for(RG int a=0;a<=c[1][i-1];a++){for(;b>=0;b--){v1=min(a+b,f[i-1][a]+g[j+1][b]+c[i][j]);v1=max(v1,min(a+b+c[i][j],f[i-1][a]+g[j+1][b]));v2=min(a+b-1,f[i-1][a]+g[j+1][b-1]+c[i][j]);v2=max(v2,min(a+b+c[i][j]-1,f[i-1][a]+g[j+1][b-1]));if(v1>v2)break;}dp[i][j]=Max(dp[i][j],v1);}}for(int i=1;i<=m;i++){ans=0;for(int j=e[i].l;j>=1;j--)for(int k=e[i].r;k<=n;k++)ans=max(ans,dp[j][k]);printf("%d\n",ans);}
}int main()
{freopen("pp.in","r",stdin);freopen("pp.out","w",stdout);work();return 0;
}

转载于:https://www.cnblogs.com/Yuzao/p/8149094.html

bzoj 2436: [Noi2011]Noi嘉年华相关推荐

  1. [NOI2011]Noi嘉年华

    题解: 我们设计状态方程如下: num[i][j]表示从时间i到j中有多少个 pre[i][j]表示时间1~i中,A选了j个时的B能选的数量的最大值. nex[i][j]表示时间i~cnt中,A选了j ...

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

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

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

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

  4. [bzoj 2434][Noi2011]阿狸的打字机

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2434 [Noi2011]阿狸的打字机 Time Limit: 10 Sec  Memory ...

  5. BZOJ 2434: [Noi2011]阿狸的打字机 [AC自动机 Fail树 树状数组 DFS序]

    2434: [Noi2011]阿狸的打字机 Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 2545  Solved: 1419 [Submit][S ...

  6. bzoj 2435: [Noi2011]道路修建 树上 dp

    2435: [Noi2011]道路修建 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/pr ...

  7. bzoj 2435: [Noi2011]道路修建(DFS)

    2435: [Noi2011]道路修建 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 4110  Solved: 1429 [Submit][Sta ...

  8. bzoj 2434 [Noi2011]阿狸的打字机(AC自动机+fail树+dfs序+树状数组)

    2434: [Noi2011]阿狸的打字机 Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 3521  Solved: 1913 [Submit][S ...

  9. BZOJ 2434 NOI2011阿狸的打字机 AC自动机+树状数组

    如果你还没学AC自动机,请看这篇博客 Problem bzoj通道 洛谷通道 Solution 简单的说来,其实就是要快速求一个字符串在另一个字符串中出现了多少次.考虑构造AC自动机. 首先可以想到很 ...

最新文章

  1. 日韩决裂,半导体谁最受伤?
  2. spring项目使用redis分布式锁解决重复提交问题
  3. map与unordered_map的区别
  4. 拳王虚拟项目公社:2020考研专业院校选择
  5. 使用HTML5和CSS3碎语
  6. JS获取浏览器高度、屏幕高度、宽屏
  7. Spring Boot 中统一异常处理最佳实践介绍
  8. Data Lake Analytics,大数据的ETL神器! 1
  9. 想将有色彩的视频进行去色处理就这样做
  10. EasyRecovery14免费激活码序列号数据恢复软件 简体中文绿色直装版
  11. 16QAM matlab/simulink仿真
  12. Java-JNI调用过程
  13. 13年草根程序员转型之路
  14. 公告模块phpcms
  15. Dreamoon Likes Coloring
  16. 全国计算机等级考试-三级信息安全考试知识点(无顺序)
  17. 强制退出scrapy
  18. 【Sublime Text 3】Sublime Text 3 - cracked 3086
  19. 自制app(游戏)Please Go之上传头像篇----萌新成长之路
  20. 网页版别踩白块(JavaScript)

热门文章

  1. 人社部:截至三季度9757亿元养老保险基金到账运营
  2. 工大附中、铁一太牛了,2019年高分段人数令人震惊!
  3. 禁用人脸识别四个月后,旧金山人证明了他们的先见之明
  4. 158行代码!程序员复现DeepMind图像生成神器
  5. 马斯克的“大脑改造计划”,还需要点亮哪些技能树?
  6. 聊聊职场那些事儿(转)
  7. FPGA实验四——时间基准电路和带使能的多周期计数器
  8. 077_访问者的信息
  9. 006_html元素
  10. 002_html发展史