首页 > 其他分享 >冲刺CSP联训模拟1

冲刺CSP联训模拟1

时间:2024-09-26 17:03:29浏览次数:1  
标签:度数 std min int 冲刺 瞬移 联训 maxn CSP

A. 几何

设 \(f_{i,j,k}\) 表示前 \(i\) 个字符,分为两部分,分别为 \(x\) 的几倍加 \(x\) 的前 \(j\) 位,\(y\) 的几倍加 \(y\) 的前 \(k\) 位,是否合法

分别判断下一位 \(i+1\) 能否与 \(x\) 的下一位 \(j+1\) 和 \(y\) 的下一位 \(k+1\) 匹配,匹配上了就转移.

最终答案就是 \(f_{|s|,0,0},f_{|s|,0,|y|},f_{|s|,|x|,0},f_{|s|,|x|,|y|}\) 有一个是1就是 \(Yes\) ,要用 \(bitset\) 优化,我三目运算符卡过去的

点击查看代码
#include<bits/stdc++.h>
//const int maxn=5e5+10;
using namespace std;
int t,cnt,len1,len2,len3;
bool f[2][51][51];
string s,x,y;

int main()
{
	ios::sync_with_stdio(0);
	freopen("geometry.in","r",stdin);
	freopen("geometry.out","w",stdout); 
	cin>>t;
	while(t--)
	{
		cin>>s>>x>>y;
		len1=s.size();len2=x.size();len3=y.size();
		s=" "+s,x=" "+x,y=" "+y;
		memset(f,0,sizeof f);
		f[1][1][0]=s[1]==x[1]?1:0;
		f[1][0][1]=s[1]==y[1]?1:0;
		for(int i=1;i<=len1;++i)
		{
			memset(f[i+1&1],0,sizeof f[i+1&1]); 
			for(int j=0;j<=len2;++j)
			{
				for(int k=0;k<=len3;++k)
				{
					j==len2?
						f[i+1&1][1][k]|=s[i+1]==x[1]?f[i&1][j][k]:f[i+1&1][1][k]
						:f[i+1&1][j+1][k]|=s[i+1]==x[j+1]?f[i&1][j][k]:f[i+1&1][j+1][k];
					k==len3?
						f[i+1&1][j][1]|=s[i+1]==y[1]?f[i&1][j][k]:f[i+1&1][j][1]
						:f[i+1&1][j][k+1]|=s[i+1]==y[k+1]?f[i&1][j][k]:f[i+1&1][j][k+1];
//					cout<<f[i][j][k]<<endl;
				}
			}
		}
		if(f[len1&1][len2][len3]||f[len1&1][0][0]||f[len1&1][len2][0]||f[len1&1][0][len3]) cout<<"Yes"<<'\n';
		else cout<<"No"<<'\n';
	}

	return 0;
}
/*
2
ababcd
abc
abd
abcdef
abc
cde
*/

B. 分析

树形 \(dp\),每一次移动只会改变首尾的点度数奇偶性,而每一个奇数点就要多进行一次瞬移操作,而每一次回复一条边

相当于加了一条边,改变了两个点的度数,所以我们考虑每一条边是否再加一条边,然后统计瞬移次数,让代价最小

设 \(f_{u,0/1,0/1}\) 表示以 \(u\) 为根的子树 \(u\) 是不是奇数度数点,除去 \(u\) 后子树内有没有度数奇数的点

加一条边的话,再算上考虑新合并的子节点与父节点之间的边,就是相当于加了两条边,度数奇偶不变,代价加 \(A\)

不加的话,就是只新有了父子之间本来的边,度数改变,再考虑原来父子度数奇偶,两奇的话相当于少了一次瞬移

俩偶的话相当于多了一次瞬移,一奇一偶相当于没变

点击查看代码
#include<bits/stdc++.h>
#define int long long 
const int maxn=5e5+10;
using namespace std;
int A,B,n;
int head[maxn],to[maxn<<1],nxt[maxn<<1],tot,f[maxn][2][2],ans;

