首页 > 其他分享 >【垫底模拟】CSP-13

【垫底模拟】CSP-13

时间:2023-08-03 16:33:56浏览次数:33  
标签:13 int sum ret ge maxn 垫底 aligned CSP

T1 y

什么寄吧。

懂了,不会的题就先排个序。

T2 s

这个题打了一个 dfs 求 10 以内全排列跑路了。

对于题里给的这个函数,\(1-n\) 的全排列求和:

int f(int n,int p[],int s[]){
    int ret=p[1];
    for(int i=2;i<=n;i++){
        if(s[i-1]==1)ret=max(ret,p[i]);
        else ret=min(ret,p[i]);
	}
    return ret;
}

求 \(\sum_{ret\ge 1}\limits ret\) 可以转换为:

\[ \begin{aligned} ret=\sum_{i=1}^{n}\limits [ret\ge i] \end{aligned} \]

(注:\([ret\ge i]\) 返回值是 bool 类型,即贡献为 \(1\))

那么可以考虑对每一个 \(i\) 计算 \(\sum_{p}\limits [ret\ge i]\),即求 \(p\) 的全排列下 \(ret\ge i\) 的个数。

现在我们只需要知道 \(ret\) 是否 \(\ge i\),所以不用关系 \(p\) 是什么样子,而是关系他们与 \(i\) 的大小关系:

把 \(\ge i\) 的数看做 \(1\),把 \(<i\) 的数看做 \(0\),如果最后 \(ret==1\) 那么肯定是取到了 \(>1\) 的结果,计算 \(ret==1\) 的方案数。

于是我们从 \(i=n\) 枚举到 \(i=1\),将问题转化为:

在长度为 \(n\) 的序列,填入 \(i\) 个 \(1\),使得 \(ret==1\) 的方案数。

设计动态规划:

设 \(f_{i,j,k}\) 表示当前填了第 \(i\) 个数,已经填了 \(j\) 个 \(1\)(包括第 \(i\) 位),当前 \(ret\) 为 \(0/1(k)\) 的方案数。

有转移:

  • 当前 \(ret\) 是 \(1\),由第 \(i-1\) 位置的:\((1,1),max(1,0),max(0,1)\) 转移。

  • 当前 \(ret\) 是 \(0\),由第 \(i-1\) 位置的:\((0,0),min(0,1),min(1,0)\) 转移。

即:

\[ \begin{aligned} &f_{i,j,1}=f_{i-1,j-1,1}+(s_{i-1}==1)(f_{i-1,j,1}+f_{i-1,j-1,0})\\ &f_{i,j,0}=f_{i-1,j,0}+(s_{i-1}==0)(f_{i-1,j-1,0}+f_{i-1,j,1}) \end{aligned} \]

答案从 \(f_{n,i,1}\) 中寻找。从 \(i=2,j=0\) 开始枚举,特别地 \(i==1\) 时 \(f_{1,1,1}=1\),\(f_{1,0,0}=1\)。

由于我们是填的 \(01\) 的方案,实际上数是不重复的即各不相同的,所以要乘上 \(i!(n-i)!\) 才是实际序列方案数。

(即 \(1\) 的排列 \(A_i^i\) 与 \(0\) 的排列 \(A_{n-i}^{n-i}\) 的乘积)

最后因为当前状态只与上一状态有关(且恶心的 256MiB 内存限制),所以使用滚动数组。

Miku's Code
#include<bits/stdc++.h>
using namespace std;

typedef long double llf;
typedef long long intx;
const int maxn=5e3+50,mod=998244353;

int n,s[maxn];
int cur;
intx fac[maxn];
intx f[2][maxn][2];

void pre(){
//预处理阶乘 
	fac[0]=1;fac[1]=1;
	for(int i=2;i<=maxn-1;++i){
		fac[i]=fac[i-1]*i%mod; 
	}
}

void input(){
	scanf("%d",&n);
	for(int i=1;i<=n-1;++i){
		scanf("%d",&s[i]);
	} 
}

void work(){
	for(int i=2;i<=n;++i){
		cur=cur^1;
		for(int j=0;j<=n;++j){
			if(j==0){
				f[cur][j][1]=(s[i-1]==1)*(f[cur^1][j][1])%mod;
				f[cur][j][0]=f[cur^1][j][0]+(s[i-1]==0)*f[cur^1][j][1]%mod;
			}
			else{
				f[cur][j][1]=(f[cur^1][j-1][1]+(s[i-1]==1)*(f[cur^1][j][1]+f[cur^1][j-1][0])%mod)%mod;
				f[cur][j][0]=(f[cur^1][j][0]+(s[i-1]==0)*(f[cur^1][j-1][0]+f[cur^1][j][1])%mod)%mod;	
			}
		}
	}
}

