题目描述
在首尔城中,汉江横贯东西。在汉江的北岸,从西向东星星点点地分布着 NN 个划艇学校,编号依次为 11 到 NN。每个学校都拥有若干艘划艇。同一所学校的所有划艇颜色相同,不同的学校的划艇颜色互不相同。颜色相同的划艇被认为是一样的。每个学校可以选择派出一些划艇参加节日的庆典,也可以选择不派出任何划艇参加。如果编号为 iii 的学校选择派出划艇参加庆典,那么,派出的划艇数量可以在 a iai 至 b ibi 之间任意选择( a i ≤b iai≤bi)。
值得注意的是,编号为 ii 的学校如果选择派出划艇参加庆典,那么它派出的划艇数量必须大于任意一所编号小于它的学校派出的划艇数量。
输入所有学校的 a i ,b iai,bi 的值,求出参加庆典的划艇有多少种可能的情况,必须有至少一艘划艇参加庆典。两种情况不同当且仅当有参加庆典的某种颜色的划艇数量不同。
输入输出格式
输入格式:
第一行包括一个整数 NN,表示学校的数量。
接下来 NN 行,每行包括两个正整数,用来描述一所学校。其中第 ii 行包括的两个正整数分别表示 a i ,b iai,bi( 1≤a i ≤b i ≤10 91≤ai≤bi≤109)。
输出格式:
输出一行,一个整数,表示所有可能的派出划艇的方案数除以 1,000,000,0071,000,000,007 得到的余数。
输入输出样例
输入样例#1:
2
1 2
2 3
输出样例#1:
7
说明
【样例解释】
在只有一所学校派出划艇的情况下有 44 种方案,两所学校都派出划艇的情况下有 33 种方案,所以答案为 77。
【数据范围】
子任务 11( 99 分): 1≤N≤5001≤N≤500 且对于所有的 1≤i≤N1≤i≤N,保证 a i =b iai=bi。
子任务 22( 2222 分): 1≤N≤5001≤N≤500 且 ∑ Ni=1 (b i −a i )≤10 6∑i=1N(bi−ai)≤106。
子任务 33( 2727 分): 1≤N≤1001≤N≤100。
子任务 44( 4242 分): 1≤N≤5001≤N≤500。
题解: 首先来考虑这样一个问题:如果有 33个相同的区间,每个区间可以选数也可以不选,但是每个区间最多只能取出一个数,区间内的数属于 [1,len][1,len],要求取出其中的值严格递增,方案数有多少种?
我们可以考虑用加法原理枚举一下每种情况:
一个区间都不选:C 03∗C 0len=1 C30∗Clen0=1
只有一个区间取数:C 13∗C 1len=3∗len C31∗Clen1=3∗len
有两个区间取数:C 23∗C 2len=3∗ len∗(len−1)2C32∗Clen2=3∗len∗(len−1)2
三个区间都取数:C 33∗C 3len=1∗ len∗(len−1)∗(len−2)6C33∗Clen3=1∗len∗(len−1)∗(len−2)6
加起来就是$$C_{3}^{0} \times C_{len}^{0} + C_{3}^{1} \times C_{len}^{1} + C_{3}^{2} \times C_{len}^{2} + C_{3}^{3} \times C_{len}{3}
因为$C mn=C n−mn$, 式子也可以表示成: 因为$Cnm=Cnn−m$,式子也可以表示成:
C_{3} \times C_{len}^{0} + C_{3}^{2} \times C_{len}^{1} + C_{3}^{1} \times C_{len}^{2} + C_{3}^{0} \times C_{len}^{3}$$
考虑一下这个式子的实际意义:将一个长度为 len+3len+3的区间劈成两半,两边总共选出 33个数,也就相当于:
C 3len+3Clen+33
我们把这个结论扩展一下:有 n n个相同的区间,区间内的数的范围是 [1,len] [1,len],每个区间可以选择取或不取数,但是一个区间最多只能取一个数,方案数为
C nlen+n Clen+nn
好的,那么这个和我们的题目有什么关系呢?
首先我们将划艇的数量离散,用 tmp itmpi记录排名为 ii的值,我们设区间 ii表示 [tmp i ,tmp i+1 )[tmpi,tmpi+1)那么某个学校派出的划艇的数量一定是包含在一个或多个区间内的.设 f[i][j]f[i][j]表示当前处理到第 ii个学校,且第 ii个学校派出的划艇数量在 jj区间内的方案数.那么如果某个学校派出的划艇数量与第 ii个学校派出的划艇数量没有交集,那么就可以直接加上这部分的方案数:
len j ×∑ i′=0k−1 ∑ j′=0j−1 f[i ′ ][j ′ ]lenj×∑i′=0k−1∑j′=0j−1f[i′][j′]
然后我们需要考虑枚举在 [0,i−1][0,i−1]中与学校 ii的派出人数有交集的学校,将交集这一部分的贡献用组合的方法算出来.假设现在已经扫到了学校 k(k∈[0,i−1])k(k∈[0,i−1]), kk与 ii有交集,且 kk学校必须派出划艇,那么根据上面推出的结论,这一部分的贡献为:
∑ i′=1i−1 C i−i′−1i−i′+len−1 ×∑ k′=1i′−1 ∑ j′=1j−1 f[k][j]∑i′=1i−1Ci−i′+len−1i−i′−1×∑k′=1i′−1∑j′=1j−1f[k][j]
然后,我们会发现直接这样算是 O(n 5 )O(n5)的,但是我们又会发现前面枚举 f[i ′ ][j ′ ]f[i′][j′]可以直接前缀和,那么时间复杂度又降到了 O(n 3 )O(n3).
再讲一下初始化的问题,因为 f[0][j]f[0][j]可以转移到 f[1][...]f[1][...],这些状态都是合法的,所以 f[0][j]=1f[0][j]=1. f[i][0]f[i][0]同理.

