BZOJ4584 & 洛谷3643 & UOJ204:[APIO2016]划艇——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4584
https://www.luogu.org/problemnew/show/P3643
在首尔城中,汉江横贯东西。在汉江的北岸,从西向东星星点点地分布着个划艇学校,编号依次为到。每个学校都拥有若干艘划艇。同一所学校的所有划艇颜色相同,不同的学校的划艇颜色互不相同。颜色相同的划艇被认为是一样的。每个学校可以选择派出一些划艇参加节日的庆典,也可以选择不派出任何划艇参加。如果编号为的学校选择派出划艇参加庆典,那么,派出的划艇数量可以在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]划艇——题解的更多相关文章
- 洛谷P1783 海滩防御 分析+题解代码
洛谷P1783 海滩防御 分析+题解代码 题目描述: WLP同学最近迷上了一款网络联机对战游戏(终于知道为毛JOHNKRAM每天刷洛谷效率那么低了),但是他却为了这个游戏很苦恼,因为他在海边的造船厂和 ...
- 洛谷P4047 [JSOI2010]部落划分题解
洛谷P4047 [JSOI2010]部落划分题解 题目描述 聪聪研究发现,荒岛野人总是过着群居的生活,但是,并不是整个荒岛上的所有野人都属于同一个部落,野人们总是拉帮结派形成属于自己的部落,不同的部落 ...
- 洛谷P1155 双栈排序题解(图论模型转换+二分图染色+栈)
洛谷P1155 双栈排序题解(图论模型转换+二分图染色+栈) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1311990 原题地址:洛谷P1155 双栈排序 ...
- 洛谷10月月赛II题解
[咻咻咻] (https://www.luogu.org/contestnew/show/11616) 令人窒息的洛谷月赛,即将参加NOIp的我竟然只会一道题(也可以说一道也不会),最终145的我只能 ...
- [洛谷P1823]音乐会的等待 题解(单调栈)
[洛谷P1823]音乐会的等待 Description N个人正在排队进入一个音乐会.人们等得很无聊,于是他们开始转来转去,想在队伍里寻找自己的熟人.队列中任意两个人A和B,如果他们是相邻或他们之间没 ...
- BZOJ2527 & 洛谷3527:[Poi2011]Meteors——题解
+++++++++++++++++++++++++++++++++++++++++++ +本文作者:luyouqi233. + +欢迎访问我的博客:http://www.cnblogs.com/luy ...
- 洛谷 p1516 青蛙的约会 题解
dalao们真是太强了,吊打我无名蒟蒻 我连题解都看不懂,在此篇题解中,我尽量用语言描述,不用公式推导(dalao喜欢看公式的话绕道,这篇题解留给像我一样弱的) 进入正题 如果不会扩展欧里几德的话请先 ...
- 洛谷p2370yyy2015c01的U盘题解
没什么特殊的想法 就是看自己很久没有更新关于题解类的文章了而已 (其实这是我好久之前做的, 只是把它从洛谷博客搬到了这里而已) 题目 首先分析题目要二分 他长成这个亚子太二分了 所以就要二分 最好是先 ...
- 2019.06.17课件:[洛谷P1310]表达式的值 题解
P1310 表达式的值 题目描述 给你一个带括号的布尔表达式,其中+表示或操作|,*表示与操作&,先算*再算+.但是待操作的数字(布尔值)不输入. 求能使最终整个式子的值为0的方案数. 题外话 ...
随机推荐
- 华为LiteOS系统使用-任务调度函数-第一篇
1.最近项目遇到华为的LiteOS小型操作系统,使用学习 2. 先打开一个工程LiteOS_Kernel-master\projects\LPC824_LITE_KEIL 3. main.c里面2个关 ...
- Mac安装php和redis扩展
Mac上有特定的包管理工具homebrew,也叫brew,这里的php安装用的就是brew 1安装php brew install php@7.0. brw安装会自动管理依赖,所以不用你一个个先安装依 ...
- focus如何实现事件委托
事件委托是利用事件冒泡机制的一种优化手段,如果有很多列表元素要绑定事件,那么就可以用事件委托来优化(不需要给每个元素都绑定事件).但是对于focus这种特殊的表单事件,它不会冒泡,那么又该如何实现这一 ...
- 用最简单的MVC模式输出内容
MVC是模型(model)-视图(view)-控制器(controller)的缩写,它的作用是使代码分离,可维护性高.重用性高 编写Model层: <?php class model{ publ ...
- Selenium基础之--01(将浏览器最大化,设置浏览器固定宽、高,操控浏览器前进、后退)
1,将浏览器最大化 我们知道调用启动的浏览器不是全屏的,这样不会影响脚本的执行,但是有时候会影响我们"观看"脚本的执行. coding=utf-8 from selenium im ...
- appium启动APP配置参数:
一.Android启动app python启动脚本如下: from appium import webdriver desired_caps = {} desired_caps['plat ...
- DataTable转Json,Json转DataTable
// 页面加载时 /// </summary> /// <param name="sender"></param> /// <param ...
- Redis 错误摘记篇
yum安装的redis提示如下报错,大概意思就是配置文件和redis-server进程文件版本不一致.. [root@vm-10-104-28-24 yum.repos.d]# redis-serve ...
- puppet学习笔记
puppet优势:容易理解.用户较多.门槛低.简单.安装配置文件较少 puppet使用Ruby语言开发,安装puppet需要安装Ruby puppet运行环境:Redhat.Centos.Window ...
- 软件工程 part4 评价3作品
作品1 抢答器 地址: https://modao.cc/app/ylGTXobcMU7ePNi6tY53gG4iraLl0md评价: 挺好玩,但是字体大小是个缺陷,简单大方. 作品2:连连看 软件工 ...