APIO2016赛艇
- 首先每个学校的边界范围是\(1e9\),肯定不能直接\(dp[i][j]\)表示前i所学校,第\(i\)所学校派出\(j\)艘船,但\(b<=500\)所有考虑把\(a,b\)离散,第二维改为当前这个学校派出数量在那个区间里
- 转移的时候,如果前面所有的学校都不在此区间内,那贡献为\(\sum_{i'=1}^{i}\sum_{j'=1}^{j}dp[i'][j']\)
- 但是如果有学校要选在该区间内,问题便转化为在一段长度为len的区间内选出k个数,使他们递增,当然,有些数是可以不选的,该方案数为\(\sum_{i=0}^{k}C(k,k-i)*C(len,i)\),这个东西看起来一点都不好算,我们把这个式子化为\(C(len+k,k)\)
- 所以如果现在是第i个学校到第k个学校在此范围内,并且i,k学校强制选择,则方案数为\(C(i-k-1+len,i-k-1)\),贡献为\(\sum_{i'=i-1}^{1}C(len+i-i'-1,i-i'-1)\sum_{k=1}^{i'-1}\sum_{j'=1}^{j-1}dp[k][j']\)其中&j&是当前枚举的区间
- 对于每一段区间,\(len\)相同,所以我们在枚举区间是处理一下组合数,后面的两重循环用前缀和处理一下,时间复杂度\(O(n^3)\)
#include<bits/stdc++.h>
using namespace std;
typedef int sign;
typedef long long ll;
#define For(i,a,b) for(register sign i=(sign)a;i<=(sign)b;++i)
#define Fordown(i,a,b) for(register sign i=(sign)a;i>=(sign)b;--i)
const int N=500+5;
bool cmax(sign &a,sign b){return (a<b)?a=b,1:0;}
bool cmin(sign &a,sign b){return (a>b)?a=b,1:0;}
template<typename T>T read()
{
T ans=0,f=1;
char ch=getchar();
while(!isdigit(ch)&&ch!='-')ch=getchar();
if(ch=='-')f=-1,ch=getchar();
while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch-'0'),ch=getchar();
return ans*f;
}
template<typename T>void write(T x,char y)
{
if(x==0)
{
putchar('0');putchar(y);
return;
}
if(x<0)
{
putchar('-');
x=-x;
}
static char wr[20];
int top=0;
for(;x;x/=10)wr[++top]=x%10+'0';
while(top)putchar(wr[top--]);
putchar(y);
}
void file()
{
#ifndef ONLINE_JUDGE
freopen("3643.in","r",stdin);
freopen("3643.out","w",stdout);
#endif
}
int n,a[N],b[N],l[N<<1],tot;
void input()
{
n=read<int>();
For(i,1,n)
{
a[i]=read<int>(),b[i]=read<int>();
l[++tot]=a[i],l[++tot]=b[i]+1;
}
}
void init()
{
sort(l+1,l+tot+1);
tot=unique(l+1,l+tot+1)-l-1;
For(i,1,n)
{
a[i]=lower_bound(l+1,l+tot+1,a[i])-l;
b[i]=lower_bound(l+1,l+tot+1,b[i]+1)-l;
}
}
const int mo=1e9+7;
int inv[N],dp[N],C[N];
void work()
{
int len;
inv[1]=1;For(i,2,n)inv[i]=1ll*(mo-mo/i)*inv[mo%i]%mo;
C[0]=dp[0]=1;
For(i,1,tot-1)
{
len=l[i+1]-l[i];
For(i,1,n)C[i]=1ll*C[i-1]*(len+i-1)%mo*inv[i]%mo;
Fordown(j,n,1)if(a[j]<=i&&i+1<=b[j])
{
int f=0,pos=1,c=len;
Fordown(k,j-1,0)
{
(f+=1ll*dp[k]*c%mo)%=mo;
if(a[k]<=i&&i+1<=b[k])c=C[++pos];
}
(dp[j]+=f)%=mo;
}
}
int ans=0;
For(i,1,n)(ans+=dp[i])%=mo;
write(ans,'\n');
}
int main()
{
file();
input();
init();
work();
return 0;
}
APIO2016赛艇的更多相关文章
- BZOJ 4584 luogu P3643: [Apio2016]赛艇
4584: [Apio2016]赛艇 Time Limit: 70 Sec Memory Limit: 256 MB[Submit][Status][Discuss] Description 在首尔 ...
- 【BZOJ4584】[Apio2016]赛艇 DP
[BZOJ4584][Apio2016]赛艇 Description 在首尔城中,汉江横贯东西.在汉江的北岸,从西向东星星点点地分布着个划艇学校,编号依次为到.每个学校都拥有若干艘划艇.同一所学校的所 ...
- bzoj 4584: [Apio2016]赛艇【dp】
参考:https://www.cnblogs.com/lcf-2000/p/6809085.html 设f[i][j][k]为第i个学校派出的赛艇数量在区间j内,并且区间j内共有k个学校的方案数 把数 ...
- BZOJ4584 : [Apio2016]赛艇
首先将值域离散化成$O(n)$个连续段. 设$f[i][j][k]$表示第$i$个学校派出的数量在第$j$个连续段,在第$j$个连续段一共有$k$个学校的方案数.用组合数以及前缀和转移即可. 时间复杂 ...
- BZOJ4584 APIO2016赛艇(动态规划+组合数学)
如果值域不大,容易想到设f[i][j]为第i个学校选了j的方案数,枚举上一个学校是哪个选了啥即可,可以前缀和优化.于是考虑离散化,由于离散化后相同的数可能可以取不同的值,所以枚举第一个和其所选数(离散 ...
- BZOJ 4584 [Apio2016]赛艇 ——动态规划
Subtask 1 直接$N^2$ $DP$,就可以了 Subtask 2 用$f[i][j]$表示当前位置为$i$,结束元素为$j$的方案数. Subtask 3 看下面 Subtask 4 首先可 ...
- 校际联合Contest
每次开一个坑都像是重新被碾压的预感 最近的新闻,以前很喜欢乔任梁的<复活>...然后他就死了...感觉我再多愁善感一点的话...就要悲伤逆流成河了吧... Contest 09/24(乐滋 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- 2017FJ省队集训 游记
2017FJ省队集训 游记 又是一篇流水账 Day 1 今天是省队集训的第一天.早上骑车去八中,到的时候汗流太多浑身湿透被杨哥哥和runzhe2000 d了,一个说我去游泳了一个说我打球了...流完汗 ...
随机推荐
- NOIP2018题解
Preface 联赛结束后趁着自己还没有一下子把题目忘光,所以趁机改一下题目. 没有和游记一起写主要是怕篇幅太长不美观. 因此这里我们直接讲题目,关于NOIP2018的一些心得和有趣的事详见:NOIP ...
- 基于Angular+WebAPI+OData的增删改查
对于在ASP.NET WebAPI中怎么使用OData,已经在我前面的日志中的说明, 在ASP.NET Web API中使用OData 在这个示例中.我新建了一个Order的实体,在前端使用Angul ...
- 初级Java工程师面试所遇面试题
1.servlet的生命周期 : 一.百度百科 : 1.客户端请求servlet: 2.加载servlet类到内存: 3.实例化并调用init()方法初始化servlet: 4.调用service() ...
- Ubuntu16.04下安装破解secureCRT和secureFX的操作记录
本地电脑之前安装的是win10,疲于win10频繁的更新和各种兼容问题,果断放弃win10系统,安装了Ubuntu 16.04系统,现在微信.QQ.钉钉.WPS等都已支持linux版本,所以在Ubun ...
- shell+curl监控网站页面(域名访问状态),并利用sendemail发送邮件
应领导要求,对公司几个主要站点的域名访问情况进行监控.下面分享一个监控脚本,并利用sendemail进行邮件发送. 监控脚本如下:下面是写了一个多线程的网站状态检测脚本,直接从文件中读出站点地址,然后 ...
- python基础学习笔记(二)
继续第一篇的内容,讲解,python的一些基本的东西. 注释 为了让别人能够更容易理解程序,使用注释是非常有效的,即使是自己回头再看旧代码也是一样. >>> #获得用户名: > ...
- [2019BUAA软件工程]结对编程感想
结对编程感想 写在前面 本博客为笔者在完成软件工程结对编程任务后对于编程过程.最终得分的一些感想与经验分享.此外笔者还对于本课程的结对编程部分提出了一些建议. Tips Link 作业要求博客 2 ...
- oracle alter
ALTER TABLE (表名) ADD CONSTRAINT (索引名);ALTER TABLE (表名) DROP CONSTRAINT (索引名); ALTER TABLE (表名) ADD ( ...
- Android Studio中的Gradle是干什么的
作者:ghui链接:https://www.zhihu.com/question/30432152/answer/48239946来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...
- 理解java的三大特性之继承
学习来源:http://www.cnblogs.com/chenssy/p/3354884.html default 默认权限(包权限-同一个包可以访问) private 私有(类内部可以使用,继承的 ...