2025ccpc女生赛题解

news/2025/11/10 0:17:26/文章来源:https://www.cnblogs.com/AuroraKelsey/p/19185157

补题链接 : https://qoj.ac/contest/2564

J. 后鼻嘤

在每个以 n 结尾的字符串后添加 g 并输出

读入一整行法

//2025-11-02
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <vector>using namespace std;
const int N = 1e5+10;
#define LL long longvoid solve() {char s[N];cin.getline(s,100000);for(int i=0;;i++) {if((s[i]>'z'||s[i]<'a')&&s[i]!=' ') break;cout<<s[i];if(s[i]=='n'&&(s[i+1]>'z'||s[i+1]<'a'))cout<<'g';}}int main() {ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);solve();return 0;
}

持续读⼊字符串法

//2025-11-02
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <vector>using namespace std;
#define LL long longvoid solve() {char s[10];bool flag=0;while(cin>>s) {if(flag) {cout<<" ";}flag=1;int n=strlen(s);cout<<s;if(s[n-1]=='n') cout<<'g';}
}int main() {ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);solve();return 0;
}

A.环状线

简单的分类讨论。
暴力模拟也可以通过。

//2025-11-02
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <vector>using namespace std;
int n,s,t;
bool solve() {int dis1,dis2;if(s<t) {dis1=t-s;dis2=n-(t-s);}else{dis1=n-(s-t);dis2=s-t;}return dis1<dis2;
}int main() {ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);cin>>n>>s>>t;puts(solve()?"1":"2");return 0;
}

G. 最大公约数

\([1,n]\)中选出\(k\)个不同的整数,使得两两互质。

贪心,筛出小于\(n\)的素数(设有\(cntp\)个),那么\([1,n]\)中最多有\(cntp+1\)个数两两互质(1和任意数互质)

线性筛的模板。

//2025-11-02
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <vector>using namespace std;
const int N = 5e5+10;
#define LL long long
int n,k;
int prime[N], mindiv[N];
int cntp;
void Euler(int n) {for (int i = 2; i <= n; i++) {if (!mindiv[i])mindiv[i] = prime[++cntp] = i;for (int j = 1; j <= cntp && i * prime[j] <= n && prime[j] <= mindiv[i]; j++)mindiv[i * prime[j]] = prime[j];}
}
void solve() {cin>>n>>k;Euler(n);prime[0]=1;if(k<=cntp+1) {cout<<"YES"<<endl;for(int i=0;i<k;i++) {cout<<prime[i]<<" ";}}else{cout<<"NO"<<endl;}
}int main() {ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);solve();return 0;
}

C. 短视频

模拟,\(O(n)\)遍历每个视频即可

设当前累积的观看时长为sum

注意:每个视频都会至少看1s,因为是在这1s结束后判断是否继续刷。

//2025-11-02
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <vector>using namespace std;
const int N = 2e5+10;
#define LL long longLL n,T;
LL t[N],k[N];
LL sum;
int main() {ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);cin>>n>>T;for(int i=1;i<=n;i++) {cin>>t[i]>>k[i];}for(int i=1;i<=n;i++) {if(sum<=T-t[i]) sum+=t[i];//累计不超Telse{if(sum-T<=k[i]-t[i]) sum+=t[i];//吸引力足够支撑到视频结束elsesum=max(sum+1,T+k[i]+1);//吸引力中间不足}}cout<<sum;return 0;
}

K. 左儿子右兄弟

这道题想起来比较简单,代码实现有些细节不好写。

题目有两问:

  1. 所有节点子树大小之和最小是多少

  2. 满足1有几种情况

对于1,显然是每个点子树和最大的点排在前面(因为排在越后面,深度越大,统计子树和时累加次数越多)

如果一个点的几个儿子的子树大小相等,相等的这几个顺序可以是任意的,这就形成了多种情况,也就是第二问让求的。假设有\(k\)个子树大小都为\(w\)的儿子,那么方案数就乘\(k!\),dfs时统计方案数即可。

首先原树建图后dfs求各点的子树和siz。

第一问:dfs回溯时给当前点u的所有儿子的siz排序(大到小),最大的\(k_1\)做u的儿子,然后\(k_2\)\(k_1\)的儿子,依次……建一个新树。然后dfs新树求各点的新子树和ans,再加和即为答案res1。

第二问:记结果为res2,刚才排序后,直接统计每个子树大小的有几个,然后乘\(k!\)

