集训3 20240127

news/2025/2/5 22:26:59/文章来源:https://www.cnblogs.com/dianman/p/18700243

集训3 20240127

牛客竞赛_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ

A:

题目大意:给定 \(n\) ,两个人轮流可以使 \(n\) 减去一个任意小于它且与它互质的数,求最后甲能否取胜

#include<bits/stdc++.h>using namespace std;int main()
{long long n;cin>>n;if  (n%2==0) cout<<"NO";else cout<<"YES";return 0;
}

与偶数互质的数一定为奇数,那么每个人的最优策略就是只减去 \(1\)

如果某人的 \(n\) 现在为偶数,那么一定会失败

M:

题目大意:给定 \(8\) 个字符,判断是否符合条件

#include<bits/stdc++.h>using namespace std;int main()
{map<char,int> a;char s;for (int i=0;i<8;i++){cin>>s;a[s]++;} if (a['c']!=1||a['d']!=1||a['e']!=1||a['n']!=1||a['o']!=2||a['r']!=1||a['w']!=1)cout<<"I AK IOI";else cout<<"happy new year";return 0;
}

签到,但是送了一发

F:

题目大意:

#include<bits/stdc++.h>using namespace std;void solve(void){int n,a,b,c;cin>>n>>a>>b>>c;if (a+b+c<n||a+b+c>2*n){cout<<"NO"<<endl;return;}cout<<"YES"<<endl;return;
}int main()
{int T;cin>>T;while (T--)solve();return 0;
}

题目可以转化为不等式:

\[\begin{cases} x_1+x_2+x_3=A\\ x_3+x_4+x_5=B\\ x_5+x_6+x_1=C \end{cases} \]

等式两侧分别求和有:

\[2*(x_1+x_3+x_5)+x_2+x_4+x_6=A+B+C \]

设球总共有 \(N\) 个,那么 $\sum_{i=1}^6 x_i=N\ $

\[\implies N\le A+B+C\le2N \]

所以,当且仅当上述不等式成立时,存在答案

L:
题目大意:

#include<bits/stdc++.h>using namespace std;string s[9]={"0","1","2 3 1 2","4 5 6 3 5 2 3 1 2 4","7 8 9 10 6 9 5 8 4 5 6 3 5 2 3 1 2 4 7","11 12 13 14 15 10 14 9 13 8 12 7 8 9 10 6 9 5 8 4 5 6 3 5 2 3 1 2 4 7 11","16 17 18 19 20 21 15 20 14 19 13 18 12 17 11 12 13 14 15 10 14 9 13 8 12 7 8 9 10 6 9 5 8 4 5 6 3 5 2 3 1 2 4 7 11 16","22 23 24 25 26 27 28 21 27 20 26 19 25 18 24 17 23 16 17 18 19 20 21 15 20 14 19 13 18 12 17 11 12 13 14 15 10 14 9 13 8 12 7 8 9 10 6 9 5 8 4 5 6 3 5 2 3 1 2 4 7 11 16 22","29 30 31 32 33 34 35 36 28 35 27 34 26 33 25 32 24 31 23 30 22 23 24 25 26 27 28 21 27 20 26 19 25 18 24 17 23 16 17 18 19 20 21 15 20 14 19 13 18 12 17 11 12 13 14 15 10 14 9 13 8 12 7 8 9 10 6 9 5 8 4 5 6 3 5 2 3 1 2 4 7 11 16 22 29"
};int main()
{int n;cin>>n;cout<<"YES"<<endl;cout<<s[n+1];return 0;
}

直接打表算了

DFS判断欧拉回路:

#include<bits/stdc++.h>using namespace std;struct edge{int v,id;
};int b[10010];
vector<edge> e[10010]; 
int idx;
bool vis[10010];
vector<int> ans;void insert(int u,int v){e[u].push_back({v,idx});e[v].push_back({u,idx});idx++;//记录点
}void dfs(int x){for (auto [v,id]:e[x]){if (vis[id]) continue;//判断是否经过vis[id]=1;dfs(v);}ans.push_back(x);//回溯加入答案
}int main()
{int n;cin>>n;b[0]=1;for (int i=1;i<=n;i++)b[i]=b[i-1]+i;//计算最左侧端点值for (int i=0;i<n;i++){for (int j=0;j<=i;j++){//插入边insert(b[i]+j,b[i+1]+j);insert(b[i+1]+j,b[i+1]+j+1);insert(b[i+1]+j+1,b[i]+j);}}dfs(1);cout<<"YES"<<endl;;for (auto iter:ans) cout<<iter<<' ';return 0;
}

C:

题目大意:给定 \(n\) 个单词,在可以使用删除键的情况下,求解输出这 \(n\) 个单词最少的敲键盘数

#include<bits/stdc++.h>using namespace std;int n,m,l,r;
string s[1000010];
int tr[1000010][30];
int idx,cnt[1000010],mem[1000010],memcnt;int getnum(char c){return c-'a';
}void insert(string s){int p=0,len=s.size();for (int i=0;i<len;i++){int c=getnum(s[i]);if (!tr[p][c]){tr[p][c]=++idx;mem[memcnt]++;}p=tr[p][c];}
}bool cmp(string x,string y){return x.size()>y.size();
}int main()
{cin>>n>>m;for (int i=0;i<n;i++){cin>>s[i];}sort(s,s+n,cmp);for(int i=0;i<n;i++){insert(s[i]);memcnt++;}cin>>l>>r;sort(mem,mem+memcnt);long long ans=idx;for (int i=0;i<memcnt-1;i++)ans+=1ll*mem[i];cout<<ans;return 0;
}

采用字典树模拟,公共前缀不用重复输出

实际上可以解决地更容易,原题可以转化为求解不等式的极小值:

\[ans=S_0+\sum_{i=1}^{N-1}S_i+S_{i-1}-2*lcp(S_i,S_{i-1}) \\ \implies ans=2*(\sum_{i=0}^{N-1}S_i-\sum_{i=1}^{N-1}lcp(S_i,S_{i-1}))-S_{N-1} \]

贪心计算

\[max(\sum_{i=1}^{N-1}lcp{S_i,S_{i-1}})\quad and\quad max(S_{N-1}) \]

答案即为 2 * (字符串组全部字符和 - 相邻字符串公共最长前缀长度) - 最长字符串长度

#include<bits/stdc++.h>using namespace std;int n,m;
int x,y,z;
string s[100010];int lcp(string a,string b){//计算相邻公共最长前缀的长度int i=0;while(i<a.size()&&i<b.size()&&a[i]==b[i]) ++i;return i;
}int main()
{cin>>n>>m;for (int i=1;i<=n;i++) cin>>s[i];sort(s+1,s+n+1);for (int i=1;i<=n;i++){x+=2*(int)s[i].size();if (i!=1) y+=2*lcp(s[i],s[i-1]);z=max(z,(int)s[i].size());}cout<<x-y-z;return 0;
}

E:

题目大意:

#include<bits/stdc++.h>using namespace std;const int INF=1e9+7;
int n,k;
vector<int> a,b;bool judge(int x){//x看作时间的两倍,避免浮点运算int p1=0,p2=0;//双指针long long res=0;for (auto iter:a){while(p2<b.size()&&b[p2]<iter) p2++;//记录iter小球前一个碰到的球while(p1<b.size()&&b[p1]<=iter+x) p1++;//记录iter小球最远能碰到哪个小球res+=p1-p2;//记录这个区间内所有能碰到的小球的个数}return res<k;//二分判断
}int main()
{cin>>n>>k;for (int i=1;i<=n;i++){int x,y;cin>>x>>y;if (y==1) a.push_back(x);//记录向右小球else b.push_back(x);//记录向左小球}sort(a.begin(),a.end());//按照坐标排序sort(b.begin(),b.end());int l=0,r=INF;while(l+1!=r){int mid=l+r>>1;if (judge(mid))l=mid;else r=mid;}if (r==INF){cout<<"NO\n";return 0;}else{cout<<"YES"<<endl;printf("%.6lf",(double)r/2);return 0;}}

二分时间,利用双指针优化计算碰撞次数

G:

题目大意:计算 \(\sum_{i=1}^n n\ \%\ i\) 排序后前 \(k\) 项和

#include<bits/stdc++.h>using namespace std;int main()
{long long n,k;cin>>n>>k;long long l=0,r=n+1;long long sum,val;while (l+1!=r){long long mid=l+r>>1;long long cnt=0;for (long long ll=1,rr;ll<=n;ll=rr+1){rr=n/(n/ll);long long t=n-n/ll*ll,kk=n/ll;if (t<mid) continue;cnt+=min((t-mid)/kk+1,rr-ll+1);}if (cnt>=k) l=mid;else {sum=cnt;val=mid;r=mid;}}long long ans=1ll*(k-sum)*(val-1);for (long long ll=1,rr;ll<=n;ll=rr+1){rr=n/(n/ll);long long t=n-n/ll*ll,kk=n/ll;if (t<val) continue;long long len=min((t-val)/kk+1,rr-ll+1);ans+=1ll*(t*2-kk*(len-1))*len/2;}cout<<ans;return 0;
}

利用二分查找第 \(k\) 大的数是多少

\[x\ \%\ y=x-\lfloor \frac{y}{x}\rfloor\cdot x \]

long long l=0,r=n+1;//左右边界
long long sum,val;
while (l+1!=r){long long mid=l+r>>1;long long cnt=0;//cnt记录当前大于mid的数有多少for (long long ll=1,rr;ll<=n;ll=rr+1){//分块计算rr=n/(n/ll);//计算右边界long long t=n-n/ll*ll,kk=n/ll;//t计算当前的n%i(分块的第一个元素),kk记录商(公差)if (t<mid) continue;//如果t比mid还要小,那么就跳过这个分块cnt+=min((t-mid)/kk+1,rr-ll+1);//累加cnt,在没有超出边界的情况下加上区间内大于mid的元素的数量//(t-mid)/kk+1,根据公差计算元素个数}if (cnt>=k) l=mid;//如果数量超过了二分的mid,说明mid取小了,满足的元素个数多于kelse {//mid取大了,那就需要记录cnt和mid的值,更新右边界sum=cnt;val=mid;r=mid;}
}

只在更新 r 的时候记录 sumval 的原因是更新 r 时的 mid 已经满足条件了

例如 n=10,k=5 时,排序后的商为 4 3 2 2 1 1 0 0 0 0 ,第五个数和第六个数的值相同,为了便于计算就记录不同于第 k 个数前的位置,cnt=4

long long ans=1ll*(k-sum)*(val-1);计算第k个数有多个元素的值相同情况
for (long long ll=1,rr;ll<=n;ll=rr+1){rr=n/(n/ll);long long t=n-n/ll*ll,kk=n/ll;if (t<val) continue;//如果t比val还要小,那么就跳过这个分块long long len=min((t-val)/kk+1,rr-ll+1);//计算分块长度ans+=1ll*(t*2-kk*(len-1))*len/2;//等差数列累加答案
}

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

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

相关文章

RocketMQ实战—4.消息零丢失的方案

大纲 1.全链路分析为什么用户支付完成后却没有收到红包 2.RocketMQ的事务消息机制实现发送消息零丢失 3.RocketMQ事务消息机制的底层实现原理 4.是否可以通过同步重试方案来代替事务消息方案来实现发送消息零丢失 5.使用RocketMQ事务消息的代码案例细节 6.同步刷盘+Raft协议同步…

qoj7301 AGC036D 题解

qoj7301 orz yxx 有一个很牛的状态设计 \(f_{i,j,0/1}\),\(0\) 为 \(a_{i-1}>a_i\),\(j\) 记录 \(a_{i-1}\) 的值,\(a_i\) 的值未定;\(1\) 为 \(a_{i-1}<a_i\),\(j\) 记录 \(a_i\) 的值 这样可以完美解决 \(a_{i-1}>a_i<a_{i+1}\) 的问题 转移和优化都是简单的…

【PyTorch】对比Torch和Numpy

该部分主要通过对比Torch和Numpy基础知识,方便大家了解PyTorch。Numpy是处理数据的模块,处理各种矩阵的形式来多核加速运算。 Torch自称为神经网络界的Numpy,因为它能将torch产生的tensor(张量)放在 GPU 中加速运算(前提是你有合适的 GPU),就像Numpy会把array放在CPU中…

十. Redis 事务和 “锁机制”—— 并发秒杀处理的详细说明

十. Redis 事务和 “锁机制”——> 并发秒杀处理的详细说明 @目录十. Redis 事务和 “锁机制”——> 并发秒杀处理的详细说明1. Redis 的事务是什么?2. Redis 事务三特性3. Redis 关于事务相关指令 Multi、Exec、discard和 “watch & unwatch”3.1 快速入门(演示…

使用Tauri框架打造的FPS透视

使用Tauri框架打造的FPS透视,使用javascript读内存绘制透视框使用Vue前端和Rust后端打造FPS透视 前端使用P5js进行canvas绘制 后端封装内存读取工具,前端快速编写代码无需重启调试 Vue前端与后端通讯获取内存数据并在前端渲染 作者声明 [仅供学习 请勿非法用途 从事非法用途出…

Mybatis 动态查询

where和if标签搭配 user表如下图所示 有时候,我们想在java程序中自定义查询条件,例如,我想查询user表,有时候我输入name=“狂神”,查询所有name为狂神的数据,有时候我输入pwd=‘123456’,想查询所有密码为123456的数据,有时候我想查询name为狂神同时密码为123456的数据…

一文搞懂企业架构与DDD的融合

在当今数字化时代,企业架构(EA)和领域驱动设计(DDD)成为了构建高效、灵活且可扩展软件系统的关键方法论。本文将深入探讨企业架构TOGAF框架与DDD的融合之道,分析如何通过这种结合实现从业务战略到技术实现的无缝对接。今天聊聊企业架构与DDD如何进行融合。一、企业架构TO…

【监控】ElastAlert 实现 ES 钉钉群日志告警

一、ElastAlert 概述 ElastAlert 是一个开源的警报框架,由 Yelp 开发,它可以从 Elasticsearch 中提取数据并根据预定义的规则生成警报。ElastAlert 可用于监控您的日志和时间序列数据,以便在发生异常、错误或其他有趣的模式时立即采取行动。ElastAlert 能够与许多通知服务(…

状压dp串讲

知识讲解 前置知识:位运算 (学过的可以跳过) 众所周知,电脑使用的是二进制,那么对二进制位进行的计算就叫做位运算。那么经典的位运算有以下几种:&(按位与)规律:除非两者均为 \(1\),否则其他情况结果均为 \(0\)。若两者为均唯一则答案为 \(1\)。 |(按位或)规律…

DeepSeek本地化部署

DeepSeek-R1本地化部署 在 Mac 上使用 Ollama 运行 DeepSeek-R1,并通过 Open-WebUI 提供 Web 端访问。 1. 安装 Ollama Ollama官方:https://ollama.com/ Ollama 是一个轻量级的 AI 推理框架,支持本地运行 LLM(大型语言模型)。首先,下载并安装 Ollama。 # brew安装ollama …

微服务 - 服务雪崩和限流

1. 服务雪崩 1.1 什么是服务雪崩? 在微服务中,假如一个或者多个服务出现故障,如果这时候,依赖的服务还在不断发起请求,或者重试,那么这些请求的压力会不断在下游堆积,导致下游服务的负载急剧增加。不断累计之下,可能会导致故障的进一步加剧,可能会导致级联式的失败,甚…