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

Output
   输出一行,一个整数,表示所有可能的派出划艇的方案数除以1,000,000,007得到的余数

Solution
  开始搞了个两维dp,瞬间WA掉,没考虑到离散化以后在同一个块中的情况,然后就滚去看题解。只要再加一维???记一下现在有几个和我是同一组,然后这个用组合数乱搞一下,前缀和优化即可。
  这个方法很简单,然而我不敢定三维的状态,虽然这个的时间复杂度是三方的,但空间是两方的。尝试定义状态,然后说不定可以前缀和优化。

  我的代码所用的方法不太一样,有点类似于0/1背包的搞法,我们一段一段数字(jjj)地往里边加,令g[i]" role="presentation" style="position: relative;">g[i]g[i]g[i]表示处理到第iii所学校,目前的合法状态的数量是多少。
这个需要计算calc(l,r,j)" role="presentation" style="position: relative;">calc(l,r,j)calc(l,r,j)calc(l, r, j),表示[l,r)[l,r)[l,r)中每所学校都在jjj区间中选数,可选可不选,第r所学校必须选,序列递增的方案数。

cal(l,r,j)=∑i=1m+1C(l,i)∗C(m,i−1)=∑i=1m+1C(l,i)∗C(m,(m+1)−i)=C(l+m,m+1)" role="presentation">cal(l,r,j)=∑i=1m+1C(l,i)∗C(m,i−1)=∑i=1m+1C(l,i)∗C(m,(m+1)−i)=C(l+m,m+1)cal(l,r,j)=∑i=1m+1C(l,i)∗C(m,i−1)=∑i=1m+1C(l,i)∗C(m,(m+1)−i)=C(l+m,m+1)

cal(l,r,j)=\sum_{i = 1}^{m + 1} C(l,i)*C(m,i-1) = \sum_{i = 1}^{m + 1} C(l,i)*C(m,(m+1)-i) = C(l+m,m+1) 
  其中mmm表示有多少范围中的学校可以在j" role="presentation" style="position: relative;">jjj区间选数。(我觉得这种写法很短很精辟啊

Source

//2018-4-20
//miaomiao
//
#include <bits/stdc++.h>
using namespace std;#define For(i, a, b) for(int i = (a); i <= (int)(b); ++i)
#define Forr(i, a, b) for(int i = (a); i >= (int)(b); --i)#define N (500 + 5)
#define M (1000 + 5)
const int P = 1e9 + 7;inline int Mul(int a, int b){return (long long)a * b % P;
}
inline void Add(int &a, int b){a += b; if(a >= P) a -= P;
}int n, m, a[N], b[N], num[M], g[N], inv[N], C[N];int main(){
#ifndef ONLINE_JUDGEfreopen("boat.in", "r", stdin);freopen("boat.out", "w", stdout);
#endifinv[1] = 1;For(i, 2, 500) inv[i] = (long long)(P - P / i) * inv[P % i] % P;scanf("%d", &n);For(i, 1, n){scanf("%d%d", &a[i], &b[i]);num[++m] = a[i], num[++m] = ++b[i];}num[++m] = 0; sort(num + 1, num + m + 1);m = unique(num + 1, num + m + 1) - num - 1;For(i, 1, n){a[i] = lower_bound(num + 1, num + m + 1, a[i]) - num;b[i] = lower_bound(num + 1, num + m + 1, b[i]) - num;}C[0] = g[0] = 1;For(j, 1, m - 1){int len = num[j + 1] - num[j];  For(i, 1, n) C[i] = Mul(Mul(C[i - 1], len + i - 1), inv[i]);Forr(i, n, 1) if(a[i] <= j && b[i] >= j + 1){int sum = 0, nn = 1, mc = len;Forr(p, i - 1, 0){Add(sum, Mul(mc, g[p]));if(a[p] <= j && b[p] >= j + 1) mc = C[++nn];}Add(g[i], sum);}}int ans = 0;For(i, 1, n) Add(ans, g[i]);printf("%d\n", ans);return 0;
}

