The 2024 CCPC Online Contest 7/12 L/B/K/D/J/E/C

news/2025/9/17 16:08:58/文章来源:https://www.cnblogs.com/lyet/p/19096940

Problem L. 网络预选赛

签到,直接模拟即可

点击查看代码
#include<bits/stdc++.h>
using namespace std;
int main(){int n,m;cin>>n>>m;vector<string>a(n);for(int i=0;i<n;i++){cin>>a[i];}int sum=0;for(int i=0;i<n-1;i++){for(int j=0;j<m-1;j++){if(a[i][j]=='c'&&a[i][j+1]=='c'&&a[i+1][j]=='p'&&a[i+1][j+1]=='c'){sum++;}}}cout<<sum<<endl;return 0;
}

Problem B. 军训 II

显然排序后的结果最优,注意数组全等的情况

点击查看代码
#include <bits/stdc++.h>template<typename T>
auto constexpr MAX = std::numeric_limits<T>::max();auto main() -> int 
{std::ios::sync_with_stdio(false),std::cin.tie(nullptr);int n;std::cin >> n;auto a = std::vector<int>(n,0);for(auto& v : a) {std::cin >> v;}std::sort(a.begin(),a.end());auto ans = 0ull;for(auto l = 0; l != n; ++l) {auto [min,max] = std::make_pair(a[l],a[l]);for(auto r = l + 2; r <= n; ++r) {min = std::min(min,a[r - 1]);max = std::max(max,a[r - 1]);ans += max - min;}}auto cnt = 1ull;auto map = std::map<int,int>{};for(auto v : a) {++map[v];}using i64 = long long;auto fact = std::vector<i64>(n + 1,i64{});fact[0] = fact[1] = 1;auto constexpr MOD = 998244353;for(auto i = 2; i < n + 1; ++i) {fact[i] = i * fact[i - 1] % MOD;}for(auto [v,ct] : map) {if(ct == 1) {continue;}cnt *= fact[ct];cnt %= MOD;}cnt = std::max(cnt,1ull);if(map.size() > 1) {cnt *= 2;}cnt %= MOD;std::cout << ans << ' ' << cnt << '\n';}

Problem K. 取沙子游戏

\(n\) 是奇数时,先手直接取 \(1\) 即可;

\(n\) 是偶数时,纸上打表发现当 \(lowbit(n) ~<=~ k\) 时,先手直接取 \(lowbit(n)\) 即可,否则后手赢

点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
using pii=pair<int,int>;
using ll = long long;
using ull = unsigned long long;
const ll inf = 1e18;
const int mod = 998244353;int lowbit(int x){return x&-x;
}void solve(){int n,k;cin>>n>>k;if(n&1){cout<<"Alice\n";}else{if(lowbit(n)<=k) cout<<"Alice\n";else cout<<"Bob\n";}
}signed main(){ios::sync_with_stdio(0);cin.tie(0);int ct=1;cin>>ct;while(ct--){solve();}return 0;
}

Problem D. 编码器-解码器

区间 DP,\(dp[i] [l] [r]\) 表示,在第 \(i\) 层字符串中,有多少个子序列是\(T[l,r]\)

逐层转移即可