#include<bits/stdc++.h>
using namespace std;
const int N = 1000+5;
const int mod = 1e9+7;int n, f[N][N*2], ans = 0, a[N], b[N], size = 0, tmp[N*2], cnt = 0, L[N], R[N], inv[N];int main(){ios::sync_with_stdio(false);cin >> n, inv[1] = 1;for(int i = 2; i <= n; i++) inv[i] = 1ll*(mod-mod/i)*inv[mod%i]%mod;for(int i = 1; i <= n; i++)cin >> a[i] >> b[i], tmp[++cnt] = a[i], tmp[++cnt] = b[i]+1;sort(tmp+1, tmp+cnt+1), size = unique(tmp+1, tmp+cnt+1)-tmp-1;for(int i = 1; i <= n; i++){L[i] = lower_bound(tmp+1, tmp+size+1, a[i])-tmp;R[i] = lower_bound(tmp+1, tmp+size+1, b[i]+1)-tmp;}for(int i = 0; i < size; i++) f[0][i] = 1;for(int i = 1; i <= n; i++){f[i][0] = 1; // for(int j = L[i]; j < R[i]; j++){int len = tmp[j+1]-tmp[j], c = len-1, m = 1; //f[i][j] = 1ll*f[i-1][j-1]*len%mod;for(int k = i-1; k >= 1; k--){if(L[k] > j || j >= R[k]) continue;m++, c = 1ll*c*(len+m-2)%mod*inv[m]%mod; //(f[i][j] += 1ll*f[k-1][j-1]*c%mod) %= mod;}}for(int j = 1; j < size; j++)f[i][j] = ((long long)f[i][j]+f[i-1][j]+f[i][j-1]-f[i-1][j-1]+mod)%mod;}cout << (f[n][size-1]-1+mod)%mod << endl;return 0;
}

80个测试点,快疯了!!!

CQNKP4044[APIO2016]赛艇相关推荐

  1. BZOJ 4584 [Apio2016]赛艇

    题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=4584 题解 首先将BiB_iBi​加111,把派出的数量变成左闭右开的区间,将AiA_i ...

  2. APIO2016赛艇

    首先每个学校的边界范围是\(1e9\),肯定不能直接\(dp[i][j]\)表示前i所学校,第\(i\)所学校派出\(j\)艘船,但\(b<=500\)所有考虑把\(a,b\)离散,第二维改为当 ...

  3. mysql sql语句联系_sql语句练习50题(Mysql版)

    表名和字段 –1.学生表 Student(s_id,s_name,s_birth,s_sex) –学生编号,学生姓名, 出生年月,学生性别 –2.课程表 Course(c_id,c_name,t_id ...

  4. 2017FJ省队集训 游记

    2017FJ省队集训 游记 又是一篇流水账 Day 1 今天是省队集训的第一天.早上骑车去八中,到的时候汗流太多浑身湿透被杨哥哥和runzhe2000 d了,一个说我去游泳了一个说我打球了...流完汗 ...

  5. [APIO2016]

    2016的题貌似是韩国棒子出的,好丧啊.... 看了题解还想了好久...... ------------------------------------------------- A.Boat 有n个 ...

  6. Loj #2568. 「APIO2016」烟花表演

    Loj #2568. 「APIO2016」烟花表演 题目描述 烟花表演是最引人注目的节日活动之一.在表演中,所有的烟花必须同时爆炸.为了确保安全,烟花被安置在远离开关的位置上,通过一些导火索与开关相连 ...

  7. 「APIO2016」烟花表演

    「APIO2016」烟花表演 解题思路 又是一道 solpe trick 题,观察出图像变化后不找一些性质还是挺难做的. 首先令 \(dp[u][i]\) 为节点 \(u\) 极其子树所有叶子到 \( ...

  8. 获奖最多的这届中国赛艇、皮划艇队,借助了怎样的科技?

    时隔13年之后,中国赛艇.皮划艇队终于再一次站上了奥运会的最高领奖台. 不仅如此,本届东京奥运会还成为了中国赛艇.皮划艇队历年来荣获奖牌最多.历史成绩最佳的一届奥运会. 能够实现如此令人惊叹的历史性突 ...

  9. 根据三轴加速度计算赛艇划桨数的算法

    一. 简介 现代体育竞技早已不止是单纯的体力比拼,科技能力也成为决定运动员竞技水平和比赛成绩的重要因素.对于赛艇运动来说,能够测量运动员划桨的桨频以及划桨次数是最基础的数据,本文旨在阐述一种利用三轴加 ...

最新文章

  1. 中通知设置响铃_iOS 13.1.3 正式版:解决来电不响铃问题
  2. 微服务架构_企业中的微服务:敌是友?
  3. MATLAB问题解决方案- Matlab出现报错:​‘***‘不是内部或外部命令,也不是可运行的程序或批处理文件
  4. get,post请求的编码统一
  5. Swift 3.0 (二)
  6. 文件用户Apache shiro学习笔记+ spring整合shiro (一)
  7. RestTemplate HttpMessageConverter报错的解决方案no suitable HttpMessageConverter
  8. 文献管理三剑客之Noteexpress:更新一次文献后把文献自动插一次
  9. qt mdi 子窗口关闭再打开_QT 信号的使用方法
  10. 推荐几款强大流行的BI系统
  11. 联想笔记本linux无线网卡驱动下载,联想无线网卡驱动下载-联想 X1 Carbon网卡驱动下载v18.40.0 官方最新版-西西软件下载...
  12. 数字电路基础知识(二)
  13. (转)C#软件注册与注册机
  14. ZigBee组网实验:多终端节点向协调器发送数据协调器给终端节点发送数据
  15. 解决工商银行网银插件报‘非正常运行的网银工具’问题
  16. 前花椒直播CEO胡震生:我如何不花钱引爆的花椒直播
  17. 傅里叶变换复数形式的实部代表什么_复数形式傅里叶变换的物理意义中,相位究竟指的是什么?...
  18. DDoS攻击防范技术
  19. html5 自动连接wifi,怎么设置自动切换wifi 点击右上角的【高级设置】
  20. Dream_Chaser队训练赛第一场 K题

热门文章

  1. 《画壁》——人人都有一场无悔的爱恋
  2. 读灵遁者诗歌:像晚霞一样的谜团
  3. 私はずっと頑張って、しかしどうしてやはりこのようにしますか。自分で問題を探します!
  4. 多城争抢RoboTaxi落地头炮,长沙或将最先胜出?
  5. DEBUG模式和RELEASE模式切换
  6. 数据分析入门:初始数据埋点(二)
  7. 独显+集显设置三个显示器输出,其中两个副屏输出相同
  8. css中的 :root
  9. vue中$root的用法
  10. 简单分享对知识付费的看法