【APIO2016】划艇相关推荐

  1. [APIO2016]划艇

    [APIO2016]划艇 总共只有2*n段.分段进行DP 简单的方法是: 外层枚举段数j,f[i]表示,当前枚举到j的时候,以(i,j)结尾(必须选择(i,j))的方案数,枚举一个f(p,1~j-1) ...

  2. [APIO2016] 划艇(dp + 组合数 + 前缀和优化)

    problem luogu-P3643 solution 有个显然的暴力 dpdpdp.设 dp(i,j):dp(i,j):dp(i,j): 到了第 iii 个学校,其参加且派出 jjj 个划艇的方案 ...

  3. luogu P3643 [APIO2016]划艇

    https://www.luogu.com.cn/problem/P3643 经典题 把范围离散化后转移可以做到 O ( n 3 ) O(n^3) O(n3) 方案数可以用用组合数计算 code: # ...

  4. Educational Codeforces Round 81 (Rated for Div. 2) F.Good Contest \ 洛谷 划艇 组合 计数dp

    cf传送门 P3643 [APIO2016]划艇 文章目录 题意: 思路: 题意: aia_iai​在[li,ri][l_i,r_i][li​,ri​]等概率随机选一个数,求aaa数组不增的概率. 思 ...

  5. 2020.7月做题记录

    转眼就到了2020的下半年了-前方仍是一片茫然. 长期计划 prufer 序列 2020.07.02-2020.07.04 Problem Finished P2624 [HNOI2008]明明的烦恼 ...

  6. 「APIO2016」划艇 (dp+组合数+区间离散化)(考试)

    题干: 在首尔城中,汉江横贯东西.在汉江的北岸,从西向东星星点点地分布着 N 个划艇学校,编号依次为 1 到 N.每个学校都拥有若干艘划艇.同一所学校的所有划艇颜色相同,不同的学校的划艇颜色互不相同. ...

  7. [APIO2016]

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

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

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

  9. 「APIO2016」烟花表演

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

最新文章

  1. java 有界类型_Java™ 教程(有界类型参数)
  2. 阻塞队列 java实现_JAVA实现阻塞队列
  3. 预见未来 | 数据智能的现在与未来
  4. Linux 设备文件的创建和mdev
  5. 领航智变时代 2020 NAVIGATE领航者峰会云上起航
  6. 智·御未来 亚信安全巡展·2017即将起航
  7. 计算机安装pdf打印机驱动,Win7安装Microsoft Print to PDF虚拟打印机的方法
  8. win10自动更新系统导致 点击睡眠之后直接关机
  9. 华为数通NA-NP学习笔记(个人精简)
  10. 东方联盟郭盛华:物联网安全是供应链问题
  11. android代码判断当前手机的手机号码是属于移动、联通、还是电信的
  12. 天勤系列的考研复习资料
  13. 使用ajax提交form表单,包括ajax文件上传 转http://www.cnblogs.com/zhuxiaojie/p/4783939.html...
  14. cadence SPB17.4 - Active Class and Subclass
  15. openlayers给要素加文字注记
  16. apt安装golang
  17. 计算机休眠查询,可不可以查询电脑待机记录
  18. 前端技能树,面试复习第 1 天—— 建立前端知识框架 | HTML 知识考察点
  19. GB28181实现摄像头网页无插件直播、回放过程中设备状态分析
  20. Java字符串转换成字符数组

热门文章

  1. Apache Beam WordCount案例编写
  2. python爬取帅啊网的帅哥美男图片
  3. GIS十问之三:公司要求工作经验,应届生怎么办?
  4. 理解一维数组中 buf、buf[0]、buf[0]、buf 四个符号的含义
  5. 第一个童年游戏“动物棋,开发及移植到android
  6. 服务器租用和服务器托管有什么区别
  7. 面向对象分析与设计——设计模式初探
  8. Java面向对象(下)
  9. MFS分布式存储-集群
  10. 24小时制时间转换成am、pm (或 上午、下午)