void add(int x,int y)
{
	to[++tot]=y;
	nxt[tot]=head[x];
	head[x]=tot;
}
void addm(int x,int y)
{
	add(x,y),add(y,x);
}

void lsx(int x,int fa)
{
	int a[2][2];
	for(int j=0;j<=1;j++)
	{
		for(int k=0;k<=1;k++)
		{
			f[x][j][k]=1e15;
		}
	}
	f[x][0][0]=0;
	for(int i=head[x];i;i=nxt[i])
	{
		int y=to[i];
		if(y==fa) continue;
		lsx(y,x); 
//		memset(a,0,sizeof a); 
		for(int j=0;j<=1;j++)
		{
			for(int k=0;k<=1;k++)
			{
				a[j][k]=f[x][j][k];
				f[x][j][k]=1e15;
			}
		}
		for(int j1=0;j1<=1;j1++)
		{
			for(int j2=0;j2<=1;j2++)
			{
				for(int k1=0;k1<=1;k1++)
				{
					for(int k2=0;k2<=1;k2++)
					{
						int temp=(j1==1&&k1==1)?-B:(j1==0&&k1==0?B:0);
						f[x][j1][j2|k1|k2]=min(f[x][j1][j2|k1|k2],a[j1][j2]+f[y][k1][k2]+A);
						f[x][j1^1][j2|(k1^1)|k2]=min(f[x][j1^1][j2|(k1^1)|k2],a[j1][j2]+f[y][k1][k2]+temp);
					}
				}
			}
		}
	}
}

signed main()
{
	freopen("analyse.in","r",stdin);
	freopen("analyse.out","w",stdout);
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	cin>>n>>A>>B;
//	A=min(A,B); 
	for(int i=1;i<n;i++)
	{
		int x,y;
		cin>>x>>y;
		addm(x,y);
	}
//	memset(f,0x7f,sizeof f); 
	lsx(1,0);
	ans=min(min(f[1][0][0],f[1][1][0]-B),min(f[1][1][1]-B,f[1][0][1]-B));
	cout<<ans;
	return 0;
}

C. 代数

这题不想写 \(dp\),想了个纯数学做法,详情看这

D. 组合

神秘题,题解的 \(std\) 也挺抽象的,要构造26个长1000位的数,转换成构造1000个长26位的数,最后再倒过来输出

构造的数保证两两之间或起来不同,这样才能使每一个数对每一位都有区分,至于构造。。。看 \(std\) 标程吧

点击查看代码
#include<bits/stdc++.h>
const int maxn=1e5+10;
using namespace std;
int a[maxn]={}; 
int n,ans[26][maxn]; 

int get(int x,int pos)
{
	return x&(1<<(pos-1))?1:0;
}
int main()
{
	freopen("combination.in","r",stdin);
	freopen("combination.out","w",stdout);
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	for(int i=0;i<=999;i++)
	{
		for(int j=0;j<=25;j++)
		{
			ans[j][i]=get(a[i],25-j+1);
		}
	} 
	cout<<26<<endl;
	for(int i=0;i<=25;i++)
	{
		for(int j=0;j<=999;j++)
			cout<<ans[i][j];
		cout<<endl;
	}
		

	return 0;
}
/*

*/

标签:度数,std,min,int,冲刺,瞬移,联训,maxn,CSP
From: https://www.cnblogs.com/oceansofstars/p/18433718

相关文章

  • CCF CSP-S 2024 提高组初赛解析
    CertifiedSoftwareProfessional-Senior非专业级软件能力认证测试本解析不提供阅读程序与完善程序题目的代码,如有需要请通过luogu.com.cn相关链接下载如有谬误烦请指正答案AACBBBDABDACBCD✓××BC✓✓✓BCC✓×✓CACAAAAAAABAA单项选择1在Linux系统中,如......
  • [34](CSP 集训)CSP-S 联训模拟 1
    A几何重复若干次->不能重叠,因此考虑直接暴力DP设\(f_{i,j,k}\)表示主串匹配到第\(i\)位(将前\(i\)位分别归为两类),其中\(x\)在重复了若干次后,又匹配到了第\(j\)位,\(y\)在重复了若干次后,又匹配到了第\(k\)位转移非常好写,枚举\(i\),尝试把\(s_{i}\)分别与\(x_......
  • 『模拟赛』冲刺CSP联训模拟1
    Rank我的我要爆了A.几何上来思路就假了,不知道,样例全过,本来就算假也能拿点,结果绑包了,妈的。正解dp,设\(f_{i,j,k}\)表示串\(s\)匹配到\(i\)位,模式串\(x\)拼接至\(j\)位,\(y\)拼接至\(k\)位是否可行,滚动数组优化,复杂度\(\mathcal{O(|s||x||y|)}\),不太能过,位运......
  • [33](CSP 集训)CSP-S 模拟 4
    A商品对于任意一组相邻的数\((l,r)\(l\ler)\),可以发现,不管怎么压缩,都会有\(l\ler\),也就是说,相邻两个数的大小关系是不变的那么我们就可以把\(\sum(|\max-\min|)\)拆出来,变成\[\sum(\max-\min)=\sum(\max)-\sum(\min)\]所以我们可以每对数里的\(\max\)和\(\min\)都......
  • CSP-J/S 2024游记
    24.9.21距离CSP-J/S2024第一轮还有0天。距离停课集训还有1天。集训日子加载中……24.9.22距离CSP-J/S2024第二轮还有33天。初赛成绩已出J:86S:68.5。今日份模拟赛初中联考期望:90+30+0+0=120,实际:90+30+0+0=120,大众分:100+40+40+......
  • 2024.9.2-CSP模拟赛1
    考试:大约在9:40左右发了题。9:45把所有的题目都快速看了一遍,T1感觉模拟可能会T,T2最小生成树的板子,T3又是追及问题感觉要挂,T4感觉像是区间DP。9:50开始做T1,先是手搓了一个gcd又手动模拟了取模(想起了xqy因为取模导致的TLE),样例输出得都挺快的。但是看了一眼数据......
  • 2024.9.3-CSP模拟赛2
    考试:9:00开题:第一题第一眼数据范围\(1\len\le5\times10^7\),感觉有T的风险。第二题littlebird,记得在以前做过这道题。第三题不太会,没有给部分分的比值,感觉只能写个暴搜。\(O(n^2)\)的暴力肯定会,正解先待会再想。9:10做T1,直接写暴力,5分钟写完了。试了一下500......
  • 2024.9.5-CSP模拟赛4
    考试:9:00~9:10看题:T1:很久之前做过,没有什么印象了。T2:感觉是广搜,但有可能要爆。T3:搜索题,猛加优化。T4:不知道是什么类型的题目。9:10~9:50写T1,已经忘了怎么写的,只能当做一道新题来做。写了个贪心,分了2中情况进行讨论,样例和自造样例都过了,但肯定会WA。其实在写计算的......
  • 2024.9.4-CSP模拟赛3
    考试:9:00~9:25怎么还不发卷啊,等得有点慌了,这是在考验心态吗?原来是极域出了点问题9:25~9:35发卷了,先看题。T1:相对距离,这不是原题吗,这题能做。T2:平衡队列,数据有点大,要不要离散化?好像不用,先等会在仔细看看。T3:第一眼数据范围:\(1\leN\le100\),直接弗洛伊德呀。T4:是并查集吗......
  • 2024.9.6-CSP模拟赛5
    考试:9:00~9:10发卷:T1有想法但要思考一下。T2水题,秒切。T3状压,昨天晚上就在看,但没看完只听了思路。T4看上去是原题,可以做一做。9:10~9:30先做T4,真是原题,直接写。直接写了归并排序,前面又补了一个0,然后求了逆序对。样例很快就过了就放了。9:30~9:50直接写了T2,T2......