CSP-S模拟31

news/2025/10/14 22:13:27/文章来源:https://www.cnblogs.com/Wy-x/p/19142141

CSP-S模拟31

A. 远征 (expedition)

简单题,直接大力 \(O(nV)\) 预处理 对于每个数每个位置 记录这个数下一个会被更改的位置。

查询直接跳即可,复杂度是 \(O(\log V)\)

Code:

#include<bits/stdc++.h>using namespace std;inline int read()
{int x=0,c=getchar_unlocked();for(;c>'9'||c<'0';c=getchar_unlocked());for(;c>='0'&&c<='9';c=getchar_unlocked())x=(x<<1)+(x<<3)+(c^48);return x;
}int n;
const int N=5e4+5;
unsigned short nxt[1025][N];
int a[N],b[N];void init()
{for(int col=1;col<1024;col++)for(int i=n,last=n+1;i>=1;i--){nxt[col][i]=last;if((col|a[i])==col) last=i;}
}signed main()
{//expeditionfreopen("expedition.in","r",stdin);freopen("expedition.out","w",stdout);n=read();for(int i=1;i<=n;i++) a[i]=read();for(int i=1;i<=n;i++) b[i]=read();init();long long Q=read(),anss=0;while(Q--){int l=read(),r=read(),x=read();long long ans=0;if((x|a[l])==x) ans+=b[l],x^=a[l];l=nxt[x][l];while(l<=r&&x){ans+=b[l];x^=a[l];l=nxt[x][l];}anss^=ans;}cout<<anss;return 0;
}

B. 传送 (teleport)

以为是拦路虎,没想到是水。

显然题目的限制 \(3\) 是废话。

先特判 \(u=v\) (\(ans=0\)) 和 \(u,v\) 不在一个集合内 (\(ans=-1\)) 的情况。

先把题目中给出的四元环(偶环)画出来,发现答案至多为 \(2\)

再手模一个三元环(奇环),发现是强连通的,再尝试加边,发现新图仍强连通。五元环同理,也是强连通的。

得到若一个连通块包含奇环,则答案为 \(1\)

若无奇环,则如果 \(u \to v\) 路径长为偶,则答案为 \(2\)。反之答案为 \(1\)

现在关键问题转化为如何在 \(O(n)\) 复杂度内判断该连通块是否有奇环。(当然你可以直接黑白染色判断。)

我们以惊人的注意力发现(当然你也可以从 \(s=1\) 的部分分得到启发),我们在每个连通块内任选一点跑 bfs(设为 \(S\)),记录 \(S\) 到该连通块内的每一个点 \(x\) 的路径 (\(S \to x\)) 长是否可以是偶数 / 奇数。发现若该连通块内存在奇环,则 \(S \to x\) 的路径既有奇长又有偶长。

对于无奇环,发现若 \(u \to v\) 路径长为偶 (\(ans=2\)),则 \(S \to u\)\(S \to v\) 路径长奇偶性相同。反之 \(ans=1\)

做完了。

Code:

