9.30 CSP-S模拟25 改题记录

news/2025/10/1 19:30:17/文章来源:https://www.cnblogs.com/OrangeLand/p/19121838

HZOJ

写在前面

(其实最讨厌whk和OI转换的时候了,尤其是那种不能完全割舍一方的转换)

嗯对大概就是不想改T4就来写题解了。补课后第一场,人终于都回来了,虽然依旧挂如分,但是竟然能够rk3(?)。感觉这场题还是挺神奇的,值得写一下。

A. 爱丽丝的数位划分

题意大概是给定一个长度为\(n\) 的序列,将其划分成恰好\(k\) 组,每组的贡献恰好是该组所有数的十进制表示出现的种类数,求问最大贡献。
赛时觉得\(O(n^2k)\) 能过挺多的就想着先打个暴力。观察到需要进行或运算并且还要统计个数,考虑使用bitset。对于每一个数求出该数各位出现的种类。枚举\(dp_{i,k}\) 为前\(i\) 个数分成\(k\) 组的最大贡献,枚举每个转移点\(j\)。跑大样例惊人发现超得不多,卡了卡常就卡进去了。然后突然意识到要求恰好分为\(k\) 组,会有许多无用的转移,所以可以确定\(k\) 的上下界,减小枚举范围。除了显然的上界\(min(i,k)\),考虑到每一个点后最多能再分\(n-i\) 组,所以当前点及其之前至少要分\(k-(n-i)\) 组,即下界为\(max(1,k-(n-i))\)。然后测极限数据发现跑得极快。举个例子,原本要枚举\(k=1000\) 现在只用枚\(1\) !!!k的变化趋势应该是个开口向下的单峰函数。然后峰值应该在\(k=500\) 左右。

代码
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e3+10;
int dp[maxn][maxn];
int main(){freopen("partition.in","r",stdin);freopen("partition.out","w",stdout);ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);int T;cin>>T;while(T--){int n,k;cin>>n>>k;string a;bitset<11> c[maxn];for(int i=1;i<=n;i++){cin>>a;c[i]=0;if(a=="0") c[i][0]=1;elsefor(int j=0;j<a.size();++j) c[i][a[j]-'0']=1;} for(int i=1;i<=n;i++){bitset<11> t=0;for(int j=1;j<=k;j++) dp[i][j]=0;for(int j=i;j>=1;j--){t|=c[j];for(int kk=max(1,k+i-n);kk<=min(k,j);kk++) dp[i][kk]=max(dp[i][kk],dp[j-1][kk-1]+(int)t.count());}}cout<<dp[n][k]<<'\n';}return 0;
}

然后看正解。实际上影响每个位置的贡献的只有该位置以前的能组成0-9的位置,所以只用在这些位置转移。复杂度即为\(O(10nk)\)

代码
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e3+10;
int dp[maxn][maxn];
int main(){freopen("partition.in","r",stdin);freopen("partition.out","w",stdout);ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);int T;cin>>T;while(T--){int n,k;cin>>n>>k;string a;bitset<11> c[maxn];for(int i=1;i<=n;i++){cin>>a;c[i]=0;if(a=="0") c[i][0]=1;elsefor(int j=0;j<a.size();++j) c[i][a[j]-'0']=1;} for(int i=1;i<=n;i++){bitset<11> t=0;for(int j=1;j<=k;j++) dp[i][j]=0;for(int j=i;j>=1;j--){bitset<11> gd=t|c[j];if(gd!=t){t|=c[j];for(int kk=max(1,k+i-n);kk<=min(k,j);kk++) dp[i][kk]=max(dp[i][kk],dp[j-1][kk-1]+(int)t.count());}			else t|=c[j];}}cout<<dp[n][k]<<'\n';}return 0;
}

B. 爱丽丝的新运算