//2025-11-03
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <vector>using namespace std;
const int N = 2e5+10;
#define LL long long
const LL mod=998244353;int n;
int to[N],nxt[N],hd[N],ecnt;
void add(int x,int y) {to[++ecnt]=y;nxt[ecnt]=hd[x];hd[x]=ecnt;
}
vector<int>g[N];//新图
LL siz[N];LL fac[N];//阶乘
LL res1,res2=1;
struct node{int u;LL size;node(int uu,LL s):u(uu),size(s){}bool operator < (const node& x)const{return size>x.size;}
};
vector<node>ve[N];
void dfs(int x,int fa) {for(int i=hd[x];i;i=nxt[i]) {int& y=to[i];dfs(y,x);ve[x].push_back(node(y,siz[y]));siz[x]+=siz[y];}if(ve[x].empty()) return;sort(ve[x].begin(),ve[x].end());int pre=x,cnt=1;for(auto k:ve[x]) {if(k.size==siz[pre]&&pre!=x) {cnt++;}else{res2=res2*fac[cnt]%mod;cnt=1;}g[pre].push_back(k.u);pre=k.u;}res2=res2*fac[cnt]%mod;
}
LL siz2[N];
void getRes1(int x,int fa) {for(auto y:g[x]) {getRes1(y,x);siz2[x]+=siz2[y];}
}
int main() {ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);cin>>n;int x;fac[0]=1;for(int i=1;i<=n;i++) {siz[i]=1;siz2[i]=1;fac[i]=fac[i-1]*i%mod;}for(int i=2;i<=n;i++) {cin>>x;add(x,i);}dfs(1,0);getRes1(1,0);for(int i=1;i<=n;i++) res1=res1+siz2[i];//注意res1不用取模cout<<res1<<"\n"<<res2;return 0;
}

B. 爬⼭

分层图最短路。
首先很容易想到是最短路,然后看到疲劳值清空,H很小,就能联想到分层图了。

按照疲劳值建H+1层图即可。

对于每条边:

上坡,在不超过H的情况下,从当前层连到上坡后对应疲劳值层;

下坡,从当前层到第0层连边。

