我震惊了,我好菜,我是不是该退役(苦逼)

可以先看看代码里的注释

首先我们先考虑一下第一问好了真做起来也就这个能想想了

那么离散化时间是肯定的,看一手范围猜出是二维DP,那对于两个会场,一个放自变量,一个放变量,然后O(n^3)的DP好了

第二问像第一问的做法特判一波就是O(n^4)啦

对于一个嘉年华必选,等价于必选一段区间,我们设f[l][r]为必选l,r放一起,前面一段自己处理,后面一段自己处理的最优解

那么ans=max(f[l][r]) (a[i].l<=l,r<=a[i].r)

可以发现前面一段自己处理我们在第一问已经搞定了。。。后面高仿前面就好。。。

f[l][r]=max(min(s[l-1][x]+h[l][r]+t[r+1][y],x+y))

然后这还是个四方的

但是用脑(bai)子(du)想想,t[r+1][y]随y增大减小,把min中两项写成两个一次函数,这个min的图像会是一个v字形(一个下降的直线和一个上升的直线),v的最下方就是决策点

当x增大的时候由于s[l-1][x]也跟着减小,相当于前一个截距变小,而后一个截距变大,决策点左移,所以是有决策单调性的y可以扫一遍完事

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn=;
const int maxT=*maxn; struct node{int l,r;}a[maxn];
int lslen,ls[maxT]; int h[maxT][maxT];//时间段内------->有多少嘉年华
int s[maxT][maxn],t[maxT][maxn];//前/后到i的时间段,给第一个j,另一个最多混到多少
int f[maxT][maxT];//这个时间段必选,且没有选择和该时间段相交的嘉年华------>较小的最大为多少
int main()
{
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
int n;
scanf("%d",&n);
for(int i=;i<=n;i++)
{
scanf("%d%d",&a[i].l,&a[i].r);a[i].r+=a[i].l;
a[i].l++;
ls[++lslen]=a[i].l;
ls[++lslen]=a[i].r;
}
sort(ls+,ls+lslen+);
lslen=unique(ls+,ls+lslen+)-ls-;
for(int i=;i<=n;i++)
a[i].l=lower_bound(ls+,ls+lslen+,a[i].l)-ls,
a[i].r=lower_bound(ls+,ls+lslen+,a[i].r)-ls; for(int l=;l<=lslen;l++)
for(int r=l;r<=lslen;r++)
for(int i=;i<=n;i++)
if(l<=a[i].l&&a[i].r<=r)h[l][r]++; //.......init........ memset(s,-,sizeof(s));s[][]=;
for(int i=;i<lslen;i++)
for(int j=;j<=n;j++)
if(s[i][j]!=-)
for(int k=i+;k<=lslen;k++)
s[k][j]=max(s[k][j],s[i][j]+h[i+][k]),
s[k][j+h[i+][k]]=max(s[k][j+h[i+][k]],s[i][j]);
int mx=;
for(int j=;j<=n;j++)
mx=max(mx,min(j,s[lslen][j]));
printf("%d\n",mx); memset(t,-,sizeof(t));t[lslen+][]=;
for(int i=lslen+;i>;i--)
for(int j=;j<=n;j++)
if(t[i][j]!=-)
for(int k=i-;k>=;k--)
t[k][j]=max(t[k][j],t[i][j]+h[k][i-]),
t[k][j+h[k][i-]]=max(t[k][j+h[k][i-]],t[i][j]); //......solve1....... for(int l=;l<=lslen;l++)
for(int r=l;r<=lslen;r++)
{
int y=n;
for(int x=;x<=n;x++)
{
if((x+y)<=n)
f[l][r]=max(f[l][r],min(s[l-][x]+h[l][r]+t[r+][y],x+y));
while(y>=&&((x+y)>n||s[l-][x]+h[l][r]+t[r+][y]<x+y))
{
y--;
f[l][r]=max(f[l][r],min(s[l-][x]+h[l][r]+t[r+][y],x+y));
}
}
} for(int i=;i<=n;i++)
{
int ans=;
for(int l=;l<=a[i].l;l++)
for(int r=a[i].r;r<=lslen;r++)
ans=max(ans,f[l][r]);
printf("%d\n",ans);
} return ;
}