简化题意是给定一个每个数质因子次数最多为\(1\) 的序列,求有多少个非空子序列使得该子序列中所有数的所有质因子异或和为\(0\)
一眼转化了题意然后觉得很可做,苦写2小时喜提0pts。原本思路是开个bitset每一位表示数据范围内排行为该位的质数,然后组合计算结果。然后写写错错,错错写写,怀疑那个思路根本不可行,因为以为优化了那么多实际上复杂度还是\(O(2^n)\)。然后喜提0pts。
正解用了没学过的线性基。(异或)线性基类似于向量的一对基底,用集合中的某些元素异或得到集合的所有元素,可用来求某个数是否能由某些数异或得到,或者求某些数的异或最大值。其流程大概是枚举每个元素二进制下的每一位,若该位是1,若基内该位还没有数,则基的该位就是该元素,退出循环;若基内该位有数,则该元素异或上该数再进行循环。这样就可以用部分元素表达所有元素了。
回到本题。那么题意就可转化为有多少个元素能被其他元素表达,令这个数为\(k\),则答案为\(2^k-1\)。回到线性基上就转化成了求有多少个元素在线性基外。\(2^k-1\) 的含义就是代表这些基外元素中选或不选的组合。还有基外元素异或和能被基内元素表达,不会证,但是从答案来看应该是对的。然后显然每个数至多只有1个大于1000的质因数,所以对于质因数都小于1000的数,我们直接尝试将其插入线性基;对于有大于1000的质因数的数,我们单开一个表示该质数的基底。若插入时有该数对应的基底,就异或上该基底然后再往1000内的线性基上插,否则该数就是该质数的基底。由于基底中大于1000的质因数其对应的小于1000的部分可能为0,所有要注意判断是否有基时不能以基为0作为判断条件。然后因为这个糖错狂条inf min。

代码
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+10,mod=998244353;
int T,n,a[maxn];
int isnp[1001];
int cnt,prime[170];
inline void getprime(){for(int i=2;i<=1e3;i++){if(!isnp[i]) prime[++cnt]=i,isnp[i]=cnt;for(int j=1;j<=cnt&&i*prime[j]<=1e3;j++){isnp[i*prime[j]]=1;if(i%prime[j]==0) break;}}
}
inline int qpow(int x,int y){int ans=1;while(y){if(y&1) ans=1ll*ans*x%mod;x=1ll*x*x%mod;y>>=1;}return ans;
}
int insta,instia;
bool vis[1000000];
bitset<170> aa[170];
unordered_map<int,bitset<170>> kk;
inline void insert(bitset<170> now,int res){if(res>1){if(!vis[res]){++insta;kk[res]=now;vis[res]=1;return;}now^=kk[res];}for(int i=168;i>=1;i--)if(now[i]){if(aa[i].count()==0){++insta;aa[i]=now;return;}now^=aa[i];}
}
int main(){freopen("calc.in","r",stdin);freopen("calc.out","w",stdout);ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);getprime();cin>>T;while(T--){cin>>n;kk.clear();memset(aa,0,sizeof(aa));memset(vis,0,sizeof(vis));insta=0;for(int i=1;i<=n;++i) cin>>a[i];bitset<170> bb=0;for(int i=1;i<=n;i++){if(a[i]==1) continue;else{bb=0; for(int j=1;a[i]>=prime[j]&&j<=cnt;++j)if(a[i]%prime[j]==0) a[i]/=prime[j],bb[j]=1;insert(bb,a[i]);}}cout<<qpow(2,n-insta)-1<<'\n';}return 0;
}

C. 爱丽丝的幻方

题意是给定一个打乱后的幻方,可以进行下移、右移、沿左上-右下对角线对称、顺时针旋转90度、沿水平轴翻转、沿竖直轴翻转共6种操作,求问最少多少步能还原该幻方。
没思路,时间不够,打了个假的特殊性质,挂了。
惊为天人的探索规律题/模拟题。由于我不会探索规律,所以我选择进行搜索模拟。首先必须注意到一个性质:只要有不在一条直线上的相邻的(即呈“L”形或将其旋转)的三个块的位置关系就能确定幻方的形态。浅证一下:操作1、2不改变形状,操作3对称后三块只有形状、位置改变,相邻关系不变,操作4只转换了方向即改变了形状和位置,不对相邻关系产生影响,操作5、6同理。然后一个幻方由若干个“L”组成,每个“L”间相互支配,故仅需知道一个“L”的形状及其所在位置我们便能确定整个幻方的形态。我们令1为直角顶点,2和n+1为两条边,用该形状和1的位置确定幻方。显然共有8种形态的“L”,1的位置有\(n^2\) 种可能,所以最多会出现\(8n^2\) 种幻方状态。虽然到现在就可以找规律\(O(1)\) 求解了,但我不会。好在状态数在时空允许范围内,转移也能\(O(1)\) 完成,我们就尝试bfs每步的操作直到复原幻方。实现也比较简单,模拟每种状态在某个操作下形状位置的变化情况即可,只不过码量有点大,细节有点多。