//2025-11-09
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>using namespace std;
const int N = 2e6;
const int M = 2e7;
#define LL long long
const LL inf = 1e18;
int n, m, H;
int h[N];
int to[M], nxt[M], hd[N], ecnt;
LL w[M];
void add(int x, int y, LL z) {to[++ecnt] = y;w[ecnt] = z;nxt[ecnt] = hd[x];hd[x] = ecnt;
}
struct node {int u;LL val;node() {}node(int uu, LL vv): u(uu), val(vv) {}bool operator < (const node&x) const {return val > x.val;}
};
priority_queue<node> q;
LL dis[N];
bool vis[N];
void dij(int s) {for (int i = 1; i <= (H + 1) * n; i++) dis[i] = inf;q.push(node(s, 0));dis[s] = 0;while (!q.empty()) {int x = q.top().u;q.pop();if (vis[x]) continue;vis[x] = 1;for (int i = hd[x]; i; i = nxt[i]) {int& y = to[i];if (dis[y] > dis[x] + w[i]) {dis[y] = dis[x] + w[i];q.push(node(y, dis[y]));}}}
}
int main() {ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);cin >> n >> m >> H;for (int i = 1; i <= n; i++) cin >> h[i];for (int i = 1, u, v, t; i <= m; i++) {cin >> u >> v >> t;if (h[u] > h[v]) {for (int j = 0; j <= H; j++) {add(u + j * n, v, t); // 下坡if (j + (h[u] - h[v]) <= H)add(v + j * n, u + (j + (h[u] - h[v])) * n, t); // 上坡}} else if (h[u] < h[v]) {for (int j = 0; j <= H; j++) {add(v + j * n, u, t); // 下坡if (j + (h[v] - h[u]) <= H) {add(u + j * n, v + (j + (h[v] - h[u])) * n, t); // 上坡}}} else {// 平路for (int j = 0; j <= H; j++) {add(u + j * n, v + j * n, t);add(v + j * n, u + j * n, t);}}}dij(1);for (int i = 2; i <= n; i++) {LL ans = inf;for (int j = 0; j <= H; j++)ans = min(ans, dis[j * n + i]);if (ans != inf)cout << ans << " ";elsecout << "-1 ";}return 0;
}

其他题目待补。。。

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

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

相关文章

Day16盒子模型

盒子模型的基本组成<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-s…

OpenOCD简明指南

OpenOCD(Open On-Chip Debugger)是一个开源的片上调试工具,支持多种调试器和目标芯片。它通过 JTAG、SWD 等接口与目标设备通信,提供固件烧录、调试、内存操作等功能。一、OpenOCD 简介 OpenOCD(Open On-Chip Deb…

2025Dec.居家集训游记

在家集训也能叫游记吗? 总所周知每一个OIer都爱写这东西 (欸我CSP-S游记还没写) ,所以在家集训也要写。 DAY1 11.9 有点忘了,游记是10号写的。 好像不安了一天,因为我太菜了,也有点想学校里的朋友。 学习了 kru…

电商财务不求人!一张图看懂工作流程,算清每一笔账 - 智慧园区

做电商公司的财务,是不是经常感觉像个“救火队员”?刷单、推广费、平台账单、多店核算……传统行业那套流程在这里好像失灵了。 别慌!电商账务看似复杂,但只要抓住核心流程,就能化繁为简。这篇文章将带你走一遍电…

OI 笑传 #26

Seikai小清新 DP 回。解说会补的。 Luogu P14460 mx 的 NOIP 模拟 T1,赛时连猜带蒙结果 30min 切了( codeShow me the code #define rd read() #define mkp make_pair #define ls p<<1 #define rs p<<1|…

20232327 2025-2026-1 《网络与系统攻防技术》实验四实验报告

20232327 2025-2026-1 《网络与系统攻防技术》实验四实验报告 1. 实验内容 1.1 本周学习内容 本周学习了恶意代码分析的基本方法,静态分析和动态分析的核心概念。静态分析主要通过代码结构和API调用等特征来识别恶意行…

Gas 优化技巧

Gas 优化技巧 gas 优化技巧并不总是有效 注意复杂性和可读性 这里无法对每个主题进行全面处理 我们不讨论特定应用的技巧最重要的是:尽可能避免零到一的存储写入 缓存存储变量:仅写入和读取存储变量一次 打包相关变量…

2025.11.9总结

用AI写项目,太坐牢,今天继续写项目,用ai写,虽然能写出来,但是这是对于小型功能来说,能写,能改小bug,一旦项目的量级上来的,ai也写不出来。 于是这里就引申出了写项目更高级的做法,将大项目拆分成数个独立的小…

Python与C语言术语及概念差异全景总结

Python与C语言术语及概念差异全景总结 基于“易混淆术语(同名不同义)、对应概念(功能相似名不同)、体系差异(机制完全不同)”的严格分类标准,结合实践中高频踩坑点,系统梳理两种语言的核心差异,全程以表格为核…

Appium vs uiautomator2 优势劣势对比表

Appium vs uiautomator2 优势劣势对比表 本文档提供了Appium和uiautomator2两个Android自动化测试框架的详细对比,帮助开发者根据具体需求选择合适的工具。 核心能力对比表对比维度 Appium + Selenium uiautomator2嵌…

Android自动化测试中的嵌套元素查找

Android自动化测试中的嵌套元素查找 本文档总结了Android自动化测试中各种框架对嵌套元素查找的支持情况,包括实现方式、代码示例和性能对比。 目录支持嵌套查找的框架 Appium + Selenium UiAutomator (原生Java) Esp…

solidity面试题

solidity面试题(一)私有、内部、公共和外部函数之间的区别? 答:私有private只能当前合约内部使用,子合约继承也不能调用;内部internal可以当前合约和子合约调用;公共public合约内部外部和子合约都可以调用;外部…

对象存储基本知识

1 存储桶 存储桶是对象存储的核心组织单元,相当于“云端文件夹”,所有对象(文件、数据)都必须存储在存储桶中,是管理对象的基础载体。 1.1 存储桶的核心定位 存储桶是对象存储的顶层命名空间,用于隔离和管理不同…

基于GF域的多进制QC-LDPC误码率matlab仿真,译码采用EMS算法

1.算法仿真效果 matlab2022a仿真结果如下(完整代码运行后无水印): 本课题实现的是四进制QC-LDPC2.算法涉及理论知识概要 多进制QC - LDPC码是一种基于GF域的线性分组码,它具有稀疏的校验矩阵。QC - LDPC码的校验矩…

AtCoder Beginner Contest 431

啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊 [ABC431F] Almost Sorted 2给一个数组 \(A\) 和一个正整数 \(D(1 \le D \le 10^6)\),求有多少种重排数组 \(A\) 能得到的数组 \(B\)(显然多种完全相同的数组 \(B\) 只算一种)…

基于BPSK调制解调和LDPC编译码的单载波相干光传输系统matlab误码率仿真

1.算法仿真效果 matlab2022a仿真结果如下(完整代码运行后无水印):2.算法涉及理论知识概要 在单载波相干光传输系统中,光信号作为载波来传输信息。发送端将电信号调制到光载波上,通过光纤传输到接收端。接收端采用…

空间矢量脉宽调制(Space Vector Pulse Width Modulation)SVPWM基础

空间矢量脉宽调制(Space Vector Pulse Width Modulation)SVPWM基础 前面已经了解了如何将复杂的三相电流通过Clarke与park变换解耦为d-q旋转坐标系的控制,因此只要令\(i_d=0\),控制\(i_q\)来控制转矩大小。 下面需…

OI 笑传 #25

me me she感觉落下了好多东西要写,先写写 ABC431。被 E 吓跑了写了 F。 ABC431D 今年 T1 既视感。 首先贪心把幸福感更高的放进头和身子,这样一定最优但是不一定合法。 然后考虑从头里选出一些扔进身子,选的重量最少…

如何有效衡量开发者生产力:超越代码行数的思考

本文深入探讨了如何正确衡量软件开发者的生产力,批判了传统的代码行数指标,提出了基于产品价值输出的衡量方法,并针对不同开发角色给出了具体度量建议。衡量开发者生产力 几乎从我开始致力于改善软件工程师生活的那…