首页 > 其他分享 >AT_joisc2012_kangaroo

AT_joisc2012_kangaroo

时间:2024-11-16 12:07:57浏览次数:1  
标签:joisc2012 int kangaroo 括号 mathcal using ll dp

\(\mathcal{O}(n^3)\) 方法就不再赘述(前 \(i\) 个,\(j\) 条链,\(k\) 个不满足)。

考虑 \(a,b\) 分开来排序,从小到大,如果相同先排 \(b\)。比如说 3 22 1 排成 1 2(b) 2(a) 3,\(a\) 写成 ),\(b\) 写成 (,就是 (())。那么现在问题变成了:一个袋鼠可以塞进另一个袋鼠就是两个括号严格在前面,塞完了不能还有没有被塞的可以塞前面的括号。

发现合不合法只和最靠前的没有被塞的括号有关。设 \(dp_{i,j,0/1}\) 为前 \(i\) 个括号(一共 \(2n\) 个),还有 \(j\) 个要被塞,现在有没有出现“没有被塞”这个情况了。因为是排好序的,所以后面的 ( 一定可以塞得下前面的 )。分情况转移:

  • 如果是 )。那么我们可以决定钦不钦定是不是没有被塞,那么 \(dp_{i,j+1,k}+=dp_{i-1,j,k}\) 或 \(dp_{i,j,1}+=dp_{i,j,k}\)。
  • 如果是 (。只有在 \(k=0\) 的之后我才可以不塞东西。因此 \(dp_{i,j-1,0/1}+=dp_{i-1,j,0/1}\times j\)(选择哪个塞),和 \(dp_{i,j,0}+=dp_{i-1,j,0}\)。

因此得到一个 \(\mathcal{O}(n^2)\) 的算法。

#include <bits/stdc++.h>

using namespace std;

using ll = long long;

const int N = 5e3+3;
const ll mod = 1e9+7;

ll n,dp[N][2],f[N][2];
vector<pair<int,int> > p;

int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);

	cin>>n;
	for (int i=1; i<=n; i++){
		int a,b;
		cin>>a>>b;
		p.push_back({a,1});
		p.push_back({b,0});
	}
	sort(p.begin(),p.end());
	dp[0][0]=1;
	for (int i=1; i<=n*2; i++){
		for (int j=0; j<=n; j++){
			f[j][0]=dp[j][0],f[j][1]=dp[j][1];
			dp[j][0]=dp[j][1]=0;
		}
		if (p[i-1].second){
			for (int j=0; j<=n; j++){
				for (int k=0; k<2; k++){
					dp[j+1][k]=(dp[j+1][k]+f[j][k])%mod;
					dp[j][1]=(dp[j][1]+f[j][k])%mod;
				}
			}
		}
		else{
			for (int j=0; j<=n; j++){
				for (int k=0; k<2; k++){
					if (j) dp[j-1][k]=(dp[j-1][k]+f[j][k]*j%mod)%mod;
				}
				dp[j][0]=(dp[j][0]+f[j][0])%mod;
			}
		}
	}
	cout<<dp[0][1]<<endl;
	return 0;
}

标签:joisc2012,int,kangaroo,括号,mathcal,using,ll,dp
From: https://www.cnblogs.com/SFlyer/p/18549242

相关文章

  • P5999 [CEOI2016] kangaroo的TJ
    [CEOI2016]kangaroo其实就是给你一个\(p_1,p_n\)确定,其余未知的排列,求有多少个合法的排列,满足一个数要么比他相邻的两边都大,要么比他相邻的两边都小。我们若是依次考虑每\(p_{1,2,\cdots,n}\),由于他的取值还和后面有关,我们不好考虑,考虑依次将\(i=1,2,\cdots,n\)填入当前的序列......
  • P5999 [CEOI2016] kangaroo
    题目大意求出有多少种排列\(p\)满足对于任意\(i\in(1,n)\)有\(p_i\)两侧的值同时大于或小于\(p_i\)。规定\(p_1=s,p_n=t\)。\(2\leqn\leq2\times10^3,1\leqs,t\leqn\)思路首先能看出是动态规划。但是如果纯区间动规的话不太好转移,因为无法使得两个区间拼接的部分......
  • 52 Things: Number 35: Give the rough idea of Pollard rho, Pollard "kangaroo" and
    52Things:Number35:GivetheroughideaofPollardrho,Pollard"kangaroo"andparallelPollardrhoattacksonECDLP.52件事:第35件:大致了解Pollardrho、Pollard“袋鼠”和平行的Pollardrho对ECDLP的攻击。 Thisisthelatestinaseriesofblogpoststoadd......
  • AT_joisc2012_constellation 星座
    题目传送门更好看的题面非常巧妙的凸包。题目分析这道题的本质就是将所有点划分为两个生成树,求可能的方案数。part1求凸包的答案我们可以考虑先求一个整体的凸包,如下图:其中红色的点为星座$A$,蓝色的点为星座$B$,黑色的点不确定。先考虑凸包上的点,对于凸包上的点,当存在......
  • P5999 [CEOI2016] kangaroo
    前言写这篇题解的原因是这道题提供了一种新的dp思路——插入dp。题意给定一个长为\(n\)的数轴,一只袋鼠在上面要从\(s\)跳到\(t\),跳跃过程中,每次跳跃方向必须与上一次相反,求方案数。分析拿到这个题其实还是蛮蒙的,但是如果我们转化(抽象)一下题意,就会发现这道题可以看作:......
  • P5999 [CEOI2016] kangaroo 题解
    分析一个妙妙的trick。首先原题可以转化成求有多少\(1\simn\)的排列\(p\)满足\(\foralli\in(1,n)\),\(p_i\)两边的数同时小于或大于\(p_i\),且\(p_1=s,p_n=t\)......
  • P5999 [CEOI2016] kangaroo 蓝 题解
    前言有些题目照常DP不是很好做,感觉像是区间DP,但是怎么设状态都不好转移,那么可以考虑一种维护块儿的DP,就是这道题要用到的知识点。背景分析如果每次跳跃的点的编号形......
  • [CEOI2016] kangaroo题解
    P5999[CEOI2016]kangaroo一类插入式的dp。对于这道题,我们得先做出一个转化,依次考虑每个数插到哪个位置,于是变成了求\(1\)~\(n\)的排列同时满足每个位置上的元素要么......
  • P5999 [CEOI2016] kangaroo 题解
    感觉这样的\(\text{dp}\)题还比较多,思路都比较的神奇。个人感觉比较像区间\(\text{dp}\)的一类变种。但又和区间\(\text{dp}\)的维护方式极不一样。对于此类\(\t......