代码
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e3+10,inf=0x3f3f3f3f;
int T,n,a[maxn][maxn];
inline int getshape(int xa,int ya,int xb,int yb,int xc,int yc){if(xa==xb){if(ya+1==yb||ya-n+1==yb){if(xa+1==xc||xa-n+1==xc) return 1;else return 3;}else{if(xa+1==xc||xa-n+1==xc) return 5;else return 8;}}else{if(ya+1==yc||ya-n+1==yc){if(xa+1==xb||xa-n+1==xb) return 2;else return 4;}else{if(xa+1==xb||xa-n+1==xb) return 6;else return 7;}}
}
struct node{int type,x,y;node(int _type,int _x,int _y){type=_type,x=_x,y=_y;}
};
inline int getsh(node now,int opt){int xa,ya,xb,yb,xc,yc;xa=now.x,ya=now.y;if(now.type==1) xb=xa,yb=(ya+1==n+1?1:ya+1),xc=(xa+1==n+1?1:xa+1),yc=ya;else if(now.type==2) xc=xa,yc=(ya+1==n+1?1:ya+1),xb=(xa+1==n+1?1:xa+1),yb=ya;else if(now.type==3) xb=xa,yb=(ya+1==n+1?1:ya+1),xc=(xa-1==0?n:xa-1),yc=ya;else if(now.type==4) xc=xa,yc=(ya+1==n+1?1:ya+1),xb=(xa-1==0?n:xa-1),yb=ya;else if(now.type==5) xb=xa,yb=(ya-1==0?n:ya-1),xc=(xa+1==n+1?1:xa+1),yc=ya;else if(now.type==6) xc=xa,yc=(ya-1==0?n:ya-1),xb=(xa+1==n+1?1:xa+1),yb=ya;else if(now.type==7) xb=xa,yb=(ya-1==0?n:ya-1),xc=(xa-1==0?n:xa-1),yc=ya;else if(now.type==8) xc=xa,yc=(ya-1==0?n:ya-1),xb=(xa-1==0?n:xa-1),yb=ya;if(opt==3) return getshape(ya,xa,yb,xb,yc,xc);return getshape(xa,ya,xb,yb,xc,yc);
}
queue<node> que;
int vis[9][1001][1001];
inline node opt1(node now){now.y++;if(now.y==n+1) now.y=1;if(vis[now.type][now.x][now.y]!=inf) now.type=-1;return now; 
}
inline node opt2(node now){now.x++;if(now.x==n+1) now.x=1;if(vis[now.type][now.x][now.y]!=inf) now.type=-1;return now;
}
inline node opt3(node now){now.type=getsh(now,3);swap(now.x,now.y);if(vis[now.type][now.x][now.y]!=inf) now.type=-1;return now;
}
inline node opt4(node now){if(now.type==1) now.type=6;else if(now.type==2) now.type=5;else if(now.type==3) now.type=2;else if(now.type==4) now.type=1;else if(now.type==5) now.type=7;else if(now.type==6) now.type=8;else if(now.type==7) now.type=3;else if(now.type==8) now.type=4;swap(now.x,now.y);now.y=n-now.y+1;if(vis[now.type][now.x][now.y]!=inf) now.type=-1;return now;
}
inline node opt6(node now){if(now.type==1) now.type=3;else if(now.type==2) now.type=4;else if(now.type==3) now.type=1;else if(now.type==4) now.type=2;else if(now.type==5) now.type=8;else if(now.type==6) now.type=7;else if(now.type==7) now.type=6;else if(now.type==8) now.type=5;now.x=n-now.x+1;if(vis[now.type][now.x][now.y]!=inf) now.type=-1;return now;
}
inline node opt5(node now){if(now.type==1) now.type=5;else if(now.type==2) now.type=6;else if(now.type==3) now.type=8;else if(now.type==4) now.type=7;else if(now.type==5) now.type=1;else if(now.type==6) now.type=2;else if(now.type==7) now.type=4;else if(now.type==8) now.type=3;now.y=n-now.y+1;if(vis[now.type][now.x][now.y]!=inf) now.type=-1;return now;
}
int main(){freopen("magic.in","r",stdin);freopen("magic.out","w",stdout);ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);cin>>T;while(T--){while(que.size()) que.pop();memset(vis,0x3f,sizeof(vis));cin>>n;int xa,ya,xb,yb,xc,yc;for(int i=1;i<=n;i++)for(int j=1;j<=n;j++){cin>>a[i][j];if(a[i][j]==1) xa=i,ya=j;else if(a[i][j]==2) xb=i,yb=j;else if(a[i][j]==n+1) xc=i,yc=j;} if(n==1){cout<<0<<'\n';continue;}if(n==2){if(xa==1&&ya==1){if(xb==1&&yb==2) cout<<0<<'\n';else cout<<1<<'\n';}else if(xa==1&&ya==2){if(xb==1&&yb==1) cout<<1<<'\n';else cout<<2<<'\n';}else if(xa==2&&ya==1) cout<<1<<'\n';else{if(xb==1&&yb==2) cout<<1<<'\n';else cout<<2<<'\n';}continue;}que.push({getshape(xa,ya,xb,yb,xc,yc),xa,ya});vis[getshape(xa,ya,xb,yb,xc,yc)][xa][ya]=0;if(vis[1][1][1]!=inf){cout<<vis[1][1][1]<<'\n';continue;}while(que.size()){node a=que.front();int k=vis[a.type][a.x][a.y];que.pop();node b=opt1(a);if(b.type!=-1) vis[b.type][b.x][b.y]=min(vis[b.type][b.x][b.y],k+1),que.push(b);b=opt2(a);if(b.type!=-1) vis[b.type][b.x][b.y]=min(vis[b.type][b.x][b.y],k+1),que.push(b);b=opt3(a);if(b.type!=-1) vis[b.type][b.x][b.y]=min(vis[b.type][b.x][b.y],k+1),que.push(b);b=opt4(a);if(b.type!=-1) vis[b.type][b.x][b.y]=min(vis[b.type][b.x][b.y],k+1),que.push(b);b=opt5(a);if(b.type!=-1) vis[b.type][b.x][b.y]=min(vis[b.type][b.x][b.y],k+1),que.push(b);b=opt6(a);if(b.type!=-1) vis[b.type][b.x][b.y]=min(vis[b.type][b.x][b.y],k+1),que.push(b);if(vis[1][1][1]!=inf) break;}cout<<vis[1][1][1]<<'\n';}return 0;
}

