返回上一页

CSP-S模拟5 (T4大坑未补)

下发文件和题解

T1 F

注意到n小于等于2000,可以爆搜所有情况,在异或不相等时直接跳出,若已有可能结果,拿map记录一下即可. 也可以写成循环形式,复杂度 .

点击查看代码
#include<bits/extc++.h>
#ifndef ONLINE_JUDGE
#include"debug"
#endif
#define ll long long
#define rg register
#define rll rg ll
#define maxn 2001
#define put_ putchar(' ')
#define putn putchar('\n')
using namespace std;
static inline ll read()
{
	rll f=0,x=0;rg char ch=getchar();
	while(ch<'0'||ch>'9') f|=(ch=='-'),ch=getchar();
	while(ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+(ch^'0'),ch=getchar();
	return f?-x:x;
}
static inline void write(rll x)
{
	if(x<0) putchar('-'),x=-x;
	if(x>9) write(x/10);putchar(x%10|'0');
}
ll n,a[maxn],b[maxn];
ll ans[maxn],tot;
bool fl[maxn];
__gnu_pbds::gp_hash_table<ll,bool> mp;
static inline void dfs(rll x,rll num)
{
	if(x==n+1) { if(!mp[num]) mp[num]=1,ans[++tot]=num;return; }
	for(rll i=1;i<=n;i++) if((!fl[i])&&(a[x]^b[i])==num) fl[i]=1,dfs(x+1,num),fl[i]=0;
}
int main()
{
	n=read();for(rll i=1;i<=n;i++) a[i]=read();for(rll i=1;i<=n;i++) b[i]=read();
	for(rll i=1;i<=n;i++) fl[i]=1,dfs(2,a[1]^b[i]),fl[i]=0;
	sort(ans+1,ans+tot+1);write(tot);putn;for(rll i=1;i<=tot;i++) write(ans[i]),putn;
	return 0;
}

T2 S

首先有一个性质:

.

有了这个性质,就可以愉快地dp了!

dp[r][g][y][0/1/2]表示当前重新排列后的序列已有r个R、g个G、y个Y,且当前的序列中最后一个为0(R)、1(G)、2(Y).

那么就有了:

dp[r+1][g][y][0]=min{dp[r][g][y][1],dp[r][g][y][2]}


dp[r][g+1][y][1]=min{dp[r][g][y][0],dp[r][g][y][2]}


dp[r][g][y+1][2]=min{dp[r][g][y][0],dp[r][g][y][1]}

这里min里面的dp还需要加上当前的位置差.

然后,转移就行了!

点击查看代码

潦草不堪的代码

#include<bits/stdc++.h>
#define ll int
#define rg register
#define rll rg ll
#define maxn 201
#define put_ putchar(' ')
#define putn putchar('\n')
#define szr pos[0].size()
#define szg pos[1].size()
#define szy pos[2].size()
using namespace std;
static inline ll read()
{
	rll f=0,x=0;rg char ch=getchar();
	while(ch<'0'||ch>'9') f|=(ch=='-'),ch=getchar();
	while(ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+(ch^'0'),ch=getchar();
	return f?-x:x;
}
static inline void write(rll x)
{
	if(x<0) putchar('-'),x=-x;
	if(x>9) write(x/10);putchar(x%10|'0');
}
ll n,t;
char s[maxn<<1];
vector<ll> pos[3];
ll dp[maxn][maxn][maxn][3];
int main()
{
	memset(dp,0x3f,sizeof(dp));dp[0][0][0][0]=dp[0][0][0][1]=dp[0][0][0][2]=0;
	n=read();scanf("%s",s+1);for(rll i=1;i<=n;i++) (s[i]=='R')?pos[0].push_back(i):(s[i]=='G')?pos[1].push_back(i):pos[2].push_back(i);
	if((t=(n>>1)+(n&1))&&(szr>t||szg>t||szy>t)) { puts("-1"); return 0; }
	for(rll i=0,y;i<n;i++)
		for(rll r=0;r<=i&&r<=szr;r++)
			for(rll g=0;g<=i&&g<=szg;g++)
				if(r+g<=i&&(!((y=i-r-g)&INT_MIN))&&y<=szy)
					((dp[r][g][y][0]^0x3f3f3f3f)?((szg-g?dp[r][g+1][y][1]=min(dp[r][g+1][y][1],dp[r][g][y][0]+abs(i+1-pos[1][g/*+1-1*/])):NULL),(szy-y?dp[r][g][y+1][2]=min(dp[r][g][y+1][2],dp[r][g][y][0]+abs(i+1-pos[2][y/*+1-1*/])):NULL)):NULL),
					((dp[r][g][y][1]^0x3f3f3f3f)?((szr-r?dp[r+1][g][y][0]=min(dp[r+1][g][y][0],dp[r][g][y][1]+abs(i+1-pos[0][r])):NULL),(szy-y?dp[r][g][y+1][2]=min(dp[r][g][y+1][2],dp[r][g][y][1]+abs(i+1-pos[2][y])):NULL)):NULL),
					((dp[r][g][y][2]^0x3f3f3f3f)?((szr-r?dp[r+1][g][y][0]=min(dp[r+1][g][y][0],dp[r][g][y][2]+abs(i+1-pos[0][r])):NULL),(szg-g?dp[r][g+1][y][1]=min(dp[r][g+1][y][1],dp[r][g][y][2]+abs(i+1-pos[1][g])):NULL)):NULL);
	write(min(dp[szr][szg][szy][0],min(dp[szr][szg][szy][1],dp[szr][szg][szy][2]))>>1);
	return 0;
}

T3 Y

贺的学长的

点击查看代码
#include<bits/stdc++.h>
#define ll long long
#define rg register
#define rll rg ll
#define pll pair<ll,ll>
#define maxn 1000001
#define mod 1000000007
#define put_ putchar(' ')
#define putn putchar('\n')
using namespace std;
static inline ll read()
{
	rll f=0,x=0;rg char ch=getchar();
	while(ch<'0'||ch>'9') f|=(ch=='-'),ch=getchar();
	while(ch>='0'&&ch<='9') x=((x<<3))+((x<<1))+(ch^'0'),ch=getchar();
	return f?-x:x;
}
static inline void write(rll x)
{
	if(x<0) putchar('-'),x=-x;
	if(x>9) write(x/10);putchar(x%10|'0');
}
ll n,a[maxn];
ll dp[maxn][2];
static inline ll ksm(rll a,rll b) { rll ans=1; a%=mod; for(rll i=b;i;i>>=1) { if(i&1) ans=ans*a%mod; a=a*a%mod; } return ans; }
static const ll inv2=ksm(2,mod-2),inv6=ksm(6,mod-2);
static inline ll sum(rll x) { return x*(x+1)%mod*inv2%mod; }
static inline ll sum2(rll x) { return x*(x+1)%mod*(x<<1|1)%mod*inv6%mod; }
static inline ll DP(rll x,rll y)
{
	memset(dp,0,sizeof(dp));dp[1][0]=x^1;dp[1][1]=x;
	for(rll i=1;i<=n;i++)
	{
		dp[i%n+1][0]=((dp[i%n+1][0]+dp[i][0]*sum(a[i]))%mod+dp[i][1]*((a[i]*sum(a[i])-sum2(a[i])+mod)%mod))%mod;
		if(y)
			dp[i%n+1][1]=(dp[i][0]*a[i]%mod+dp[i%n+1][1]+dp[i][1]*sum(a[i]-1))%mod;
		else
			dp[i%n+1][1]=(dp[i][0]*(a[i]+1)%mod+dp[i%n+1][1]+dp[i][1]*sum(a[i]))%mod;
	}
	if(x) return (dp[1][1]-1+mod)%mod;
	return (dp[1][0]-1+mod)%mod;
}
int main()
{
	n=read();for(rll i=1;i<=n;i++) a[i]=read();
	write((DP(0,0)+DP(1,0)-DP(0,1)+mod-DP(1,1)+mod)%mod);
	return 0;
}

大坑未补...

posted @   1Liu  阅读(33)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示