点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
using pii=pair<int,int>;
using ll = long long;
using ull = unsigned long long;
const ll inf = 1e18;
const int mod = 998244353;void solve(){string s,t;cin>>s>>t;int n=t.size();t=" "+t;s=" "+s;int ans=0;vector<vector<int>> val(n+1,vector<int>(n+1));for(int i=1;i<=n;i++){if(t[i]==s[1]){val[i][i]=1;}}for(int i=2;i<s.size();i++){vector<vector<int>> tv(n+1,vector<int>(n+1));for(int l=1;l<=n;l++){for(int r=l;r<=n;r++){// cout<<"cal l,r: "<<l<<" "<<r<<endl;//不考虑a[i]的// cout<<"不考虑a[i]: "<<endl; for(int k=l-1;k<=r;k++){int t1=1,t2=1;if(k>=l){t1=val[l][k];// cout<<"["<<l<<","<<k<<"]"<<' ';}if(k+1<=r){t2=val[k+1][r];// cout<<"["<<k+1<<","<<r<<"]";}// if(i==2 && l==2 && r==2) cout<<t1<<" ---- "<<t2<<endl;tv[l][r]+=t1*t2;tv[l][r]%=mod;// cout<<endl;}//考虑a[i]// cout<<"考虑a[i]: "<<endl;for(int k=l;k<=r;k++){if(t[k]!=s[i]) continue;int t1=1,t2=1;if(k-1>=l){t1=val[l][k-1];// cout<<"["<<l<<","<<k-1<<"]"<<' ';}if(k+1<=r){t2=val[k+1][r];// cout<<"["<<k+1<<","<<r<<"]";}tv[l][r]+=t1*t2;tv[l][r]%=mod;// cout<<endl;}}}val=tv;}cout<<val[1][n];
}signed main(){ios::sync_with_stdio(0);cin.tie(0);int ct=1;// cin>>ct;while(ct--){solve();}return 0;
}

Problem J. 找最小

记原始 \(a,b\) 数组分别异或的结果是 A,B

如果交换位置 \(i\),等价于 A,B 分别异或 \((a[i]~xor~b[i])\)

将所有的 \((a[i]~xor~b[i])\) 插入线性基

从高位到低位利用线性基尝试减小 A,B 的值即可

点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
using pii = pair<int,int>;
using ll = long long;
using ull = unsigned long long;
const ll inf = 1e18;
const int mod = 998244353;class XorBasis {//基于高斯消元,逐个插入值
public:const int BITS = 62;vector<long long> basis; // 存储线性基的基底int k;                   // 基底中向量的个数bool has_zero;           // 标记原数集中是否能异或出 0XorBasis() : basis(BITS + 1, 0), k(0), has_zero(false) {}void insert(long long num) {for (int i = BITS; i >= 0; i--) {if (!((num >> i) & 1)) {continue;}if (!basis[i]) {basis[i] = num;k++;return;}num ^= basis[i];}// 如果 num 最终变为 0,说明 num 可以由基底中的数异或表示// 这意味着原集合中存在线性相关的向量,可以异或出 0has_zero = true;}
};void solve(){int n;cin>>n;vector<int> a(n+1),b(n+1),c(n+1);int t1=0,t2=0;XorBasis xb;for(int i=1;i<=n;i++){cin>>a[i];t1^=a[i];}for(int i=1;i<=n;i++){cin>>b[i];t2^=b[i];c[i]=a[i]^b[i];xb.insert(c[i]);}for(int j=xb.BITS;j>=0;j--){if(xb.basis[j]==0) continue;if(max(t1^xb.basis[j], t2^xb.basis[j]) < max(t1,t2)){t1^=xb.basis[j];t2^=xb.basis[j];}   }cout<<max(t1,t2)<<endl;
}signed main(){ios::sync_with_stdio(0);cin.tie(0);int ct=1;cin>>ct;while(ct--){solve();}return 0; 
}

Problem E. 随机过程

每一层,最多有 \(min(n,26^i)\) 个节点

每一层的 \(26^i\) 个可能出现的节点,每个节点不出现的概率是 \((1-1/26^i)^n\)

则可以计算出每个节点出现的概率,累加即为期望

点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
using pii=pair<int,int>;
using ll = long long;
using ull = unsigned long long;
const ll inf = 1e18;
const int mod = 998244353;/*支持define int long long 的自动取模类*/
template<const int T>
struct ModInt {const static int mod = T;int x;ModInt(signed x = 0) : x(x % mod) {}ModInt(long long x) : x((int)x % mod) {} int val() { return x; }ModInt operator + (const ModInt &a) const { int x0 = x + a.x; return ModInt(x0 < mod ? x0 : x0 - mod); }ModInt operator - (const ModInt &a) const { int x0 = x - a.x; return ModInt(x0 < 0 ? x0 + mod : x0); }ModInt operator * (const ModInt &a) const { return ModInt(1LL * x * a.x % mod); }ModInt operator / (const ModInt &a) const { return *this * a.inv(); }bool operator == (const ModInt &a) const { return x == a.x; };bool operator != (const ModInt &a) const { return x != a.x; };void operator += (const ModInt &a) { x += a.x; if (x >= mod) x -= mod; }void operator -= (const ModInt &a) { x -= a.x; if (x < 0) x += mod; }void operator *= (const ModInt &a) { x = 1LL * x * a.x % mod; }void operator /= (const ModInt &a) { *this = *this / a; }friend ModInt operator + (int y, const ModInt &a){ int x0 = y + a.x; return ModInt(x0 < mod ? x0 : x0 - mod); }friend ModInt operator - (int y, const ModInt &a){ int x0 = y - a.x; return ModInt(x0 < 0 ? x0 + mod : x0); }friend ModInt operator * (int y, const ModInt &a){ return ModInt(1LL * y * a.x % mod);}friend ModInt operator / (int y, const ModInt &a){ return ModInt(y) / a;}friend ostream &operator<<(ostream &os, const ModInt &a) { return os << a.x;}friend istream &operator>>(istream &is, ModInt &t){return is >> t.x;}ModInt pow(int64_t n) const {ModInt res(1), mul(x);while(n){if (n & 1) res *= mul;mul *= mul;n >>= 1;}return res;}ModInt inv() const {int a = x, b = mod, u = 1, v = 0;while (b) {int t = a / b;a -= t * b; swap(a, b);u -= t * v; swap(u, v);}if (u < 0) u += mod;return u;}};
using mint = ModInt<mod>;int qmi(int a,int b,int p){int res=1;while(b){if(b&1) res=res*a%p;b>>=1;a=a*a%p;}return res;
}void solve(){int n,m;cin>>n>>m;mint mx=0,e=0;for(int i=0;i<=m;i++){if(i>=5) mx+=n;else mx+=min(n,qmi(26,i,mod));int p1=qmi(26,i,mod);p1=qmi(p1,mod-2,mod);int p2=1-p1+mod;p2%=mod;int p3=qmi(p2,n,mod);int p4=1-p3+mod;p4%=mod;e+=qmi(26,i,mod)*p4;}cout<<mx<<" "<<e<<endl;}signed main(){ios::sync_with_stdio(0);cin.tie(0);int ct=1;// cin>>ct;while(ct--){solve();}return 0;
}

Problem C. 种树

想不到的贪心

对于以 \(u\) 为根且 \(u\) 已经种过树,且子树中其他节点未种树的子树,记未种树的节点个数尾 \(sz\)

则需要 \((sz+1)/2\) 次操作,让这个子树全部节点种上树

而当 \(sz\) 是奇数时,还可以给 \(u\) 的父节点种上树

如果 \(u\) 也不是根,则直接把 \(sz[u]\) 传递给父节点即可

点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
using pii=pair<int,int>;
using ll = long long;
using ull = unsigned long long;
const ll inf = 1e18;
const int mod = 998244353;void solve(){int n,m;cin>>n>>m;vector<int> a(n+1);int root;while(m--){int u;cin>>u;a[u]=1;root=u;}vector<vector<int>> g(n+1);for(int i=1;i<n;i++){int u,v;cin>>u>>v;g[u].push_back(v);g[v].push_back(u);}vector<int> sz(n+1);int ans=0;auto dfs=[&](auto dfs,int u,int pre)-> void {for(auto v:g[u]){if(v==pre) continue;dfs(dfs,v,u);sz[u]+=sz[v];}if(a[u]){ans+=(sz[u]+1)/2;if(pre!=0 && sz[u]&1){a[pre]=1;}sz[u]=0;}else{sz[u]++;}};dfs(dfs,root,0);cout<<ans<<endl;
}signed main(){ios::sync_with_stdio(0);cin.tie(0);int ct=1;cin>>ct;while(ct--){solve();}return 0;
}

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

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

相关文章

在joule里面使用agent 功能

test: Dev: 1: structure 2: 本博客为非营利性个人原创,除部分有明确署名的作品外,所刊登的所有作品的著作权均为本人所拥有,本人保留所有法定权利。违者必究

Feign动态URL配置

方式一、亲测可用,缺点是每个类都需要单独配置@FeignClient(value = "my-biz", url = "${external.my.biz_url}", configuration = FeignHeaderInterceptor.class) public interface MyBizFeign {}@Data @Component @RefreshScope @ConfigurationProperti…

自动化部署工具 Jenkins 的安装与配置

Jenkins 是一个开源的自动化部署工具,广泛用于持续集成(CI)和持续交付(CD)流程。它支持自动化构建、测试和部署应用程序。以下是 Jenkins 的安装与配置的详细教程。1. 安装 Jenkins 以下步骤适用于 Linux 系统(以 Ubuntu 和 CentOS 为例),并包含安装必要的依赖环境。1.…

pip 搭建源

搭建本地pip源主要可通过pypiserver、pip2pi或bandersnatch等工具实现,具体步骤如下: 工具选择与安装‌pypiserver‌:轻量级方案,适合快速搭建小型私有源,通过pip install pypiserver安装 ‌pip2pi‌:适合按需构建源,从requirements.txt生成索引,需配合pip install pip…

qoj10093 Jump the Frog

题意 给出 \(n\) 个由 O 和 ~ 组成的字符串 \(s_i\),还有 \(m\) 个额外字符串,第 \(n+i\) 个字符串 \(s_{n+i}\) 由第 \(s_x\) 和 \(s_y\) \((x,y<n+i)\) 个字符串拼接得到,即 \(s_{n+i}=s_x+s_y\)。你需要对这 \(n+m\) 个字符串解决以下问题: 有一只青蛙从字符串的起点…

new 和make

func NewCase() {// 通过new , 可以创建任意类型,并返回指针mpPtr := new(map[string]*user)if *mpPtr == nil { // 通过 * 获取指针内容fmt.Println("map 为空")}// sliceslicePtr := new([]user)if *slicePtr == nil {fmt.Println("slice 为空")}*sliceP…

微信商户绑定微信公众号、小程序

https://pay.weixin.qq.com/index.php/extend/merchant_appid/mapay_platform/account_manage版权木有,侵权不究,欢迎转载

Ceres 常用 LossFunction 对比

Ceres 常用 LossFunction 对比

测试开发全日制学徒班火热报名中|跟着名企大咖做真实项目,结业即上岗

测试开发全日制学徒班,采用系统化教学的全日制线下课程,通过「人工智能测试+自动化测试+Python开发+测试开发」四维能力培养体系,配备行业资深专家导师陪跑服务(私教1v1答疑+周末私教陪跑服务),全程采用企业级学徒制培养模式。 学员将参与真实企业级项目开发,完成测试全…

唯创知音AI语音交互芯片与模组介绍

AI语音交互已经成为智能产品的基础配置,比如常见的AI玩具、智能家居、带AI功能的蓝牙音响,还有汽车的智能车机和智能穿戴设备等。唯创知音顺应市场趋势推出了WT2606A系列的AI语音交互芯片,和WT3000A M06、WT3000A M07、WT3000A M08三款AI语音交互模组。WT2606A AI语音交互芯…

k3s 高可用集群部署(内置 etcd + VIP + keepalived)

k3s 高可用集群部署(内置 etcd + VIP + keepalived) 一、节点规划master 节点:10.0.0.40、10.0.0.51、10.0.0.53 worker 节点:10.0.0.52、10.0.0.54 VIP(高可用入口):10.0.0.41二、离线包准备下载 k3s 安装脚本、二进制、镜像包 导入镜像到本地或 Harbor 打包所有安装文…

问HashMap底层原理?

HashMap是基于数组+链表+红黑树的哈希表。用于存储键值对。 1.哈希计算和扰动处理,也就是Hash方法 每一个Object都有一个 .hashCode 方法。(哈希计算)在对hashmap进行插入和查询时,先调用key键的key.hashCode()方法获取一个未处理的int哈希值,在底层代码中该值被复制给变量…

用 Go 重写 adbkit:原理、架构与搭建实践

用 Go 重写 adbkit:原理、架构与搭建实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !impor…

C语言环境搭建之Linux子系统使用vscode连接子系统

安装准备工作查看当前系统版本确保高于16215.0开启WSL Windows Subsystem for Linux(简称WSL)是一个为在Windows 10上能够原生运行Linux二进制可执行文件(ELF格式)的兼容层。安装步骤微软商城Microsoft Store安装Ubuntu(本人安装的版本是22.04)点击等待安装完成输入用户名跟…

移远AT指令笔记

# 测试 AT - 测试AT指令功能是否正常# 模块相关 ATI - 查询模块信息 AT+CGMI - 查询模块制造商标识 AT+CGMM - 查询模块型号 AT+CGMR - 查询模块固件版本号# 网络相关 AT+QCCID - 查询集成电路卡识别码(ICCID) AT+GSN …

Chromium历史版本下载方式

首先,访问 https://chromiumdash.appspot.com/branches此链接,点击将要下载的chromium版本。我们点击想要下载的版本的Chromium列,这里我们以137为例。点击此处。会打开https://chromium.googlesource.com/chromium/src.git/+log/refs/branch-heads/7151网页。点击上图红框处…

【ACM出版】第三届物联网与云计算技术国际学术会议 (IoTCCT 2025)

第三届物联网与云计算技术国际学术会议(IoTCCT 2025)将于‌2025年9月26-28日‌在中国海口市盛大召开!【ACM独立出版 | 往届会后四个月EI检索! 】 【IEEE Fellow助力,行业内精彩报告!】 第三届物联网与云计算技术国际学术会议 (IoTCCT 2025) 2025 3rd International Confe…

2025年最全 Wiki 管理工具测评:ONES、Confluence、Notion......哪个更适合你?

随着技术和团队规模的不断发展,如何有效管理知识、文档和任务,成为了研发团队面临的重要挑战。Gartner 发布的《Top Strategic Predictions for 2024 and Beyond》报告指出,成功的研发领导者应该采用新的方法,构建数字化的研发生态系统,利用技术工具创造一个高绩效的研发环…

天下拍拍卖系统:二方系统也能扩展三方平台功能

过去很多年,大多数拍卖公司为了快速开展线上拍卖会,普遍选择入驻阿里拍卖、京东拍卖、公拍网等三方平台——功能齐全、流量大、上线快。但随着业务深入,企业逐渐发现三方平台存在一些限制,想要私有化搭建一套属于拍卖公司自己的拍卖系统,但同时可能也想保留一些三方平台的…

express使用redis

我用的pnpm pnpm add express redisconst express = require(express); const redis = require(redis); var app = express() var port = 3000 // 创建 Redis 客户端实例 const redisClient = redis.createClient({url: redis://172.17.0.185:6379 ,password: b7371d927aec647d…