关闭

[DP] BZOJ 4584 [Apio2016]赛艇

537人阅读 评论(0) 收藏 举报
分类:

这名字很赛艇啊

其实不是很懂做法

http://blog.163.com/ele_ele/blog/static/2571160702016419115317400/


#include<cstdio>  
#include<cstdlib>
#include<algorithm> 
using namespace std;
typedef long long ll;

inline char nc(){
	static char buf[100000],*p1=buf,*p2=buf;
	if (p1==p2) { p2=(p1=buf)+fread(buf,1,100000,stdin); if (p1==p2) return EOF; }
	return *p1++;
}

inline void read(int &x){
	char c=nc(),b=1;
	for (;!(c>='0' && c<='9');c=nc()) if (c=='-') b=-1;
	for (x=0;c>='0' && c<='9';x=x*10+c-'0',c=nc()); x*=b;
}

const int N=505;
const int P=1000000007;
  
int n,a[N],b[N];
int sum[N],f[N<<1][N];
int inv[N],C[N<<1][N];
int sx[N<<1],m;
ll ans;

int main()  
{
	freopen("t.in","r",stdin);
	freopen("t.out","w",stdout);  
	read(n);  
	for (int i=1;i<=n;i++)  
		read(a[i]),read(b[i]),sx[++m]=a[i],sx[++m]=b[i]+1;  
	sort(sx+1,sx+m+1);
	m=unique(sx+1,sx+m+1)-sx-1;
	inv[1]=1;
	for (int i=2;i<=n;i++) inv[i]=(ll)(P-P/i)*inv[P%i]%P;  
	for (int i=1;i<m;i++){
		C[i][0]=1;  
		for (int j=1;j<=n;j++)  
			C[i][j]=(ll)C[i][j-1]*(sx[i+1]-sx[i]+j-1)%P*inv[j]%P;  
	}
	for (int i=1;i<m;i++)   
	{
		f[i-1][0]=1;  
		for (int j=1;j<=n;j++)  
		{  
			sum[j]=sum[j-1];  
			f[i][j]=f[i-1][j];  
			if (a[j]<=sx[i] && sx[i+1]-1<=b[j])  
			{
				sum[j]++;
				for (int k=0;k<j;k++){
					f[i][j]+=(ll)f[i-1][k]*C[i][sum[j]-sum[k]]%P; 
					if (f[i][j]>=P) f[i][j]-=P; 
				}
			}
		}
	}  
	for (int i=1;i<=n;i++)  
		ans=ans+f[m-1][i];  
	printf("%lld\n",ans%P);  
	return 0;  
}  


0
0
查看评论

bzoj 4584: [Apio2016]赛艇 dp

题意在首尔城中,汉江横贯东西。在汉江的北岸,从西向东星星点点地分布着个划艇学校,编号依次为到。每个学校都拥有若干艘划艇。同一所学校的所有划艇颜色相同,不同的学校的划艇颜色互不相同。颜色相同的划艇被认为是一样的。每个学校可以选择派出一些划艇参加节日的庆典,也可以选择不派出任何划艇参加。如果编号为的学校...
  • qq_33229466
  • qq_33229466
  • 2017-05-02 17:30
  • 252

BZOJ 4584 [Apio2016]赛艇

区间离散化+DPAiBiAiBi太大了,一个数一个数地做肯定不行。于是先按照区间端点把区间离散化,至多形成2n−12n-1个区间。f[i][j][k]f[i][j][k]表示第i个学校,派出的数量在第j个离散区间内,且第j个区间内有k个学校的方案数。f[i][j][1]f[i][j][1]可以由所有...
  • ziqian2000
  • ziqian2000
  • 2016-09-10 11:12
  • 180

4584: [Apio2016]赛艇

4584: [Apio2016]赛艇Time Limit: 70 Sec Memory Limit: 256 MB Submit: 652 Solved: 279 [Submit][Status][Discuss] Description在首尔城中,汉江横贯东西。在汉江的北岸,从西向东星星...
  • CRZbulabula
  • CRZbulabula
  • 2017-05-19 11:32
  • 378