signed main(){
	pre();
	input();
	f[cur][1][1]=1;
	f[cur][0][0]=1;
	work();
	intx ans=0;
	for(int i=1;i<=n;++i){
		ans=(ans+f[cur][i][1]*fac[i]%mod*fac[n-i]%mod)%mod;
	}
	printf("%lld",ans);
	return 0;
}


标签:13,int,sum,ret,ge,maxn,垫底,aligned,CSP
From: https://www.cnblogs.com/sonnety-v0cali0d-kksk/p/17603511.html

相关文章

  • 【考后总结】8 月 CSP-S 模拟赛 1
    8.3CSP模拟13\(\text{zero4338round}\)T1y显然\(\text{xt}\)会选择四个角,对每个格子求出到四个角的曼哈顿距离最大值,操作一定会优先选择最大值较小的,所以把距离数组排个序就行了。T2s经典套路是设答案是\(a\),把小于\(a\)的位置设成\(0\),大于等于设成\(1\),这样按......
  • 【csp2020】 方格取数 题解
    洛谷传送门1.题目大意给定一个\(n*m\)的矩阵,矩阵中每个点\((i,j)\)都有一个权值\(f_{(i,j)}\)。每次可以向上,向下或向右走。问从\((1,1)\)走到\((n,m)\),经过的路径上点的权值之和最大是多少?2.思路这道题我们不难想到动态规划。但是与一般的动规不同的是,本题中有上下右......
  • P1341 无序字母对
    \(P1341\)无序字母对一、题目描述给定\(n\)个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒)。请构造一个有(\(n+1\))个字母的字符串使得每个字母对都在这个字符串中出现。输入格式第一行输入一个正整数\(n\)。第二行到第(\(n+1\))行每行两个......
  • web渗透测试(13):LDAP 攻击
    在本节中,我们将介绍LDAP攻击。LDAP通常用作身份验证的后端,尤其是在单点登录(SSO)解决方案中。LDAP有自己的语法,我们将在以下示例中更详细地看到。 如有不懂什么是LDAP请查看 Example1在第一个示例中,使用您的用户名和密码连接到LDAP服务器。在这种情况下,LDAP服务器不会对您进......
  • 算法-13-堆排序
            ......
  • 13.STL迭代器如何实现
    13.STL迭代器如何实现1.迭代器是一种抽象的设计理念,通过迭代器可以在不了解容器内部原理的情况下遍历容器,除此之外,STL中迭代器一个最重要的作用就是作为容器与STL算法的粘合剂。2.迭代器的作用就是提供一个遍历容器内部所有元素的接口,因此迭代器内部必须保存一个与容器相关联的......
  • 130.hello.c 程序的编译过程
    130.hello.c程序的编译过程以下是一个hello.c程序:#include<stdio.h>intmain(){printf("hello,world\n");return0;}在Unix系统上,由编译器把源文件转换为目标文件。gcc-ohellohello.c这个过程大致如下:![img](D:\BaiduSyncdisk\C++\笔记图片\130.h......
  • [刷题笔记] Luogu P5662 [CSP-J2019] 纪念品
    ProblemDescription类似于炒股票,有买进有卖出,当天可以既买进又卖出无限次,现在有若干件物品,每件物品都有一个价格,每天每件物品的价格不一致,你初始有\(m\)元钱,想要通过若干次购进卖出的操作,使得\(T\)天后你手里的钱最多。要求:\(T\)天结束你手中的股票必须全部售出。Solution乍看......
  • OCSP和CRL
    一、CRL证书吊销列表(CRL)指的是KPI系统中的一个结构化数据文件,其中包含了证书颁发机构(CA)已经吊销的证书的序号和吊销日期。可供企业、机构进行证书有效性查询。值得注意的是CRL并不是实时性的,因为证书颁发机构(CA)一般会间隔一段时间公布一次,而不是实时公布。二、OCSP......
  • 【垫底模拟】CSP-12
    一场比赛题解好像必须需要一张头图:T1随不会球教。T2便首先明确:子串是连续的子序列是不连续的,可以去掉其中的任意几个元素。如:子串\(hellloworld\)中子序列\(helloworld\)出现了\(3\)次。设\(f_{i,j}\)是表示\(S\)的子串\([1,i]\)中匹配到目标串\(he......