codeforces 425E
题意:对于[l1, r1], [l2, r2]...[lm, rm]线段组成的一个集合S,我们定义f(S)为最大的不相交(没有任何公共点)线段数,现在给定n及k,n表示线段范围,即任何[li, ri]有1<=li<=ri<=n,求有多少个集合使得f(S) = k。
思路:刚看到题目感觉不会,也就不多想。。
突然问了下小胖,小胖说他做过,不难。。然后我就慢慢想了。。
仔细想想,确实不难。。
假设现在已经给定了一个S,那么我们怎么求f(S)?
很显然,我们可以贪心,按照r排序,那么我们每次只要取最小r的线段,删除覆盖的,依次做完最后取到的线段肯定最多。。
这么以来对于任意一个集合S,我们肯定可以用最小的有用线段的右端点r来表示其状态。。
所以用f[i][j]表示最后一个有用线段右端点为i,最长有j段不相交的线段的方案数
则递推到f[k][j+1](k>i)的状态有:
在【i+1, k】区间内一定选了至少一条以k为右端点的线段,选法2k-i - 1
左端点在【1, i】右端点【i+1, k】的线段可以任意选不影响f值,有2(k-i)*i种
所以 f[k][j+1] += f[i][j] *(2k-i - 1) * 2(k-i)*i
code:
#include <bits/stdc++.h>
#define M0(x) memset(x, 0, sizeof(x))
#define M 1000000007
using namespace std;
typedef long long ll;
const int maxn = ;
int n, m;
ll dp[][], p[]; void solve(){
if (m == ){
puts("");
return;
}
M0(dp);
dp[][] = ;
p[] = ;
for (int i = ; i <= n * n; ++i) p[i] = (p[i-] << ) % M;
ll tmp;
int c = ;
for (int i = ; i < n; ++i)
for (int j = ; j < m; ++j) if (dp[i][j]){
c = ;
for (int k = i+; k <= n; ++k){
c += i;
tmp = dp[i][j] * (p[(k - i)]-) % M * p[c] % M;
dp[k][j+] = (dp[k][j+] + tmp) % M;
}
}
ll ans = ;
for (int i = ; i <= n; ++i){
tmp = p[(n-i) * i] * dp[i][m] % M;
ans = (ans + tmp) % M;
// printf("%d : %lld\n",i, ans);
}
cout << ans << endl;
} int main(){
freopen("a.in", "r", stdin);
while (scanf("%d%d", &n, &m) != EOF){
solve();
}
return ;
}
codeforces 425E的更多相关文章
- CodeForces 425E Sereja and Sets
意甲冠军: 集S它包括了很多间隔[l,r] 和1<=l<=r<=n f(S)个不相交的区间 问给出n和f(S) 有几种可能的S集合 思路: dp好题 至于为啥是dp- 我 ...
- Codeforces 425E Sereja and Sets dp
Sereja and Sets 我们先考虑对于一堆线段我们怎么求最大的不相交的线段数量. 我们先按 r 排序, 然后能选就选. 所以我们能想到我们用$dp[ i ][ j ]$表示已经选了 i 个线段 ...
- CodeForces - 425E Sereja and Sets 题解
题目大意: 我们有一个集合 S,其中包含了 m 个不完全相同的区间[l1,r1],[l2,r2]…[lm,rm] (1≤li≤ri≤n,li,ri 都为整数). 定义 f(S)=k,表示集合 S 中能 ...
- python爬虫学习(5) —— 扒一下codeforces题面
上一次我们拿学校的URP做了个小小的demo.... 其实我们还可以把每个学生的证件照爬下来做成一个证件照校花校草评比 另外也可以写一个物理实验自动选课... 但是出于多种原因,,还是绕开这些敏感话题 ...
- 【Codeforces 738D】Sea Battle(贪心)
http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...
- 【Codeforces 738C】Road to Cinema
http://codeforces.com/contest/738/problem/C Vasya is currently at a car rental service, and he wants ...
- 【Codeforces 738A】Interview with Oleg
http://codeforces.com/contest/738/problem/A Polycarp has interviewed Oleg and has written the interv ...
- CodeForces - 662A Gambling Nim
http://codeforces.com/problemset/problem/662/A 题目大意: 给定n(n <= 500000)张卡片,每张卡片的两个面都写有数字,每个面都有0.5的概 ...
- CodeForces - 274B Zero Tree
http://codeforces.com/problemset/problem/274/B 题目大意: 给定你一颗树,每个点上有权值. 现在你每次取出这颗树的一颗子树(即点集和边集均是原图的子集的连 ...
随机推荐
- [转载]: delphi中XLSReadWrite控件的使用(2)---delphi XE下安装
一.下载 官方下载网址: http://www.axolot.com/components/download.htm 从这里可以下载到从Delphi5到DelphiXE全部支持的版本. 二.软件安装 ...
- C#调用C++的dll
在类中添加引用 using System.Runtime.InteropServices; 在程序中写 //关闭连接 [DllImport("opapi2.dll", EntryP ...
- 开发BBS论坛
一.涉及表结构 web\model.py(首选需要注意表结构的设计,如果表结构设计出来了,软件的架构也就基本出来了) #!/usr/bin/env python # _*_ coding:utf- _ ...
- 前端Html+Css——豆蔻年华(自学一个月)
详细见千万别碰我--燕十三 html .htm .shtml三者区别是什么 1..htm与.html没有本质上的区别,表示的是同一种文件,只是适用于不同的环境之下. 2.DOS仅能识别8+3的文件名, ...
- Repeater控件 ---属性(ItemCommand事件)
epeater的Command操作:1.ItemCommand事件 - 在Repeater中所有能触发事件的控件,都会来触发这一个事件 2.CommandName - 判断点击的是什么按钮,e.Com ...
- bash脚本编程之二 条件判断and 逻辑运算
1.条件测试结构 1) if/then结构: 判断命令列表的退出码是否为0,0为成功. 如果if和then在条件判断的同一行上的话, 必须使用分号来结束if表达式: if和then都是关键字. 关键字 ...
- Linux Shell脚本入门--cut命令
Linux Shell脚本入门--cut命令 cut cut 命令可以从一个文本文件或者文本流中提取文本列. cut语法 [root@www ~]# cut -d'分隔字符' -f fields &l ...
- LoadRunner ---手动关联与预关联
手动关联 如果脚本很长,那么我们想找到一个脚本中哪些地方是需要关联的并不是一件容易的事情.这时,我们可以通过脚本对比的方法找 ...
- nwe
SELECT SUBSTR('20150601', 1, 6) AS CALC_MONTH, CHN.EMPLOYEE_CODE, CHN.CHANNEL_TYPE, ...
- iOS设计模式-Block实现代理的逻辑
在A页面,点击跳转到B页面,B页面操作完,回到A页面,并刷新A页面的内容.典型的例子,就是在一个列表里,点击新增,跳到新增页面,新增完,把数据传回给列表页,并刷新列表页里的内容. 这个,我平时一般是通 ...