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

可以先看看代码里的注释

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

那么离散化时间是肯定的,看一手范围猜出是二维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. 什么是JNI?

    JNI是Java Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信(主要是C和C++)

  2. msp430项目编程53

    msp430综合项目---扩展项目三53 1.电路工作原理 2.代码(显示部分) 3.代码(功能实现) 4.项目总结

  3. (46)C#注册表及读写

    启动注册表:regedit 结构: 注册表一共有7个配置单元用regedit只能看到5个 HKEY_CLASSES_ROOT 包含系统上文件类型的细节(.txt,.doc)等.以及使用那些应用程序可以 ...

  4. Servlet(生命周期)

    <?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0" ...

  5. Java 读写文件大全

    原文:http://www.open-open.com/code/view/1423281836529 java中多种方式读文件 一.多种方式读文件内容. 1.按字节读取文件内容 2.按字符读取文件内 ...

  6. JSONKit升级XCODE后报一堆警告解决办法

    虽然我已经该用apple自己的json解析了,但是对于需要兼容低版本的,还是需要用第三方的, 目前用的最多的就有JSONKit了,包括微博sdk,但是一编译报一堆警告,看着很不爽.可以自己手动一个个修 ...

  7. IOS界面调试神器DCIntrospect

    对于使用代码来写UI的同志,使用DCIntrospect来查看元素信息调整布局,再也不用凭眼睛来估了,先来看看截图 DCIntrospect是github上的开源项目:下载源码 大概介绍下用法: DC ...

  8. flask的run的运行参数含义

    直接阅读源代码吧: 在flask的app.py里,查看run函数的定义 def run(self, host=None, port=None, debug=None, **options): &quo ...

  9. underscore.js 页面数据渲染

    1.underscore.js  源码 // Underscore.js 1.8.3 // http://underscorejs.org // (c) 2009-2015 Jeremy Ashken ...

  10. vc常用类总结(转载)

    常用类 CRect:用来表示矩形的类,拥有四个成员变量:top left bottom right.分别表是左上角和右下角的坐标.可以通过以下的方法构造: CRect( int l, int t, i ...