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. Filter配置多个url-pattern

    java开发中会用的Filter过滤器,有时候开发需要,在一个Filter中需要配置多个过滤地址,即<url-pattern>,下面就说一下一个Filter过滤器中多个<url-pa ...

  2. Qt-QML-安卓编译问题

    Qt的强大在于跨平台,但是在某些地方做的还是不好,想我这种白痴,在编译安卓的时候就遇到新的问题,我在PC上面编译没有问题的,跑到安卓上面就会出现问题,我猜测应该是Qt的下面的编译的时候,用的还是旧的安 ...

  3. mysql新手进阶03

    当年忠贞为国酬,何曾怕断头? 如今天下红遍,江山靠谁守? 业未就,身躯倦,鬓已秋. 你我之辈,忍将夙愿,付与东流? 数据库结构如下: 仓库(仓库号, 城市, 面积) 订购单(职工号, 供应商号, 订购 ...

  4. angular-使用定时器调后台接口

    今天写了一个功能,一个是在两个页面中每隔一秒就调用一个后台接口 首先,这个功能使用了JS里的定时器.JS计时器分为一次性计时器和间隔性触发计时器,此次每隔一秒要调用这个接口,使用的是间隔性触发计时器 ...

  5. lintcode142 O(1)时间检测2的幂次

    O(1)时间检测2的幂次 用 O(1) 时间检测整数 n 是否是 2 的幂次. 您在真实的面试中是否遇到过这个题? Yes 样例 n=4,返回 true; n=5,返回 false. 二进制的n中只有 ...

  6. JAVA基础学习之路(二)方法定义,重载,递归

    一,方法的定义: package test; public class test1 { public static void main(String args[]) { int result = ad ...

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

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

  8. mysql 按日期统计

    按年汇总,统计: select sum(mymoney) as totalmoney, count(*) as sheets from mytable group by date_format(col ...

  9. Image控件显示以byte[]字节数组形式存在的图片

    工作中遇到了这样的一个问题.起初觉得很简单,获得了图片的byte[]后,可以将其转换成内存中的图片对象(如System.Drawing.Image),而后赋给页面的Image控件.尝试后才发现这样根本 ...

  10. javaScript中两个等于号和三个等于号之间的区别

    一言以蔽之:==先转换类型再比较,===先判断类型,如果不是同一类型直接为false. ===表示恒等于,比较的两边要绝对的相同 alert(0 == ""); // trueal ...