#include<bits/stdc++.h>
// #define int long long// #define getchar_unlocked getchar
// #define putchar_unlocked putcharusing namespace std;inline int read()
{int x=0,c=getchar_unlocked();for(;c>'9'||c<'0';c=getchar_unlocked());for(;c>='0'&&c<='9';c=getchar_unlocked())x=(x<<1)+(x<<3)+(c^48);return x;
}// #ifndef ONLINE_JUDGE
// #define ONLINE_JUDGE
// #endifconst int N=1<<20;
int n,m;
vector<int> E[1<<20];
int fa[1<<20];
int find(int x)
{if(x==fa[x]) return x;return fa[x]=find(fa[x]);
}bool vis[N][2];
struct Node{int p,cnt;
};void bfs(int S)
{queue<Node> q;q.push({S,0});vis[S][0]=1;while(q.size()){Node nw=q.front();q.pop();nw.cnt^=1;// cerr<<nw.p<<" "<<nw.cnt<<"\n";for(int to:E[nw.p]){if(vis[to][nw.cnt]) continue;vis[to][nw.cnt]=1;q.push({to,nw.cnt});}}
}int strong[N];signed main()
{// teleport// #ifndef ONLINE_JUDGEfreopen("teleport.in","r",stdin);freopen("teleport.out","w",stdout);// #endifint T=read();n=read();m=read();for(int i=1;i<=n;i++) fa[i]=i;for(int i=1;i<=m;i++){int u=read(),v=read();int fx=find(u),fy=find(v);E[u].push_back(v);E[v].push_back(u);if(fx==fy) continue;fa[fx]=fy;}for(int i=1;i<=n;i++)if(vis[i][0]==0&&vis[i][1]==0) bfs(i);for(int i=1;i<=n;i++)if(vis[i][0]&&vis[i][1]) strong[find(i)]=1;int Q=read();while(Q--){int u=read(),v=read();if(u==v) { putchar_unlocked('0'); }else if(find(u)!=find(v)) { putchar_unlocked('-'); putchar_unlocked('1'); }else if(strong[find(u)]) { putchar_unlocked('1'); }else putchar_unlocked((vis[u][0]^vis[v][0])?('1'):('2'));putchar_unlocked('\n');}return 0;
}

C. 先辈 (anc)

小 Y 定义野兽串是 \(t=114514\)

\(|S|\) 为字符串 \(S\) 的长度。

我们显然有一个 \(O(26^3|S|)\) 的做法,枚举当 \(1,4,5\) 的字符,统计答案。做 nxt 数组优化可做到 \(O(26^3\frac{3|S|}{26})\)。但还是过不了。

具体,设 \(dp[i]\) 表示长度为 \(i\) 一共有多少种情况。
转移也非常显然。
显然 \(dp\) 数组只需要开到 \(7\) 就够了。

考虑发现一些性质。

发现 \(5\) 出现至多 \(1\) 次。考虑不枚举 \(5\) 表示的字符,只枚举 \(1\)\(4\)。只限制 \(5\) 不能和 \(1,4\) 相同即可。

转移同上,只修改 \(dp[4]\) 的转移方程。

如果 TLE,减少你的取模量。

Code:

#include<bits/stdc++.h>
// #define int long longusing namespace std;const int N=5e5+5;
int totans=0;
int dp[6];int n;
string s;
short c[N];const int mod=114514;
int cntt=0;
int nxt[N][26];
int poss[N];
int O=0;bool isappear[26];void init()
{n=s.size();for(int col=0;col<26;col++)for(int i=n,last=n+1;i>=0;i--){nxt[i][col]=last;if(col+'a'==s[i-1]) last=i;}for(int i=1;i<=n;i++) c[i]=s[i-1]-'a',isappear[c[i]]=1;
}void dodp(int x,int y)
{int nwwwww=totans;memset(dp,0,sizeof(dp));dp[0]=1;for(int i=0;i<cntt;i++){// cout<<poss[i]<<" "<<c[poss[i]]<<"\n";// O++;long long dt=0;if(i) dt=poss[i]-poss[i-1]-1;dp[4]=(dp[4]+dp[3]*dt)%mod;// dp[4]%=mod;// totans=(totans+dp[5]*dt)%mod;if(c[poss[i]]==x) {dp[5]+=dp[4];dp[2]+=dp[1];dp[1]+=dp[0];dp[1]%=mod;dp[2]%=mod;dp[5]%=mod;}if(c[poss[i]]==y){dp[3]+=dp[2];totans+=dp[5];dp[3]%=mod;totans%=mod;}// for(int j=1;j<=5;j++) cout<<"dp["<<j<<"]="<<dp[j]<<"\n";// cout<<"\n";}// cout<<"\n";// cout<<x+1<<" "<<y+1<<" "<<-(nwwwww-totans)<<"\n\n";// // totans=(totans+dp[5]*(n-poss[cntt-1]))%mod;
}// #define min(a,b,c) a<b&&a<c?a:(b<c?b:c)
// #define max(a,b,c) a>b&&a>c?a:(b>c?b:c)void init(int x,int y)
{if(!isappear[x]) return;if(!isappear[y]) return;// if(!isappear[z]) return;int i=0;poss[0]=min(nxt[0][x],nxt[0][y]);while(poss[i]<=n){// O++;// poss[i+1]=poss[i]+26;poss[i+1]=min(nxt[poss[i]][x],nxt[poss[i]][y]);i++;}cntt=i;dodp(x,y);dodp(y,x);// for(int j=0;j<cntt;j++) poss[j]=c[poss[j]];// dodp(x,y,z);// dodp(x,z,y);// dodp(y,x,z);// dodp(y,z,x);// dodp(z,x,y);// dodp(z,y,x);
}/*void init(int a,int b,int c)
{int i=0;poss[0]=min({nxt[0][a],nxt[0][b],nxt[0][c]});int last=poss[i];while(last<=n){last=min({nxt[last][a],nxt[last][b],nxt[last][c]});poss[i+1]=last;i++;}
}*/signed main()
{// ios::sync_with_stdio(0);freopen("anc.in","r",stdin);freopen("anc.out","w",stdout);cin>>s;init();for(int a=0;a<26;a++)for(int b=a+1;b<26;b++)init(a,b);cout<<totans<<"\n";// cerr<<"O="<<O<<"\n";// #ifndef ONLINE_JUDGE// #endif//mt19937_64 myrand(time(0));return 0;
}

D. 矩阵 (matrix)

数论分块。

Code:

#include<bits/stdc++.h>
#define int long longusing namespace std;const int Size=(1<<20)+1;
char buf[Size],*p1=buf,*p2=buf;
char buffer[Size];
int op1=-1;
const int op2=Size-1;
#define getchar()                                                              \
(tt == ss && (tt=(ss=In)+fread(In, 1, 1 << 20, stdin), ss == tt)     \? EOF                                                                 \: *ss++)
char In[1<<20],*ss=In,*tt=In;
inline int read()
{int x=0,c=getchar(),f=0;for(;c>'9'||c<'0';f=c=='-',c=getchar());for(;c>='0'&&c<='9';c=getchar())x=(x<<1)+(x<<3)+(c^48);return f?-x:x;
}
inline void write(int x)
{if(x<0) x=-x,putchar('-');if(x>9)  write(x/10);putchar(x%10+'0');
}int n,k;
void solve()
{int ans=0;while(n){int w=n/k;int ww=w+1;int kk=n/ww;int t=k-kk;ans+=w*(t*(n-w+n-w*t)/2);n-=w*t;k=kk;}cout<<ans<<"\n";
}signed main()
{freopen("matrix.in","r",stdin);freopen("matrix.out","w",stdout);scanf("%lld%lld",&n,&k);if(k>=n){cout<<(n*(n-1))/2;return 0;}solve();return 0;
}

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

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

相关文章

matlab 2025b + adalm-pluto 链接测试

matlab 2025b + adalm-pluto 链接测试1、matlab 菜单栏 → 获取硬件支持包→搜索 pluto , 点进去进行安装,并安装驱动, 我这里已安装 2、点击 上面 截图 中的 已安装 对应 的图标, 进入界面, 点击 管理 3、 …

Fortran 实现英文数字验证码识别系统

一、引言 验证码识别是人工智能与图像处理技术的重要应用场景之一。尽管现代验证码识别大多使用 Python、C++ 或 JavaScript 等语言实现,但为了探索底层计算与矩阵操作的效率,我们可以尝试用 Fortran 来实现一个基础…

10.14 NOIP 模拟赛 T1. HappyLovelyEveryday!

思路 不难发现等价于划分序列, 对序列内部做异或和, 求本质不同的最终序列的数量 考虑去重, 子序列计数去重用的是钦定尽量往前匹配 本题中, 对于任意一种最终序列, 我们可以限制每个划分块都必须是最小的, 也就是攒够…

P3111 [USACO14DEC] Cow Jog S 题解 - 符星珞

P3111 [USACO14DEC] Cow Jog S 题解洛谷的翻译不太好。补一下。 题目描述 奶牛们又出来锻炼蹄子啦!现在有 \(N\) 头奶牛在一条无限长的单车道跑道上慢跑(\(1 \leq N \leq 10^5\))。每头奶牛开始时都处于跑道上的不同…

Patch_SCN for Linux 功能完善---惜分飞

Patch_SCN for Linux 功能完善---惜分飞联系:手机/微信(+86 17813235971) QQ(107644445) 标题:Patch_SCN for Linux 功能完善 作者:惜分飞©版权所有[未经本人同意,不得以任何形式转载,否则有进一步追究法律责任…

CSP-J 2025 入门级模拟赛 Day6 复盘 B. 罐の水表

题意 小罐喜欢查水表,这一天他来到了一条有 N 个排成一列的水表的街道查水表。 经过鉴定,他发现有一些水表损坏了,1 表示损坏,0 表示完好。 小罐每次可以使一段长度为 L 的连续的水表全部完好如初( 覆盖的范围可以…

20251014 杂题

atcoder一类常见的折半问题. 枚举子集和枚举超集可以均摊,改为枚举一半子集,一半超级. 具体地:其中枚举子集我写的太劣了还T了P7252 [JSOI2011] 棒棒糖 区间查询绝对众数. 首先直接随机化就可以过,每次随机一个数钦定他…

SQL在智能自动化业务场景中的应用 - Irving11

一、连续登录问题关键逻辑: 连续日期(如 2023-01-01、2023-01-02、2023-01-03)减去各自的排序序号(1、2、3)后,结果都是 2023-12-31,因此会被分到同一组 通过分组统计天数,即可筛选出连续登录的用户2、总结:整…

实用指南:【53道前端必考】JavaScript 基础面试题

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

完整教程:Android Framework默认给应用添加dangerous级别权限

完整教程:Android Framework默认给应用添加dangerous级别权限pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Con…

拼接字符串要求字典序最小

好唐啊,这种题我目前已经知道三道一样的了,无聊记录一下。 传递性可以通过 题解:P1012 [NOIP 1998 提高组] 拼数 中的转小数来证明,而最优性就是,我们本来就考虑的相邻两个 \(i,j\) 谁在前面更优,显然把,当然我…

20251013 模拟赛 总结

考虑每个铁路拆除造成的影响. 如果在开始或者结束,如果旁边的铁轨被拆除,连续段数-1,否则无影响. 如果不在开始结尾. 如果两边都被拆了,连续段数-1 如果一边被拆了,不变. 两边都没被拆,答案+1. 当然直接线段树做也是没…

高级语言作业第一次随笔

这个作业属于 https://edu.cnblogs.com/campus/fzu/gjyycx 这个作业的要求在 https://edu.cnblogs.com/campus/fzu/gjyycx/homework/13558 学号:102500415 姓名:林帅前 一.安装dev.c 1.过程 (1)先打开安装包并解压(2…

.net Core资料

.net Core资料ASP.NET Core入门到精通 .NET项目中NLog的配置与使用 .NET Core 学习资料精选 教程:ASP.NET Core 入门 C#/.NET/.NET Core推荐学习书籍 如何学习CORE .net core中使用Autofac Autofac在.…

C#实现开机自启动应用多种方式

在 Windows 操作系统中,我们可以通过多种方式来实现程序的开机自启,下面将为大家详细介绍几种常用的方法及其对应的代码示例,同时也会提及一些可能遇到的问题及待解决事项。注册表配置开机自启Startup文件夹任务计划…

吾の歌单

吾の歌单英文: 《String Theocracy》神权政治之绳 《And Then Is Heard No More》句末无声 《From a Place of Love》来源于爱 《Iron Lotus》铁血莲华 《Children of the City》 都市之子 《Gone Angels》别离的天使…

什么是反应式编程 - 详解

什么是反应式编程 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", &q…

SDL3和其附属的编译记录

SDL3的构建记录 环境 windows11 + msys2 + gcc + cmake 编辑器使用vscode,插件为cmake tool,c++和clangd。 子模块 神奇的 sdl3-mixer 还在设计阶段 vcpkg 没有,如果从0构建需要的版本 vcpkg 也不支持。 正常情况下…

Qwen多模态系列模型笔记—Qwen2-VL

方法 Qwen2-VL系列包含三种体量的模型,分别是Qwen2-VL-2B, Qwen2-VL-7B, Qwen2-VL-72B。表1列举出这些模型的超参数和重要信息。值得注意的是,这三个模型视觉编码器始终都采用675M参数量的ViT,没有因模型而改变。此…