http://www.lydsy.com/JudgeOnline/problem.php?id=2436

首先离散化,离散化后时间范围为[1,cnt]。

求出H[i][j],表示时间范围在[i,j]的活动有多少个,可以在N^2的时间内解决。

假设场地分别为A和B。

我们容易知道,场地A和场地B的活动安排一定是这样的:

他们的活动安排一定是这样间隔着的。

我们求F[i][j],表示当时间<=i时,A场地有j个活动,B场地最多有多少个活动。

我们这样记并不知道最后一个活动是在A场地还是B场地,但一定是这2种情况的最大值,也就是说:F[i][j]表示“当时间<=i时,A场地有j个活动且最后一个活动在A场地,B场地最多有多少个活动”和当时间<=i时,A场地有j个活动且最后一个活动在B场地,B场地最多有多少个活动"这两种情况的最大值。

从小到大枚举i。

先要倒序循环j,用F[i][j+1]更新F[i][j]:F[i][j]=max(F[i][j],F[i][j+1])。

我们枚举j,向后递推,枚举k,

如果接下来的[i+1,k]的时间区间内都是B场地在进行活动,我们可以转移到F[k][j]:F[k][j]=max(F[k][j],F[i][j]+H[i+1][k])。

如果接下来的[i+1,k]的时间区间内都是A场地在进行活动,我们可以转移到F[k][j+H[i+1][k]]:F[k][j+H[i+1][k]]=max(F[k][j+H[i+1][k]],F[i][j])。

这个可以在N^3的时间内解决。

类似的,我们求G[i][j],表示当时间>=i时,A场地有j个活动,B场地最多有多少个活动,也是N^3的时间内解决。

然后我们求T[i][j],表示[i,j]内的所有活动都在A场地时,活动相对较少的嘉年华的活动数量的最大值。

很直接的一个想法是:

$T[i][j]=max\{min(x+y+H[i][j],F[i-1][x]+G[j+1][y])\} (0\leqslant x\leqslant N,0\leqslant y\leqslant N)$

但是这样算肯定是N^4的。

我们发现,当x变大的时候,F[i-1][x]跟着变小:

$min(x↑+y+H[i][j],F[i-1][x]↓+G[j+1][y])$

如果y也跟着变大,G[j+1][y]跟着变小:

$min(x↑+y↑+H[i][j],F[i-1][x]↓+G[j+1][y]↓)$

由于我们取的是min,这样并没有什么卵用。

所以y只能变小,G[j+1][y]跟着变大:

$min(x↑+y↓+H[i][j],F[i-1][x]↓+G[j+1][y]↑)$

所以随着x的递增,y递减。

并且容易知道,这一定是个单峰的。

所以可以N^3求出ans[i][j]。

第1行的输出就是$max\{min(i,F[cnt][i])\}(0\leqslant i\leqslant N)$

