AGC030F - Permutation and Minimum
https://atcoder.jp/contests/agc030/tasks/agc030_f
题解
我们先把这个排列从\(1 \sim 2n\)表达出来,然后题面中的每一对数我们可以用一条线把他们连起来,那么在序列中表达出的值是这条线的左端点。
如果一开始每个数都没有限制的话,我们则需要求有哪些数会成为左端点,这个其实就是卡特兰数,求答案的话还需要求一个阶乘。
现在有一些位置有了限制,我们就把有限制的位置成为特殊位置。
还是从\(1\sim 2n\)这个序列上考虑,因为我们的贡献是在左端点产生,所以我们设\(dp[i][j][k]\)表示做到\(i\),有\(j\)个普通点没有被匹配,有\(k\)个特殊点没有被匹配。
普通点可以任意匹配,特殊点只能匹配普通点。
如果普通点匹配了特殊点,那么它的位置已经确定了,所以最后我们要乘上普通配普通的对数的阶乘。
代码
#include<bits/stdc++.h>
#define N 602
using namespace std;
typedef long long ll;
int n,now,a[N],sm;
int tag[N];
ll jie[N],dp[2][302][302];
const int mod=1e9+7;
inline void MOD(ll &x){x=x>=mod?x-mod:x;}
inline ll rd(){
ll x=0;char c=getchar();bool f=0;
while(!isdigit(c)){if(c=='-')f=1;c=getchar();}
while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
return f?-x:x;
}
int main(){
n=rd();
sm=n*2;
int cnt=0;
for(int i=1;i<=sm;++i){
a[i]=rd();
if(a[i]!=-1)tag[a[i]]=1;
if(i%2==0&&a[i]!=-1&&a[i-1]!=-1){
tag[a[i]]=-1;
tag[a[i-1]]=-1;
}
if(i%2==0&&a[i]==-1&&a[i-1]==-1)cnt++;
}
jie[0]=1;
for(int i=1;i<=sm;++i)jie[i]=jie[i-1]*i%mod;
dp[1][0][0]=1;
int now=1,pre=0;
for(int i=sm;i>=1;--i)if(tag[i]!=-1){
swap(now,pre);
memset(dp[now],0,sizeof(dp[now]));
for(int j=0;j<=n;++j)
for(int k=0;j+k<=n;++k)if(dp[pre][j][k]){
if(tag[i]){
MOD(dp[now][j][k+1]+=dp[pre][j][k]);
if(j)MOD(dp[now][j-1][k]+=dp[pre][j][k]);
}
else{
MOD(dp[now][j+1][k]+=dp[pre][j][k]);
if(j)MOD(dp[now][j-1][k]+=dp[pre][j][k]);
if(k)MOD(dp[now][j][k-1]+=dp[pre][j][k]*k%mod);
}
}
}
printf("%lld",dp[now][0][0]*jie[cnt]%mod);
return 0;
}
AGC030F - Permutation and Minimum的更多相关文章
- 【agc030f】Permutation and Minimum(动态规划)
[agc030f]Permutation and Minimum(动态规划) 题面 atcoder 给定一个长度为\(2n\)的残缺的排列\(A\),定义\(b_i=min\{A_{2i-1},A_{ ...
- 【AGC030F】Permutation and Minimum DP
题目大意 有一个长度为序列 \(a\),其中某些位置的值是 \(-1\). 你要把 \(a\) 补成一个排列. 定义 \(b_i=\min(a_{2i-1},a_{2i})\),求有多少种可能的 \( ...
- 【AGC030F】Permutation and Minimum(DP)
题目链接 题解 首先可以想到分组后,去掉两边都填了数的组. 然后就会剩下\((-1,-1)\)和\((-1,x)\)或\((x,-1)\)这两种情况 因为是最小值序列的情况数,我们可以考虑从大到小填数 ...
- AtCoder Grand Contest 030 (AGC030) F - Permutation and Minimum 动态规划
原文链接www.cnblogs.com/zhouzhendong/p/AGC030F.html 草率题解 对于每两个相邻位置,把他们拿出来. 如果这两个相邻位置都有确定的值,那么不管他. 然后把所有的 ...
- Atcoder Grand Contest 030 F - Permutation and Minimum(DP)
洛谷题面传送门 & Atcoder 题面传送门 12 天以前做的题了,到现在才补/yun 做了一晚上+一早上终于 AC 了,写篇题解纪念一下 首先考虑如果全是 \(-1\) 怎么处理.由于我 ...
- AtCoder Grand Contest 030题解
第一次套刷AtCoder 体验良好 传送门 Poisonous Cookies cout<<b+min(c,a+b+); Tree Burning 难度跨度有点大啊 可以证明当第一次转向之 ...
- AGC030 简要题解
A - Poisonous Cookies 题意 有\(A\)个能解毒的普通饼干,\(B\)个能解毒的美味饼干,\(C\)个有毒的美味饼干,求最多能吃多少个美味饼干,每次吃完有毒的饼干后要解毒后才能继 ...
- 【AtCoder】AGC030
A - Poisonous Cookies 有毒还吃,有毒吧 #include <bits/stdc++.h> #define fi first #define se second #de ...
- [LeetCode] Minimum Window Substring 最小窗口子串
Given a string S and a string T, find the minimum window in S which will contain all the characters ...
随机推荐
- Centos中使用Docker部署Apollo
采用微服务开发框架开发项目时会涉及多个系统,如果要更改配置参数需要在多个系统间逐一更改,比较费时,而且容易遗漏,效率低下,次问题可以采用Apollo配置中心的方式解决,下面将介绍如何配置: 准备环境: ...
- 在excel中如何计算两个时间之间的差[转]
因为时间是由序列号所代表的,用户可以用较晚的时间减去较早的时间以得到间隔.例如,单元格A3含有5:30,单元格B3含有14:00,下面的公式返回8:30(间隔8小时30分). =B3-A3 然而,如果 ...
- windows 2012 r2如何开启远程桌面
windows 2012 r2如何开启远程桌面 编写人:左丘文 2019-7-6 Windows 2012安装完成后需要开启远程桌面才可以远程连接,网上搜索了一下,有以下几个解决办法,虽说最后还是自己 ...
- Vue-cli3 简qian易yi教程
原文地址 对于没有了解过 vue-cli3 的童鞋,建议先去看看官方的教程: 传送门 新版本的新特性 1. 插件 使用 cli 的插件,可以很快的搭建一个项目的结构.如 axios 的插件 vue-c ...
- P2510 [HAOI2008]下落的圆盘
传送门 首先考虑两个圆覆盖的情况,我们可以求出圆心与交点连线 $A$ 的极角 具体就是求出两圆心连线 $B$ 极角加上余弦定理加反余弦求出 $A,B$ 之间夹角 ,然后覆盖了多少就可以得出 但是多个圆 ...
- 【转】Hadoop 1.x中fsimage和edits合并实现
在NameNode运行期间,HDFS的所有更新操作都是直接写到edits中,久而久之edits文件将会变得很大:虽然这对NameNode运行时候是没有什么影响的,但是我们知道当NameNode重启的时 ...
- C#多播委托详解
包含多个方法的委托成为多播委托,调用多播委托,可以按照顺序连续调用多个方法,因此,委托的签名就必须返回void;否则,就只能得到委托调用的最好一个方法的结果 1.多播委托可以用运算符"+&q ...
- tomcat 启动报错 解决办法 A child container failed during 
转自:http://blog.sina.com.cn/s/blog_4e1e357d0102v55c.html 控制台报错: Caused by: org.apache.catalina.Lifecy ...
- python 变量、列表、元组、字典
python 变量.列表.元组.字典 1.python 变量赋值 2.ptython 列表 3.python 元组 4.python 字典 1. Python变量赋值 1.1变量的命名规 ...
- C Makefile初学基础
# this is make file hello.out: max.o min.o hello.c gcc max.o min.o hello.c -o hello.out max.o:max.c ...