bzoj2436: [Noi2011]Noi嘉年华的更多相关文章

  1. BZOJ2436 [Noi2011]Noi嘉年华 【dp】

    题目链接 BZOJ2436 题解 看这\(O(n^3)\)的数据范围,可以想到区间\(dp\) 发现同一个会场的活动可以重叠,所以暴力求出\(num[l][r]\)表示离散化后\([l,r]\)的完整 ...

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

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

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

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

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

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

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

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

  6. NOI2011 NOI嘉年华

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

  7. 洛谷P1973 [NOI2011]Noi嘉年华(动态规划,决策单调性)

    洛谷题目传送门 DP题怕是都要大大的脑洞...... 首先,时间那么大没用,直接离散化. 第一问还好.根据题意容易发现,当一堆活动的时间有大量重叠的时候,更好的办法是把它们全部安排到一边去.那么我们转 ...

  8. 洛谷P1973 [NOI2011]Noi嘉年华(决策单调性)

    传送门 鉴于FlashHu大佬讲的这么好(而且我根本不会)我就不再讲一遍了->传送 //minamoto #include<iostream> #include<cstdio& ...

  9. cogs 1377. [NOI2011] NOI嘉年华 (dp

    题意:给你n个活动的起止时间,要你从中选一些活动在2个会场安排(不能有两个活动在两个会场同时进行),使活动较少的会场活动数最大,以及在某个活动必须选择的前提下,求该答案. 思路:由于n很小,时间很大, ...

随机推荐

  1. bzoj2648/2716 kdtree

    SJY摆棋子 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 5199  Solved: 1813[Submit][Status][Discuss] D ...

  2. cf299C Weird Game

    Weird Game Yaroslav, Andrey and Roman can play cubes for hours and hours. But the game is for three, ...

  3. msp430入门学习43

    msp430的其他十一 msp430入门学习

  4. HDU 1358字符串循环节问题 ,next数组

    求字符串循环节,要求每前i个字符串前缀是否循环,有的话打印出来. 我对j=next[i]数组(未优化,从0开始,第一个为-1,)理解:字符s[i]的前面的字符串,最长的相同的前缀和后缀 的长度,因此, ...

  5. HDU 1242 dFS 找目标最短路

    //多个起点,要最短得目标,不妨倒过来从目标出发,去找最近的点更新!!!!!!递归时思路要清楚 #include<iostream> #include<cstring> usi ...

  6. (2)Swing窗体基本设置

    import javax.swing.*; import javax.swing.plaf.FontUIResource; import java.awt.*; import java.util.En ...

  7. ZOJ 1112 Dynamic Rankings【动态区间第K大,整体二分】

    题目链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1112 题意: 求动态区间第K大. 分析: 把修改操作看成删除与增加 ...

  8. 微服务网关实战——Spring Cloud Gateway

    导读 作为Netflix Zuul的替代者,Spring Cloud Gateway是一款非常实用的微服务网关,在Spring Cloud微服务架构体系中发挥非常大的作用.本文对Spring Clou ...

  9. T2602 最短路径问题 codevs

    http://codevs.cn/problem/2602/ 时间限制: 1 s 空间限制: 32000 KB 题目等级 : 黄金 Gold   题目描述 Description 平面上有n个点(n& ...

  10. 完整的MVC框架(前端、后台和数据库)

    终于学完了数据库的连接,可以做一个完整的项目了,以前做的练习都没有关联到数据库,没法进行事务. MVC框架 先上图: 老师画的图,有点乱,但是大概意思还是可以理解. 这个练习是简单的存储一个学生读了哪 ...