bzoj2436: [Noi2011]Noi嘉年华
我震惊了,我好菜,我是不是该退役(苦逼)
可以先看看代码里的注释
首先我们先考虑一下第一问好了真做起来也就这个能想想了
那么离散化时间是肯定的,看一手范围猜出是二维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嘉年华的更多相关文章
- BZOJ2436 [Noi2011]Noi嘉年华  【dp】
		题目链接 BZOJ2436 题解 看这\(O(n^3)\)的数据范围,可以想到区间\(dp\) 发现同一个会场的活动可以重叠,所以暴力求出\(num[l][r]\)表示离散化后\([l,r]\)的完整 ... 
- 【BZOJ 2436】 2436: [Noi2011]Noi嘉年华 (区间DP)
		2436: [Noi2011]Noi嘉年华 Description NOI2011 在吉林大学开始啦!为了迎接来自全国各地最优秀的信息学选手,吉林大学决定举办两场盛大的 NOI 嘉年华活动,分在两个不 ... 
- 2436: [Noi2011]Noi嘉年华 - BZOJ
		Description NOI2011 在吉林大学开始啦!为了迎接来自全国各地最优秀的信息学选手,吉林大学决定举办两场盛大的 NOI 嘉年华活动,分在两个不同的地点举办.每个嘉年华可能包含很多个活动, ... 
- bzoj 2436: [Noi2011]Noi嘉年华
		Description NOI2011 在吉林大学开始啦!为了迎接来自全国各地最优秀的信息学选手,吉林大学决定举办两场盛大的 NOI 嘉年华活动,分在两个不同的地点举办.每个嘉年华可能包含很多个活动, ... 
- luogu P1973 [NOI2011]NOI 嘉年华 dp
		LINK:NOI 嘉年华 一道质量非常高的dp题目. 考虑如何求出第一问 容易想到dp. 按照左端点排序/右端点排序状态还是很难描述. 但是我们知道在时间上肯定是一次选一段 所以就可以直接利用时间点来 ... 
- NOI2011 NOI嘉年华
		http://www.lydsy.com/JudgeOnline/problem.php?id=2436 首先离散化,离散化后时间范围为[1,cnt]. 求出H[i][j],表示时间范围在[i,j]的 ... 
- 洛谷P1973 [NOI2011]Noi嘉年华(动态规划,决策单调性)
		洛谷题目传送门 DP题怕是都要大大的脑洞...... 首先,时间那么大没用,直接离散化. 第一问还好.根据题意容易发现,当一堆活动的时间有大量重叠的时候,更好的办法是把它们全部安排到一边去.那么我们转 ... 
- 洛谷P1973 [NOI2011]Noi嘉年华(决策单调性)
		传送门 鉴于FlashHu大佬讲的这么好(而且我根本不会)我就不再讲一遍了->传送 //minamoto #include<iostream> #include<cstdio& ... 
- cogs 1377. [NOI2011] NOI嘉年华 (dp
		题意:给你n个活动的起止时间,要你从中选一些活动在2个会场安排(不能有两个活动在两个会场同时进行),使活动较少的会场活动数最大,以及在某个活动必须选择的前提下,求该答案. 思路:由于n很小,时间很大, ... 
随机推荐
- iOS 收款计算器算法
			一个收款计算器算法,从之前高仿有赞Demo里面抽离的一个界面 demo 在这里 https://github.com/L-vinCent/calculView_function 显示计算记录 不能连续 ... 
- javaScriptCore 实战与小结
			源码在这,看不懂的直接撸源码就行,转载声明出处 原生调用JS的大致流程,做了个思维简图 这是代码流程 // JS数据 func getJSVar() { let context: JSContex ... 
- 解决 IDEA 中src下xml等资源文件无法读取的问题
			该问题的实质是,idea对classpath的规定. 在eclipse中,把资源文件放在src文件夹下,是可以找到的: 但是在idea中,直接把资源文件放在src文件夹下,如果不进行设置,是不能被找到 ... 
- 作诗(bzoj 2821)
			Description 神犇SJY虐完HEOI之后给傻×LYD出了一题:SHY是T国的公主,平时的一大爱好是作诗.由于时间紧迫,SHY作完诗 之后还要虐OI,于是SHY找来一篇长度为N的文章,阅读M次 ... 
- 【BZOJ3143】【HNOI2013】游走 && 【BZOJ3270】博物馆 【高斯消元+概率期望】
			刚学完 高斯消元,我们来做几道题吧! T1:[BZOJ3143][HNOI2013]游走 Description 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小 ... 
- 用delphi写多屏幕程序
			http://blog.csdn.net/zyyjc/article/details/6530728 别现在有些POS机是双屏幕的(比如卡西瓦POS机),一个屏幕可以当顾客显示屏用,当闲时也可以显示一 ... 
- Struts2 文件上传和下载
			首先我们写一个单文件长传的fileupload.jsp: <body> <s:fielderror></s:fielderror> <!-- 报错信息 --& ... 
- 未能加载文件或程序集“System.EnterpriseServices, Version=4.0.0.0或2.0.0.0
			未能加载文件或程序集“System.EnterpriseServices, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50 ... 
- jquery+css实现邮箱自动补全
			今天在公司做一个电子商务网站的注册会员时,要求用户在电子邮箱文本框中输入时,给与热点提示常用的电子邮箱,帮助用户选择,提高体验效果.下面是用Jquery+css实现的邮箱自动补全,供大家参考和学习. ... 
- Mysql 性能优化20个原则(2)
			5. 在Join表的时候使用相当类型的例,并将其索引 如果你的应用程序有很多 JOIN 查询,你应该确认两个表中Join的字段是被建过索引的.这样,MySQL内部会启动为你优化Join的SQL语句的机 ... 