第i+1个输出就是$max(T[i][j])(1\leqslant i\leqslant l,r\leqslant j\leqslant cnt)$

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<fstream>
#include<algorithm>
#include<cstring>
#include<string>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<utility>
#include<set>
#include<bitset>
#include<vector>
#include<functional>
#include<deque>
#include<cctype>
#include<climits>
#include<complex>
//#include<bits/stdc++.h>适用于CF,UOJ,但不适用于poj using namespace std; typedef long long LL;
typedef double DB;
typedef pair<int,int> PII;
typedef complex<DB> CP; #define mmst(a,v) memset(a,v,sizeof(a))
#define mmcy(a,b) memcpy(a,b,sizeof(a))
#define re(i,a,b) for(i=a;i<=b;i++)
#define red(i,a,b) for(i=a;i>=b;i--)
#define fi first
#define se second
#define m_p(a,b) make_pair(a,b)
#define SF scanf
#define PF printf
#define two(k) (1<<(k)) template<class T>inline T sqr(T x){return x*x;}
template<class T>inline void upmin(T &t,T tmp){if(t>tmp)t=tmp;}
template<class T>inline void upmax(T &t,T tmp){if(t<tmp)t=tmp;} const DB EPS=1e-;
inline int sgn(DB x){if(abs(x)<EPS)return ;return(x>)?:-;}
const DB Pi=acos(-1.0); inline int gint()
{
int res=;bool neg=;char z;
for(z=getchar();z!=EOF && z!='-' && !isdigit(z);z=getchar());
if(z==EOF)return ;
if(z=='-'){neg=;z=getchar();}
for(;z!=EOF && isdigit(z);res=res*+z-'',z=getchar());
return (neg)?-res:res;
}
inline LL gll()
{
LL res=;bool neg=;char z;
for(z=getchar();z!=EOF && z!='-' && !isdigit(z);z=getchar());
if(z==EOF)return ;
if(z=='-'){neg=;z=getchar();}
for(;z!=EOF && isdigit(z);res=res*+z-'',z=getchar());
return (neg)?-res:res;
} const int maxN=;
const int maxcnt=*maxN; int N;
struct Tdata{int l,r,id;}a[maxN+]; int cnt,bak[*maxN+]; int t[maxcnt+];
int H[maxcnt+][maxcnt+]; inline bool cmpr(Tdata x,Tdata y){return x.r<y.r;} int F[maxcnt+][maxN+],G[maxcnt+][maxN+]; int T[maxcnt+][maxcnt+]; int ans,res[maxN+]; int main()
{
/*freopen("show.in","r",stdin);
freopen("show.out","w",stdout);*/
int i,j,k;
N=gint();
re(i,,N)a[i].l=gint(),a[i].r=a[i].l+gint()-,a[i].id=i;
re(i,,N)bak[++cnt]=a[i].l,bak[++cnt]=a[i].r;
sort(bak+,bak+cnt+);
cnt=unique(bak+,bak+cnt+)-bak-;
re(i,,N)a[i].l=lower_bound(bak+,bak+cnt+,a[i].l)-bak,a[i].r=lower_bound(bak+,bak+cnt+,a[i].r)-bak; sort(a+,a+N+,cmpr);
int head=;
re(i,,cnt)
{
while(head<=N && a[head].r<=i)t[a[head].l]++,head++;
int sum=;
red(j,i,)sum+=t[j],H[j][i]=sum;
} mmst(F,-);
F[][]=;
re(i,,cnt-)
{
red(j,N-,)upmax(F[i][j],F[i][j+]);
re(j,,N)
{
if(F[i][j]!=-)re(k,i+,cnt)upmax(F[k][j],F[i][j]+H[i+][k]);
if(F[i][j]!=-)re(k,i+,cnt)upmax(F[k][j+H[i+][k]],F[i][j]);
}
} mmst(G,-);
G[cnt+][]=;
red(i,cnt+,)
{
red(j,N-,)upmax(G[i][j],G[i][j+]);
re(j,,N)
{
if(G[i][j]!=-)re(k,,i-)upmax(G[k][j],G[i][j]+H[k][i-]);
if(G[i][j]!=-)re(k,,i-)upmax(G[k][j+H[k][i-]],G[i][j]);
}
} ans=;
re(j,,N)upmax(ans,min(j,F[cnt][j]));
cout<<ans<<endl; re(i,,cnt)re(j,i,cnt)
{
T[i][j]=;
/*int x,y;
re(x,0,N)re(y,0,N)
if(F[i-1][x]!=-1 && G[j+1][y]!=-1)
upmax(T[i][j],min(x+y+H[i][j],F[i-1][x]+G[j+1][y]));*/
int x,y=N;
while(y->= && G[j+][y]==-)y--;
re(x,,N)
{
if(F[i-][x]==-)continue;
while(y->= && min(x+y+H[i][j],F[i-][x]+G[j+][y])<=min(x+y-+H[i][j],F[i-][x]+G[j+][y-]))y--;
upmax(T[i][j],min(x+y+H[i][j],F[i-][x]+G[j+][y]));
}
} re(i,,N)
{
int l=a[i].l,r=a[i].r,id=a[i].id;
res[id]=;
re(j,,l)re(k,r,cnt)upmax(res[id],T[j][k]);
} re(i,,N)cout<<res[i]<<endl; return ;
}

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

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

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

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

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

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

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

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

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

  5. bzoj2436: [Noi2011]Noi嘉年华

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

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

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

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

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

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

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

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

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

随机推荐

  1. http soap关系

    http:是一个客户端和服务器端请求和应答的标准(TCP).http协议其目的是为了提供一种发布和接收htttp页面的方法 一http协议的客户端与服务器的交互:由HTTP客户端发起一个请求,建立一个 ...

  2. memcached学习——分布式算法(Consistant hash + 虚拟节点)(三)

    1.取余算法 优点:数据分布均匀缺点:当服务器动态的添加.删除节点或者某台server down掉,会导致命中率超大幅度下降,甚至导致服务不可用 2.Consistant Hash算法:一致性哈希算法 ...

  3. 判断IE版本的HTML语句详解<!--[if IE]> <![endif]--> - AnswerCard

    一个页面里面只能有一句这样的判断 我们常常会在网页的HTML里面看到形如[if lte IE 9]……[endif]的代码,表示的是限定某些浏览器版本才能执行的语句,那么这些判断语句的规则是什么呢?请 ...

  4. 【MongoDB数据库】怎样安装、配置MongoDB

    本blog以最简洁的方式记录了博主在折腾MongoDB过程中点点滴滴,当中包含下载MongoDB.配置环境变量.怎样启动MongoDBserver.怎样连接MongoDBserver以及怎样连接Mon ...

  5. Factorization Machines 学习笔记(三)回归和分类

      近期学习了一种叫做 Factorization Machines(简称 FM)的算法,它可对随意的实值向量进行预測.其主要长处包含: 1) 可用于高度稀疏数据场景:2) 具有线性的计算复杂度.本文 ...

  6. Android获取屏幕分辨率及DisplayMetrics简介

    Android 可设置为随着窗口大小调整缩放比例,但即便如此,手机程序设计人员还是必须知道手机屏幕的边界,以避免缩放造成的布局变形问题. 手机的分辨率信息是手机的一项重要信息,很好的是,Android ...

  7. C#使用 SQLite 数据库 开发的配置过程及基本操作类,实例程序:工商银行贵金属行情查看小工具

    --首发于博客园, 转载请保留此链接  博客原文地址 本文运行环境: Win7 X64, VS2010 1. SQLite 的优点: SQLite 是一款轻型数据库,开发包只有十几M, 相对于 MSS ...

  8. web开发小白之路

    今天就来谈谈本人从事web开发的一系列白只又白的经历,本人刚开始是从事ios开发的,由于一系列的变故现在变为了web前端开发,不过说来也奇怪,刚开始接触前端时间可以说是彻底蒙圈,各种选择器,各种适配搞 ...

  9. Python进阶之路---1.5python数据类型-字符串

    字符串 *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; ...

  10. java下DataInputStream与DataOutputStream写入数据的同时写入数据类型

    package cn.stat.p2.demo; import java.io.DataInputStream; import java.io.DataOutputStream; import jav ...