D. 爱丽丝斗恶龙

咕了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/924197.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

永州微网站建设wordpress文章链接带问号

不错的资料&#xff1a; LLVMClang编译器链接器--保值【进阶之路二】 - 掘金 —————————————————————————————————————— 下载 llvm-cookbook example: $ git clone https://github.com/elongbug/llvm-cookbook.git 也可以参照llvm-pr…

vcenter6.7u3/vcsa6.7u3无DNS安装部署(new)

vcenter6.7u3/vcsa6.7u3无DNS安装部署(new)vcsa6.7u3无DNS安装 vcsa6.7u3w下 实测 VMware-VCSA-all-6.7.0-24337536.iso 测试通过版本发布时间内部编号名称down1down26.7U3w 2024-10-28 24337536 VMware-VCSA-all-6…

深入解析:Vue 3 项目开发必用第三方组件与插件全攻略

深入解析:Vue 3 项目开发必用第三方组件与插件全攻略2025-10-01 19:19 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; di…

安康网站建设公司电话神码ai智能写作网站

文章目录 一、引用概念二、引用特性1、引用在定义时必须初始化2、一个变量可以有多个引用3、引用一旦引用一个实体&#xff0c;再不能引用其他实体 三、常引用四、使用场景1、做参数1、输出型参数2、大对象传参 2、做返回值1、传值返回2、传引用返回 五、传值、传引用效率比较六…

全球抗体药表达系统:CHO 细胞主导下,未来十年将迎哪些突破?

