10.6 代码源 2024 CSP-S 模拟赛 Day 11

省流:\(50+0+0+0=50\)

简称:唐诗

T1

码了个暴力,然后赛后发现有一个点 T 了,也许是因为我用的 vector ……

然后树的 \(20\) 分很好想,只需要对每个点所连的边统计答案即可

核心代码:

fd(i,1,n)
{
    if(f[i].size()>1)
    {
        sort(f[i].begin(),f[i].end());
        fd(j,1,f[i].size()-1) ans+=f[i][0]+f[i][j];
    }
}

然后大胆贪心,先求出原图最小生成树,然后每次加边是统计答案,然后小样例过了,大样例没过……

然后赛后发现暴力的两档分 T 了一档,但是假的贪心把 “保证所有点都与 \(1\) 号点相连” 那一档过了()

正解是只需要把这个点相连的权值最小边与其他边相连,然后跑最小生成树即可。

核心代码:

fd(i,1,n)
{
    sort(f[i].begin(),f[i].end());
    int v=f[i].front().first;
    fd(j,1,f[i].size()-1)
    {
        line.push_back({f[i].front().second,f[i][j].second,f[i][j].first+v});
    }
}

T2

T2 很有思路,几分钟就推出来一个 \(a_i\) 不全为奇数的柿子,然后发现大样例是全为奇数的()

然后就一直在推式子,然后快推完了比赛结束了……

然后赛后发现全为奇数的用暴力搞……

T3

一眼 DP 但是想写 T2,甚至连暴力都没码……

正解是状压(一位大佬的):

f[0][0]=g[n+1][0][0]=0;
for(int i=1;i<=n;++i){
	for(int j=0;j<16;++j) val[i][j]=-((j>>3)&1)*a[i].y+((j>>2)&1)*a[i].y-((j>>1)&1)*a[i].x+(j&1)*a[i].x+a[i].w;
	for(int j=0;j<16;++j){
		f[i][j]=f[i-1][j]+a[i].w;
		for(int s=j;s;s=(s-1)&j) f[i][j]=max(f[i][j],f[i-1][j^s]+val[i][s]);
	}
}
for(int i=n;i;--i)
	for(int k=0;k<=4;++k)
		for(int j=0;j<16;++j){
			g[i][k][j]=g[i+1][k][j];
			for(int s=j;s;s=(s-1)&j) g[i][k][j]=max(g[i][k][j],g[i+1][k-1][j^s]+val[i][s]);
		}
while(q--){
	int x;ll res=0;
	scanf("%d",&x);
	for(int i=x;i>=x-4&&i>=0;--i) for(int j=0;j<16;++j) res=max(res,f[i][15^j]+g[i+1][x-i][j]);
	printf("%lld\n",res);
}

T4

感觉不会写就看了两眼,赛后发现可以人类智慧,然后就是裸线段树了……

总结

  • T2 浪费过多时间

  • 就算懒也要打暴力

  • 注意时间

  • 要有敏感性

\(\LARGE{唐}\)

posted @ 2024-10-07 16:26  whrwlx  阅读(23)  评论(0编辑  收藏  举报