https://www.lydsy.com/JudgeOnline/problem.php?id=4584

https://www.luogu.org/problemnew/show/P3643

http://uoj.ac/problem/204

在首尔城中,汉江横贯东西。在汉江的北岸,从西向东星星点点地分布着个划艇学校,编号依次为到。每个学校都拥有若干艘划艇。同一所学校的所有划艇颜色相同,不同的学校的划艇颜色互不相同。颜色相同的划艇被认为是一样的。每个学校可以选择派出一些划艇参加节日的庆典,也可以选择不派出任何划艇参加。如果编号为的学校选择派出划艇参加庆典,那么,派出的划艇数量可以在Ai至Bi之间任意选择(Ai<=Bi)。
 
值得注意的是,编号为i的学校如果选择派出划艇参加庆典,那么它派出的划艇数量必须大于任意一所编号小于它的学校派出的划艇数量。
 
输入所有学校的Ai、Bi的值,求出参加庆典的划艇有多少种可能的情况,必须有至少一艘划艇参加庆典。两种情况不同当且仅当有参加庆典的某种颜色的划艇数量不同

dp神题,方程很难想……

(一瞬间我以为我已经傻到无可救药了直到我看了题解发现的确很难很神……)

参考1:https://www.luogu.org/blog/bestFy0731/solution-p3643

参考2:https://blog.csdn.net/wxh010910/article/details/54177511

参考3:http://45.76.49.80:8000/f/7bd0386ed1b24b8bb390/

看完这三个人还没看懂的话那接下来看我的理解吧。

不难想到对a和b离散化,并且令f[i][j]表示前i个学校,第i个学校必须取且第i个学校的划艇数量在j段区间内。

然后就有一个问题了,这样的话肯定会有几个学校的划艇数量区间重合,这时如何统计个数。

那么根据参考2的思路,考虑另一个问题:给m个长度为len的区间,选k个区间的方案数个数。

显然地为C(m,k)*C(len,k)。

对1~m的k求和即为sigma(C(m,m-k)*C(len,k))=C(m+len,m)。

现在我们就能求出当有m个学校在同一个数量段时的方案数了。

根据参考3,我们可以列出以下的式子:

令k+1~i中可以取j段的划艇数量的学校个数为m,且k+1~i的学校要么取0要么取j段,则:

f[i][j]=sigma(f[k][l]*C(m+len[j],m))(k<i,l<j)

(PS:k+1~i的学校取别的段(比如x)的情况早就被f[i][x]考虑过了。)

但是特殊的,当m=0时,C(m+len[j],m)=len[j]。

完后前缀和优化即可。

#include<map>
#include<cmath>
#include<stack>
#include<queue>
#include<cstdio>
#include<cctype>
#include<vector>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int p=1e9+;
const int N=;
inline int read(){
int X=,w=;char ch=;
while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
while(isdigit(ch))X=(X<<)+(X<<)+(ch^),ch=getchar();
return w?-X:X;
}
int n,m,a[N],b[N],c[N*];
int s[N],inv[N],C[N];
inline void LSH(){
sort(c+,c+m+);
m=unique(c+,c+m+)-c-;
for(int i=;i<=n;i++){
a[i]=lower_bound(c+,c+m+,a[i])-c;
b[i]=lower_bound(c+,c+m+,b[i]+)-c;
}
}
inline void init(){
inv[]=;
for(int i=;i<=n;i++)inv[i]=(ll)(p-p/i)*inv[p%i]%p;
}
int main(){
n=read();init();
for(int i=;i<=n;i++){
a[i]=read(),b[i]=read();
c[++m]=a[i];c[++m]=b[i]+;
}
LSH();
s[]=;C[]=;
for(int i=;i<m;i++){
int len=c[i+]-c[i];
for(int j=;j<=n;j++)C[j]=(ll)C[j-]*(len+j-)%p*inv[j]%p;
for(int j=n;j>=;j--){
if(a[j]<=i&&i+<=b[j]){
int f=,mul=len,cnt=;
for(int k=j-;k>=;k--){
(f+=(ll)s[k]*mul%p)%=p;
if(a[k]<=i&&i+<=b[k])mul=C[++cnt];
}
(s[j]+=f)%=p;
}
}
}
int ans=;
for(int i=;i<=n;i++)(ans+=s[i])%=p;
printf("%d\n",ans);
return ;
}

+++++++++++++++++++++++++++++++++++++++++++

+本文作者:luyouqi233。               +

+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/+

+++++++++++++++++++++++++++++++++++++++++++