抗体类药物已成为治疗癌症、自身免疫病、传染病的核心手段,截至 2025 年 1 月,全球获批上市的抗体类药物达 191 种。这些药物的成功落地,离不开抗体表达系统的支撑 —— 它决定了抗体的产量、质量(如折叠正确性、翻…

衡水营销网站建设网站建设公司行业描述填什么

1. 拉取镜像 docker pull registry.baidubce.com/paddlepaddle/paddle:2.4.0注&#xff1a;写该文章时&#xff0c;Paddle 最新版本为2.5.1&#xff0c;但是在实际安装中会出现与 PaddleHub 2.3.1版本的冲突&#xff0c;故采用2.4.0版本 2. 构建并进入容器 docker run --name…

在建设厅网站上查询注销建造师新建网站需要多少钱

题目描述&#xff1a; 小蓝最近在研究一种浮点数的表示方法&#xff1a;R 格式。对于一个大于 00 的浮点数 d&#xff0c;可以用 R 格式的整数来表示。给定一个转换参数 n&#xff0c;将浮点数转换为 R 格式整数的做法是&#xff1a; 将浮点数乘以 2^n。四舍五入到最接近的整…

完整教程:[论文阅读]Benchmarking Poisoning Attacks against Retrieval-Augmented Generation

完整教程:[论文阅读]Benchmarking Poisoning Attacks against Retrieval-Augmented Generationpre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !im…

绕过Cloudflare IP白名单限制的技术解析

本文详细介绍了两种绕过Cloudflare IP白名单限制的技术方法,包括使用Cloudflare Workers创建反向代理和通过DNS记录配置,帮助安全研究人员进行合法的渗透测试。RIP Cloudflare:绕过IP白名单限制 欢迎来到"RIP …

对于实现贪吃蛇游戏的超详细保姆级解析—下 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

撕裂的乡土:在人性荒原上寻找微光

我从未将故乡湘源涂抹成田园牧歌的幻境。这座深藏福建武夷山脉褶皱中的村庄,海拔八百米,森林如墨染,云雾终年缠绕山腰,溪涧清可见底。现常住人口仅五十余人,仅为80年代的十分之一人口,时间在这里仿佛凝滞,唯山风…

2025蔬菜配送服务公司 TOP 企业推荐排行榜,深圳、宝安、光明、松岗、东莞、长安、虎门、沙田、厚街、大岭山蔬菜配送推荐

引言​ 在当今社会,蔬菜配送行业作为连接农产品生产与消费的重要纽带,其发展态势备受关注。然而,该行业目前存在着诸多问题。一方面,部分配送公司在食材新鲜度保障上存在不足,由于缺乏有效的冷链物流技术和管理手…

2025液压缸TOP企业品牌推荐排行榜!抓斗、伺服、大吨位、车辆、工程、拉杆、冶金、重载、港机液压缸推荐

引言在液压装备领域,液压缸作为重要的动力传递元件,其品质与性能直接影响着众多行业的生产效率与运行安全。当前,市场上液压缸品牌数量众多,产品质量参差不齐,技术水平也存在较大差异。部分品牌为追求短期利益,在…

2025 年破胶机厂家品牌推荐榜单白皮书,多规格型号 610/710/810、大型、自动型、低温环保、节能省电、自动打块、轮胎破胶机公司推荐

引言​ 在废旧橡胶回收再利用产业蒸蒸日上的今天,破胶机作为不可或缺的关键设备,其性能优劣与质量高低,直接关系到企业的生产效率和最终产品品质。不过,当前破胶机市场呈现出一番复杂景象:制造商数量繁杂,产品质…

乱七八糟的国庆做题记录

模拟赛T1 题面 赛时糖了,写了个会t的状压还不会处理下界 题面中的限制可以转为: 对于任意合法集合 1.必须包含n的每个质因数的最大次方 2.至少出现一对不同质因数 严肃发现质因子数目比logn还要小的多,可以爆搜 直接…

2025 年健身器材品牌 TOP 推荐排行榜,室内 / 健身房 / 体育 / 运动 / 家用 / 商用 / 单位 / 家庭 / 有氧 / 力量健身器材推荐

引言在当今健身行业蓬勃发展的背景下,健身器材市场呈现出蓬勃生机,但同时也面临着诸多问题。市场上健身器材品牌众多,产品质量参差不齐,部分品牌为追求利润,在材料选择和工艺制作上偷工减料,导致产品可靠性和耐用…

网站注册价格福田欧辉校车

分布式文件系统 SpringBootFastDFSVue.js【四】 八、文件的下载和删除功能8.1.FastDFSClient.java8.2.FileServerController.java8.3.Vue的fast.js8.4.fastdfsimg.vue8.5.效果 九、总结endl 八、文件的下载和删除功能 8.1.FastDFSClient.java Slf4j public class FastDFSClie…

详细介绍:给贾维斯加“手势控制”:从原理到落地,打造多模态交互的本地智能助

详细介绍:给贾维斯加“手势控制”:从原理到落地,打造多模态交互的本地智能助pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-f…

完整教程:学术论文 Word 样式规范

完整教程:学术论文 Word 样式规范pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco&…

完整教程:QT示例 使用QTcpSocket和QTcpServer类实现TCP的自定义消息头、消息体通信示例

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …