C++算法训练第八天

news/2026/1/20 15:15:58/文章来源:https://www.cnblogs.com/godjian/p/19506858

C++算法训练第八天

以下为牛客挑战

今日收获

学习到了ksm的写法
int ksm(int p,int q,int mod){int result=1;p=p%mod;while (q>0){if(q&1){//result=(1ll*result*p)%mod;}q=q>>1;p=(1ll*p*p)%mod;}return result%mod;
}知道了滚动数组
先有一个数组,然后在操作时候弄一个一样的数组,dp转移完成之后,直接赋值回最先的数组。为了节省空间。练习了一下BFS搜图

【算法竞赛知识点-数学】:快速幂_哔哩哔哩_bilibili

牛客周赛 Round 127

(36条未读私信) 牛客竞赛_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ (nowcoder.com)

Get The Number

A-Get The Number_牛客周赛 Round 127 (nowcoder.com)

image-20260119195044452

解题代码

#include<bits/stdc++.h>
#define int long long
#define lll __uint128_t
#define PII pair<int ,int>
#define endl '\n'
using namespace std;
#define yn(ans) printf("%s\n", (ans)?"Yes":"No");//快速打印
#define YN(ans) printf("%s\n", (ans)?"YES":"NO");
#define REP(i, e) for (int i = 0; i < (e); ++i)
#define REP1(i, s, e) for (int i = (s); i <=(e); ++i)
#define TESTS int t; cin >> t; while (t--)
#define TEST
const int N=2e5+10,M=1e3+10,mod=1e9+7;
int a[N],b[N],c[N],pre[N];signed main(){std::ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int n,m,x;cin>>n>>m>>x;if(x==(n+m)||(n-m)==x ||((n/m==x)&&(m*x==n))){cout<<"YES"<<endl;}else{cout<<"NO"<<endl;}return 0;
}

Sudoku

B-Sudoku_牛客周赛 Round 127 (nowcoder.com)

image-20260119195203324

2
1 2 3 4
3 4 1 2
2 1 4 3
4 3 2 1
1 2 3 4
2 3 4 1
3 4 1 2
4 1 2 3
YES
NO

解题代码

#include<bits/stdc++.h>
#define int long long
#define lll __uint128_t
#define PII pair<int ,int>
#define endl '\n'
using namespace std;
#define yn(ans) printf("%s\n", (ans)?"Yes":"No");//快速打印
#define YN(ans) printf("%s\n", (ans)?"YES":"NO");
#define REP(i, e) for (int i = 0; i < (e); ++i)
#define REP1(i, s, e) for (int i = (s); i <=(e); ++i)
#define TESTS int t; cin >> t; while (t--)
#define TEST
const int N=2e5+10,M=1e3+10,mod=1e9+7;
int a[N],b[N],c[N],pre[N];
void solve(){int m[5][5]={0};for(int i=1;i<=4;i++){for(int j=1;j<=4;j++){cin>>m[i][j];}}for(int i=1;i<=4;i++){set<int>str;for(int j=1;j<=4;j++){str.emplace(m[i][j]);}if(str.size()!=4){cout<<"NO"<<endl;return;}}for(int i=1;i<=4;i++){set<int>str;for(int j=1;j<=4;j++){str.emplace(m[j][i]);}if(str.size()!=4){cout<<"NO"<<endl;return;}}for(int i=1;i<4;i+=2){for(int j=1;j<4;j+=2){int sum=0;sum=m[i][j]+m[i][j+1]+m[i+1][j]+m[i+1][j+1];if(sum!=10){cout<<"NO"<<endl;return;}}}cout<<"YES"<<endl;};
signed main(){std::ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);TESTS{solve();};return 0;
}

Carry The Bit

C-Carry The Bit_牛客周赛 Round 127 (nowcoder.com)

image-20260119203924832

3
3749
105
999
4000
110
1000

我们可以用string去存储,一共才2x10五次方

直接string去存储,找到第一个大于5的数,然后剩下的按格式输出就行了,没找到就把最后的变成0;

解题代码

#include<bits/stdc++.h>
#define int long long
#define lll __uint128_t
#define PII pair<int ,int>
#define endl '\n'
using namespace std;
#define yn(ans) printf("%s\n", (ans)?"Yes":"No");//快速打印
#define YN(ans) printf("%s\n", (ans)?"YES":"NO");
#define REP(i, e) for (int i = 0; i < (e); ++i)
#define REP1(i, s, e) for (int i = (s); i <=(e); ++i)
#define TESTS int t; cin >> t; while (t--)
#define TEST
const int N=2e5+10,M=1e3+10,mod=1e9+7;
int a[N],b[N],c[N],pre[N];
void solve(){string s;cin>>s;s='0'+s;int p=-1;int l=s.size();for(int i=1;i<l;i++){int m=s[i]-'0';if(m>=5){p=i;break;}}cout<<p<<endl;if(p==-1){for(int i=1;i<l-1;i++){cout<<s[i];}cout<<0<<endl;}else{if(p==1){cout<<1;for(int i=1;i<l;i++){cout<<0;}cout<<endl;return;}for(int i=1;i<p-1;i++){cout<<s[i];}cout<<(s[p-1]-'0')+1;for(int i=p;i<l;i++){cout<<0;}}cout<<endl;
};
signed main(){std::ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);TESTS{solve();};return 0;
}

Permutation² Counting

D-Permutation² Counting_牛客周赛 Round 127 (nowcoder.com)

image-20260119212843110

示例1

2
6
1 2 2 1 3 1
5
1 1 2 2 4
6
2

我们看到这个和顺序没有关系,我们可以直接先排序。然后统计个数,因为这个是必须按照1-i这样的,所以我们对于这一次,就是选出两个i的数方法,去和上次的x,再加就行了

image-20260119213328256

解题代码

#include<bits/stdc++.h>
#define int long long
#define lll __uint128_t
#define PII pair<int ,int>
#define endl '\n'
using namespace std;
#define yn(ans) printf("%s\n", (ans)?"Yes":"No");//快速打印
#define YN(ans) printf("%s\n", (ans)?"YES":"NO");
#define REP(i, e) for (int i = 0; i < (e); ++i)
#define REP1(i, s, e) for (int i = (s); i <=(e); ++i)
#define TESTS int t; cin >> t; while (t--)
#define TEST
const int N=2e5+10,M=1e3+10,mod=998244353;
int a[N],b[N],c[N];
void solve(){int n;cin>>n;vector<int>cnt(n+1);for(int i=1,x;i<=n;i++){cin>>x;if(x<1||x>n){continue;}cnt[x]++;}int pre=1;int ans=0;//我们去枚举i,因为,我们知道n的活动范围就是在1-n的,当为1,时候就是冲cnt[i]个数中排列组合一下,选两个(cnt[i]-1)*(cnt[i])/2for(int i=1;i<=n;i++){pre*=((cnt[i]-1)*cnt[i]/2%mod);pre%=mod;ans=(ans+pre)%mod;}cout<<ans<<endl;
};
signed main(){std::ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);TESTS{solve();};return 0;
}

Balanced 01-String

E-Balanced 01-String_牛客周赛 Round 127 (nowcoder.com)

image-20260120113955911

2
0?1
????
0
8

思维题。

题目要我们求相同的对数,那我们直接反过来求不同的对数,然后用1-n一共n-1对减去相同的对数就可以判断不同的对数的奇偶性。

就是s[i]!=s[i+1];

这个不同可以用异或来

s[i]^s[i+1],如果相同直接是0,如果不同不为0;

然后我们要去相加这些数。

结果相加,看看不同的奇偶性。

image-20260120114804100

这个可以化简为,

s[0]^s[1]^s[1]^s[2]^s[2]^s[3]........s[n-2]^s[n-1]

由异或的性质相同异或的为0,0……其他等于本身。

化简为

s[0]^s[n-1]

所以只要判断这两个数的就行了,

最后用个去

((n-1)%2-(s[0]^s[n-1]))%2==0

这个,然后个数我们只需要看里面的2的cnt次方个就行了。

s[0]与s[n-1]分3种情况讨论就行了

  1. 没有?全是其他的。直接判断一下就行了。
  2. 有一个那肯定可以组成一个
  3. 有两个可以组成两个。

最后chen中间的个数。

代码

#include<bits/stdc++.h>
#define int long long
#define lll __uint128_t
#define PII pair<int ,int>
#define endl '\n'
using namespace std;
#define yn(ans) printf("%s\n", (ans)?"Yes":"No");//快速打印
#define YN(ans) printf("%s\n", (ans)?"YES":"NO");
#define REP(i, e) for (int i = 0; i < (e); ++i)
#define REP1(i, s, e) for (int i = (s); i <=(e); ++i)
#define TESTS int t; cin >> t; while (t--)
#define TEST
int ksm(int p,int q,int mod){int result=1;p=p%mod;while (q>0){if(q&1){result=(1ll*result*p)%mod;}q=q>>1;p=(1ll*p*p)%mod;}return result%mod;
}
const int N=2e5+10,M=1e3+10,mod=998244353;
int a[N],b[N],c[N],pre[N];
void solve(){string s;cin>>s;int m=0;int n=s.size();if(n==1){if(s[0]=='?'){cout<<2<<endl;return;}else{cout<<1<<endl;return;}}for(int i=1;i<s.size()-1;i++){if(s[i]=='?'){m++;}}int cnt=ksm(2,m,mod);if(s[0]!='?'&&s[n-1]!='?'){if(((n-1)%2-(s[0]^s[n-1]))%2==0){cout<<cnt<<endl;}else{cout<<0<<endl;}}else{if(s[0]=='?'&&s[n-1]=='?'){cout<<(2*cnt)%mod<<endl;}else{cout<<cnt<<endl;}}};
signed main(){std::ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);TESTS{solve();};return 0;
}

dp+滚动数组求解

我们定义一个发f[0/1][0/1];
表示当前,为奇数或者偶数的状态下,当前位置为0/1的方案数,转移就是,我们根据你一个方案来转移,一共四个状态,判断单前位置不等于1,那我们不用管,先假设选的就是0;,然后转移g[0][0]和g[1][0],就可以得到,因为我当前位置已经知道了,我们可以看前面为0,1的时候的次数,和奇偶性来判断g[0][0],这个数。g[0][0]=f[1][0]+f[0][1];g[1][0]=f[1][1]+f[0][0];以此类推后面的。结果为,f[0][1]+f[0][0]

代码

#include<bits/stdc++.h>
#define int long long
#define lll __uint128_t
#define PII pair<int ,int>
#define endl '\n'
using namespace std;
#define yn(ans) printf("%s\n", (ans)?"Yes":"No");//快速打印
#define YN(ans) printf("%s\n", (ans)?"YES":"NO");
#define REP(i, e) for (int i = 0; i < (e); ++i)
#define REP1(i, s, e) for (int i = (s); i <=(e); ++i)
#define TESTS int t; cin >> t; while (t--)
#define TEST
const int N=2e5+10,M=1e3+10,mod=998244353;
int a[N],b[N],c[N],pre[N];
void solve(){string s;cin>>s;int n=s.size();s=" "+s;vector<vector<int>>f(2,vector<int>(2));if(s[1]=='?'){f[0][1]=1;f[0][0]=1;}else if(s[1]=='1'){f[0][1]=1;}else{f[0][0]=1;}for(int i=2;i<=n;i++){vector<vector<int>>g(2,vector<int>(2));if(s[i]!='0'){g[0][1]=f[0][0]+f[1][1];g[1][1]=f[1][0]+f[0][1];}if(s[i]!='1'){g[0][0]=f[1][0]+f[0][1];g[1][0]=f[1][1]+f[0][0];}//处理数据。mod;for(int j=0;j<2;j++){for(int k=0;k<2;k++){g[j][k]%=mod;}}f=g;}cout<<(f[0][0]+f[0][1])%mod<<endl;
};
signed main(){std::ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);TESTS{solve();};return 0;
}

Matrix Coloring

BFS搜索

F-Matrix Coloring_牛客周赛 Round 127 (nowcoder.com)

image-20260120144421822

2
3
010
101
010
5
00000
01110
01000
01010
01110
111
111
111
00000
01110
01110
01110
01110

我们可以知道这个就是一个简单的BFS,但是这个是先把图先扫一边,把满足条件的先丢进栈中,然后再根据改的,慢慢扩散开来,已达到最后的效果。

解题代码

#include<bits/stdc++.h>
#define int long long
#define lll __uint128_t
#define PII pair<int ,int>
#define endl '\n'
using namespace std;
#define yn(ans) printf("%s\n", (ans)?"Yes":"No");//快速打印
#define YN(ans) printf("%s\n", (ans)?"YES":"NO");
#define REP(i, e) for (int i = 0; i < (e); ++i)
#define REP1(i, s, e) for (int i = (s); i <=(e); ++i)
#define TESTS int t; cin >> t; while (t--)
#define TEST
const int N=2e5+10,M=1e3+10,mod=1e9+7;
int a[N],b[N],c[N],pre[N];
int dx[4]={0,1,0,-1};
int dy[4]={-1,0,1,0};
void solve(){int n;cin>>n;vector<string>s(n);for(int i=0;i<n;i++){cin>>s[i];}queue<pair<int,int>>q;auto check=[&](int x,int y)->bool{if(s[x][y]=='1')return 0;for(int i=0;i<4;i++){int x1=x+dx[i],y1=y+dy[i];int x2=x+dx[(i+1)%4],y2=y+dy[(i+1)%4];if(x1<0|x1>=n||y1<0||y1>=n||x2<0||x2>=n||y2<0||y2>=n)continue;if(s[x1][y1]=='1'&&s[x2][y2]=='1'){return 1;}}return 0;};vector<vector<int>>vis(n,vector<int>(n));//对队列进行初始化for(int i=0;i<n;i++){for(int j=0;j<n;j++){if(s[i][j]=='1')continue;if(check(i,j)&&!vis[i][j]){q.emplace(i,j);vis[i][j]=1;}}}//取出并且进行处理,然后再扩展到旁边相邻的。while(q.size()>0){auto [x,y]=q.front();s[x][y]='1';q.pop();for(int i=0;i<4;i++){int x1=x+dx[i],y1=y+dy[i];if(x1<0||x1>=n||y1<0||y1>=n)continue;if(check(x1,y1)&&!vis[x1][y1]){q.emplace(x1,y1);vis[x1][y1]=1;}}}for(int i=0;i<n;i++){cout<<s[i]<<endl;}};
signed main(){std::ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);TESTS{solve();};return 0;
}

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

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

相关文章

2026年上海防水补漏行业顶尖企业权威评测:全面解析防水、修复、翻新与检测服务 - shruisheng

随着上海城市建筑步入成熟期,各类建筑渗漏问题日益成为影响居住安全与建筑寿命的关键因素。为帮助业主及管理方精准选择可靠的防水服务商,本次评测严格依据上海建筑防水行业协会发布的2025年度行业数据,结合企业技术…

【实战项目】 方正科技市场营销策略研究

运行效果:https://lunwen.yeel.cn/view.php?id=5841 方正科技市场营销策略研究摘要:本文以方正科技为研究对象,对其市场营销策略进行了深入分析。通过文献研究、市场调研和案例研究等方法,探讨了方正科技的市场定…

【Web安全】SSRF - 教程

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

聊聊五种 Redis 部署模式

这篇文章&#xff0c;分享自己职业生涯经历的五种 Redis 部署模式&#xff0c;希望对大家有所启发。1 单实例这是 Redis 最简单、最基础的部署方式&#xff0c;即&#xff1a;整个 Redis 服务运行在单个服务器和单个进程中。笔者第一次在生产环境使用 Redis &#xff0c;是在艺…

京东e卡回收真的靠谱吗?揭秘背后真相! - 京顺回收

不少人手中积压着单位发的京东e卡,想变现却顾虑重重。网上“高价回收”的平台良莠不齐,和陌生人交易又担心卡密泄露。据行业报告,2025年国内闲置京东e卡规模超200亿元,六成用户因流程不熟而遭遇诈骗。那么,如何判…

[MCP] Prompt