BZOJ4584 & 洛谷3643 & UOJ204:[APIO2016]划艇——题解的更多相关文章

  1. 洛谷P1783 海滩防御 分析+题解代码

    洛谷P1783 海滩防御 分析+题解代码 题目描述: WLP同学最近迷上了一款网络联机对战游戏(终于知道为毛JOHNKRAM每天刷洛谷效率那么低了),但是他却为了这个游戏很苦恼,因为他在海边的造船厂和 ...

  2. 洛谷P4047 [JSOI2010]部落划分题解

    洛谷P4047 [JSOI2010]部落划分题解 题目描述 聪聪研究发现,荒岛野人总是过着群居的生活,但是,并不是整个荒岛上的所有野人都属于同一个部落,野人们总是拉帮结派形成属于自己的部落,不同的部落 ...

  3. 洛谷P1155 双栈排序题解(图论模型转换+二分图染色+栈)

    洛谷P1155 双栈排序题解(图论模型转换+二分图染色+栈) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1311990 原题地址:洛谷P1155 双栈排序 ...

  4. 洛谷10月月赛II题解

    [咻咻咻] (https://www.luogu.org/contestnew/show/11616) 令人窒息的洛谷月赛,即将参加NOIp的我竟然只会一道题(也可以说一道也不会),最终145的我只能 ...

  5. [洛谷P1823]音乐会的等待 题解(单调栈)

    [洛谷P1823]音乐会的等待 Description N个人正在排队进入一个音乐会.人们等得很无聊,于是他们开始转来转去,想在队伍里寻找自己的熟人.队列中任意两个人A和B,如果他们是相邻或他们之间没 ...

  6. BZOJ2527 & 洛谷3527:[Poi2011]Meteors——题解

    +++++++++++++++++++++++++++++++++++++++++++ +本文作者:luyouqi233. + +欢迎访问我的博客:http://www.cnblogs.com/luy ...

  7. 洛谷 p1516 青蛙的约会 题解

    dalao们真是太强了,吊打我无名蒟蒻 我连题解都看不懂,在此篇题解中,我尽量用语言描述,不用公式推导(dalao喜欢看公式的话绕道,这篇题解留给像我一样弱的) 进入正题 如果不会扩展欧里几德的话请先 ...

  8. 洛谷p2370yyy2015c01的U盘题解

    没什么特殊的想法 就是看自己很久没有更新关于题解类的文章了而已 (其实这是我好久之前做的, 只是把它从洛谷博客搬到了这里而已) 题目 首先分析题目要二分 他长成这个亚子太二分了 所以就要二分 最好是先 ...

  9. 2019.06.17课件:[洛谷P1310]表达式的值 题解

    P1310 表达式的值 题目描述 给你一个带括号的布尔表达式,其中+表示或操作|,*表示与操作&,先算*再算+.但是待操作的数字(布尔值)不输入. 求能使最终整个式子的值为0的方案数. 题外话 ...

随机推荐

  1. 转:Docker创建centos的LNMP镜像

    转自:http://www.vckai.com/p/29  1. 安装docker 这个就不说了,不会的可以看下我之前的文章<Docker介绍及安装>. 1)启动docker # serv ...

  2. Webservice HTTP

    由于项目需要:自己写了一个WebserviceDemo,把遇到的问题记下来. 方式一 :使用代理类来访问Webservice,此方式不讲解,感觉复杂(神坑). (生成的代理路径 C:\Users\ad ...

  3. Shader Forge学习

    最近学习了一下shader forge,一个屌屌哒插件用来生成shader.尽管其降低了制作shader的难度,但是真的想做出满意的shader的话还是得有一定的shader基础.但是仅仅是做出一些简 ...

  4. 51单片机实现定时器00H-FFH、定时器000-255

    #include< reg51.h> #define uint unsigned int #define uchar unsigned char sfr P0M0 = 0x94; sfr ...

  5. 【转】Haml 这货是啥? 附参考

    Haml是一种用来描述任何XHTML web document的标记语言,它是干净,简单的.而且也不用内嵌代码.Haml的职能就是替代那些内嵌代码的page page templating syste ...

  6. CsvHelper文档-1前言

    CsvHelper文档-1前言 英文文档链接地址:CsvHelper Document 开源项目地址:CsvHelper 翻译于2018-1-5,原本可能会随时更新: 每一段代码都是经过我实际测试的, ...

  7. python selenium 使用htmlunit 执行测试。非图形界面浏览器。

    其实就是换个浏览器,只是这个浏览器没有图形界面而已. browser = webdriver.Chrome() 换成 browser = webdriver.Remote(desired_capabi ...

  8. nodejs笔记--express篇(五)

    创建一个express + ejs的项目 express -e testEjsWebApp cd testEjsWebApp npm install http://localhost:3000 Usa ...

  9. 《javascript模式--by Stoyan Stefanov》书摘--字面量和构造函数

    二.字面量和构造函数 1,能够使用对象字面量时,就没理由使用new Object构造函数 // 一个空对象var 0 = new Object();console.log( o.constructor ...

  10. 软件测试基础-Homework1

    The error was in my graduate work which was about game development.I broadcast some messages to the ...