BZOJ4584: [Apio2016]赛艇

Description 在首尔城中,汉江横贯东西。在汉江的北岸,从西向东星星点点地分布着个划艇学校,编号依次为到。每个学校都 拥有若干艘划艇。同一所学校的所有划艇颜色相同,不同的学校的划艇颜色互不相同。颜色相同的划艇被认为是一 样的。每个学校可以选择派出一些划艇参加节日的庆典,也可以选择不...
  • wxh010910
  • wxh010910
  • 2017-01-07 20:02
  • 280

[BZOJ 4584][Apio2016]赛艇:DP+组合数

点击这里查看原题f[i][j]表示前i个学校中,第i个学校出j个船的方案数,于是f[i][j]=sigma{f[i’][j’]}(i’ < i , j’ < j ) 但是这样会时间空间双LE,因此需要优化。 考虑到n只有500,因此可以对区间进行离散化,把左闭右闭区间换成左闭右开区间...
  • SmallSXJ
  • SmallSXJ
  • 2017-05-09 17:52
  • 142

【bzoj4584】[Apio2016]赛艇 dp

首先,对区间离散化,最终会最多形成2n-1个区间 f[i][j][k]表示考虑到第i个学校,最后一个数落在j区间中,第j个区间中有k个数的方案数 sum[t]=∑f[i-1][j][p] (1 f[i][j][k]=f[i-1][j][k]+f[i-1][j][k-1]*(len[j]-k+1...
  • u012288458
  • u012288458
  • 2016-05-12 15:22
  • 1640

BZOJ4584: [Apio2016]赛艇 DP

题意:长度为N的序列,每个元素可以在[ai,bi]间取值或者不取值,求有多少种不同的上升序列(不能都不取值) N<=500,元素范围1e9 容易发现取值只会形成2*n个区间,每个元素可以在某几段区间内任意取值 记F[i][j][k]表示前i个元素,最后一段落在j这个区间,这个区间一共落了...
  • Mima_Reincarnation
  • Mima_Reincarnation
  • 2017-04-27 20:39
  • 395

BZOJ4585: [Apio2016]烟火表演

Description 烟花表演是最引人注目的节日活动之一。在表演中,所有的烟花必须同时爆炸。为了确保安 全,烟花被安置在远离开关的位置上,通过一些导火索与开关相连。导火索的连接方式形成 一棵树,烟花是树叶,如[图1]所示。火花从开关出发,沿导火索移动。每当火花抵达一个分 叉点时,它会扩...
  • wxh010910
  • wxh010910
  • 2017-02-19 19:13
  • 622

【BZOJ 4584】【APIO 2016】赛艇

首先离散化一下,然后令f[i][j][k]表示做到第i个学校,最后一个数落在j号区间,这个区间里有k个不同的数的方案数。(实际上如果两个学校的数量是一样的,那么对后面的方案是没有影响的,所以记录的是k个不一样的数)。 sum[t]=∑f[i-1][j][p] (1<=j<=t) f[...
  • Ripped
  • Ripped
  • 2017-05-05 07:43
  • 290

BZOJ4585 [Apio2016]烟火表演

“这个凸包的形式,妙啊,他妙啊,妙啊” 王梦迪神犇在讲题的时候写的题解挺详细的 我们对每个点,有一个把子树内长度统一的花费关于统一成的长度的函数f(x),易知这个函数是下凸的,对于一个点x,设他的儿子是y,算x的函数的时候对所有的y,考虑x与y之间的边来更新f(y)得到F(f(y)),然后对所有F(...
  • neither_nor
  • neither_nor
  • 2016-06-20 13:12
  • 1292
    个人资料
    • 访问:369858次
    • 积分:13084
    • 等级:
    • 排名:第1230名
    • 原创:975篇
    • 转载:3篇
    • 译文:0篇
    • 评论:56条
    文章分类
    最新评论