Sometimes there are common workflows for people using your MCP server you want to make easier for users. You may not want your users to have to write the same prompt all the time for that workflow (not…

从复杂到有序:汽车制造企业多元数据库管理走向自治智能的实践观察

在追求“极致效率”的汽车制造领域&#xff0c;每一秒钟的生产节拍都依赖于底层数据流的平稳支撑。本案例客户是国内某知名合资车企&#xff0c;拥有年产百万辆规模的行业巨头&#xff0c;其数字化版图已延伸至研发、供应链、生产制造及营销全链路。支撑这套庞大体系的&#xf…

写论文软件哪个好?实测科普!宏智树 AI 凭 “学术真功夫” 成毕业刚需

作为深耕论文写作科普的教育测评博主&#xff0c;每年毕业季后台都会被 “写论文软件哪个好” 的提问刷屏。对比十余款工具后发现&#xff0c;多数软件要么是 “文字拼接器”&#xff0c;生成内容空洞无物&#xff1b;要么存在虚假引用、数据失真的隐患&#xff0c;踩中了学术规…

2026年硅胶模具厂家深度选型指南:食品级与医用级需求下的三大方案解析 - 博客万

引言 在食品加工、医疗设备等领域,硅胶模具的选择直接影响产品质量与生产效率。食品厂关心模具的食品级认证、成型精准度与脱模效率,医疗设备厂注重生物相容性与质量稳定性,中小商家则关注性价比与交付速度。面对市…

【实战项目】 基于springboot的前后端分离学生健康体检管理系统

运行效果:https://lunwen.yeel.cn/view.php?id=5848 基于springboot的前后端分离学生健康体检管理系统摘要:随着我国教育事业的不断发展,学生健康体检管理工作的重要性日益凸显。为提高学生健康体检管理的效率和质…

当 Agent 进入系统阶段,AI 产品开始真正分化

&#x1f44b;前言过去一年&#xff0c;AI 产品讨论里有两个词被反复提及&#xff1a;模型&#xff0c;和 Agent。但在越来越多真实项目中&#xff0c;一个更现实的问题正在浮现&#xff1a;当 Agent 不再是单点能力&#xff0c;而开始参与业务流程、并发任务和协同决策时&…

2026年知名的公务车品牌厂家推荐及行业发展解析 - 品牌排行榜

公务车品牌厂家在城市公共服务、商业运营等领域发挥着重要作用,其产品性能、可靠性与适用性直接关系到服务效率与运营成本。随着新能源技术的发展和应用场景的细分,市场对公务车的需求正朝着智能化、定制化、高效能方…

【实战项目】 数字孪生在水利调度中的应用

运行效果:https://lunwen.yeel.cn/view.php?id=5829 数字孪生在水利调度中的应用摘要:随着信息技术的发展,数字孪生技术在各个领域的应用日益广泛。本文针对水利调度领域,研究了数字孪生技术的应用,旨在提高水利…

2026Q1唐山口碑财税公司推荐榜:正规备案为基 - 品牌智鉴榜

2026Q1,唐山财税市场迎来政策细化与监管升级的双重格局监管步入精准化阶段,钢铁、装备制造等主导产业面临需精准对接技改税收抵扣优化需求政策,初创企业则亟需合规高效的财税支撑面临合规记账、高效办证的双重需求,…

【实战项目】 基于单片机激光打靶语音播报系统的设计与实现

运行效果:https://lunwen.yeel.cn/view.php?id=5842 基于单片机激光打靶语音播报系统的设计与实现摘要:本论文针对传统激光打靶训练中信息反馈单一的问题,设计并实现了一套基于单片机的激光打靶语音播报系统。系统…

【RPA】拼多多商家后台取数口径

拼多多RPA取数口径 后台主页发货管理 订单查询 可检索全部订单、待付款、待发货、待收货、退款/售后等订单。物流概况商品管理 商品列表左侧菜单中选择【商品管理】,点击【商品列表】,即可看到当前店铺所有商品信息。…

9 款 AI 写论文哪个好?实测封神!宏智树 AI 凭硬核实力稳坐头把交椅

毕业论文写作堪称学术生涯的 “终极闯关”&#xff0c;选题迷茫、文献堆砌、数据失真、查重超标&#xff0c;每一个环节都能让人焦头烂额。作为深耕论文写作科普的测评博主&#xff0c;我耗时两周&#xff0c;围绕文献真实性、功能全面性、数据可视化、学术合规性四大核心维度&…

【实战项目】 基于DSP新型电能质量监测装置的研究

运行效果:https://lunwen.yeel.cn/view.php?id=5827 基于DSP新型电能质量监测装置的研究摘要:本文针对当前电能质量监测领域的技术需求,研究了基于DSP(数字信号处理器)的新型电能质量监测装置的设计与实现。通过…

2026年盛世笔特国际文化创意产业集团有限公司排名,市场份额情况究竟如何? - 工业品牌热点

在红色文化传承与教育阵地建设的时代浪潮中,主题展厅已成为承载红色精神、传递时代价值的重要载体。然而,千厅一面的同质化困局、技术与内容脱节的尴尬、全流程协同不畅的痛点,却让不少单位的展厅建设陷入投入大、效…

Spring Boot之@Transactional注解实践

在Spring Boot大行其道的时代&#xff0c;开发者可以通过Transactional注解来方便的操作事务 隔离级别 Transactional注解的isolation属性&#xff0c;可用来设置隔离级别。默认值为Isolation.DEFAULT。该属性可选值有&#xff1a; Isolation.DEFAULT&#xff1a;数据源默认…