ICPC2023杭州个人题解

news/2025/11/6 11:00:31/文章来源:https://www.cnblogs.com/kangyi996/p/19193049

M. V-Diagram

题意:给定一个长度为 \(n\) 的数组 a,满足数组的大小呈V字排列(即中间某个地方的值最小,往两边依次单调递增),求其满足还是V字排列的子数组的最大的平均值。

限制条件:\(3\le n \le 3×10^5,1\le a_i \le 10^9\)

题解:首先我们先考虑只选取其中一边,那么很容易就注意到越边缘的值越大,取完以后平均值就越大,直到一边的数全部取完。但是根据题目要求两边都要取,那么就直接枚举另外一边取多少个然后统计最大的答案即可。时间复杂度 \(O(n)\)

点击查看代码
#include<bits/stdc++.h>
using namespace std;
using ll=long long;int main()
{ios::sync_with_stdio(0);cin.tie(0);ll tttt=1;cin>>tttt;while(tttt--){ll n;cin>>n;double ans=0;vector<ll>a(n+7);for(int i=1;i<=n;i++){cin>>a[i];}ll p;for(int i=2;i<n;i++){if(a[i]<a[i+1]&&a[i-1]>a[i]){p=i;break;}}ll lsum=0,rsum=0;for(int i=1;i<=p;i++){lsum+=a[i];}for(int i=p+1;i<=n;i++){lsum+=a[i];ans=max(ans,1.0*lsum/i);}for(int i=p;i<=n;i++){rsum+=a[i];}for(int i=p-1;i>=1;i--){rsum+=a[i];ans=max(ans,1.0*rsum/(n+1-i));}cout<<fixed<<setprecision(18)<<ans*1.0<<'\n';}return 0;
}

J. Mysterious Tree

题意:有一个结点数为 \(n\) 的树,可能是链和菊花图中的一种。你可以询问不超过 \(\lceil \frac{n}{2} \rceil+3\) 次,每次可以询问两个结点之间有没有边,然后你要判断这个树是上述两种中的哪一种。

限制条件:\(4\le n \le 1000\)

题解:根据给定的次数限制可以猜到这样一种方法:每次询问(1,2),(3,4),(5,6),…,(n-1,n),如果n为奇数就多问一次(n-1,n),这样刚好是 \(\lceil \frac{n}{2} \rceil\) 次。如果都不存在边的话这个图肯定是个链,因为菊花图的中心和其他所有点都有边,上述过程中至少会查询到一个。如果查到了的话也可能是链或者菊花图,因此我们要在三次内辨别。

我们现在多了的信息是有两个节点 u,v 存在一条边,怎么利用上呢?注意到:如果是菊花图的话那么u和v中肯定有一个节点会是中心结点,那么这个节点会和其他的所有点相连,而其他所有点之间不存在其他的边相连。所以我们只要判断u和v是不是中心结点就行了。我们任意取另外的两个节点c1和c2,先判断c1和u有没有边。如果有的话,u就有可能是中心结点,v就不可能。再根据c2和u是否有边判断即可。如果没有的话,只有v可能是中心结点,再询问两次c1和v以及c2和v即可,以上最多三次。时间复杂度 \(O(n)\)

点击查看代码
#include<bits/stdc++.h>
using namespace std;
using ll=long long;int main()
{ios::sync_with_stdio(0);cin.tie(0);ll tttt=1;cin>>tttt;while(tttt--){ll n;cin>>n;ll u=-1,v=-1;for(int i=1;i+1<=n;i+=2){cout<<"? "<<i<<' '<<i+1<<endl;ll x;cin>>x;if(x==1){u=i;v=i+1;break;}}if(n&1){cout<<"? "<<n-1<<' '<<n<<endl;ll x;cin>>x;if(x==1){u=n-1;v=n;}}if(u==-1&&v==-1){cout<<"! 1"<<endl;continue;}ll c1=-1,c2=-1;for(int i=1;i<=n;i++){if(c1==-1&&i!=u&&i!=v)c1=i;else if(c2==-1&&i!=u&&i!=v)c2=i;}ll x;cout<<"? "<<c1<<' '<<u<<endl;cin>>x;if(x==1){cout<<"? "<<c2<<' '<<u<<endl;cin>>x;if(x==1)cout<<"! 2"<<endl;else	cout<<"! 1"<<endl;}else{cout<<"? "<<c1<<' '<<v<<endl;cin>>x;if(x==1){cout<<"? "<<c2<<' '<<v<<endl;cin>>x;if(x==1)cout<<"! 2"<<endl;else	cout<<"! 1"<<endl;}else	cout<<"! 1"<<endl;}}return 0;
}

D. Operator Precedence

题意,构造一个长度为 \(2n\) 的数组a,要求满足 \(\sum_{i=1}^{n} a_{2i-1} a_{2i}=a_1a_{2n}\prod_{i=2}^{n} (a_{2i-2}+a_{2i-1})\ne 0\)

限制条件:\(2\le n \le 10^5\),构造的 \(1 \le |a_i| \le 10^{10}\)

题解:注意到右边是乘积的形式,所以每项都不能等于0.而且如果每项不几乎都是 \(\pm1\) 的话右边的乘积会特别大,不可能等于左边的求和。因此我们考虑构造一个大多数 \((a_{2i-2}+a_{2i-1})\) 都是 \(\pm1\) 的数组。考虑最简单的情况,让 \(a_{2i-2}=-1,a_{2i-1}=2\),那么就要满足 \(-a_1+2(n-1)+2a_{2n}=a_1a_{2n}(1)^{n-1}\),我们直接让 \(a_1=1\) ,带入左边解出 \(a_{2n}=2n-3\),显然没有一项会等于零,于是这样的数组符合题意。时间复杂度 \(O(n)\)

点击查看代码
#include<bits/stdc++.h>
using namespace std;
using ll=long long;int main()
{ios::sync_with_stdio(0);cin.tie(0);ll tttt=1;cin>>tttt;while(tttt--){ll n;cin>>n;vector<ll>a(2*n+7);a[1]=1;for(int i=1;i<n;i++){a[2*i]=-1;a[2*i+1]=2;}a[2*n]=2*n-3;for(int i=1;i<=2*n;i++){cout<<a[i]<<" \n"[i==2*n];}// ll now=0;// for(int i=1;i<=n;i++)// {// now+=a[2*i-1]*a[2*i];// }// cout<<now<<'\n';// now=a[1]*a[2*n];// for(int i=2;i<=n;i++)// {// now*=a[2*i-2]+a[2*i-1];// }// cout<<now<<'\n';}return 0;
}

G. Snake Move

题意,在一个 \(n×m\) 的方格里面玩贪吃蛇,你最开始的长度为 \(k\) ,每次可以上下左右移动或者保持在原地不动(同时尾巴还是会动),不能超过边界。当你的长度为2时可以交换头尾。问到所有点的最少移动次数,求它们的平方和,对 \(2^{64}\) 取模。

限制条件:\(1\le n,m \le 3000,1\le k \le min(nm,10^5)\)

题解:如果只是一个点的话,那就是很朴素的bfs或者最短路。但是现在的区别是有了身子,身子会影响所在点的到达时间,身子上第 \(i\) 节到达的时间至少得是 \(k+1-i\) ,那就直接对这些点多考虑一个限制条件然后跑最短路就行了。时间复杂度 \(O(nm\log (nm))\)

点击查看代码
	#include<bits/stdc++.h>using namespace std;using ll=long long;ll dx[4]={-1,1,0,0};ll dy[4]={0,0,-1,1};struct node{ll x,y,dis;friend bool operator < (node a,node b){return a.dis>b.dis;}};int main(){ios::sync_with_stdio(0);cin.tie(0);ll tttt=1;//cin>>tttt;while(tttt--){ll n,m,k;cin>>n>>m>>k;priority_queue<node>q;vector<vector<ll>>ans(n+7,vector<ll>(m+7,INT_MAX));vector<vector<ll>>mp(n+7,vector<ll>(m+7,0));for(int i=1;i<=k;i++){ll x,y;cin>>x>>y;if(i==1){q.push({x,y,0});ans[x][y]=0;}else	mp[x][y]=k+1-i;}for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){char c;cin>>c;if(c=='#')mp[i][j]=-1;}}while(!q.empty()){auto [x,y,dis]=q.top();q.pop();if(dis!=ans[x][y])continue;for(int i=0;i<4;i++){ll xx=x+dx[i],yy=y+dy[i];if(xx<1||xx>n||yy<1||yy>m||mp[xx][yy]==-1)continue;if(mp[xx][yy]<dis+1){if(ans[xx][yy]>dis+1){ans[xx][yy]=dis+1;q.push({xx,yy,dis+1});}}else if(ans[xx][yy]>mp[xx][yy]){ans[xx][yy]=mp[xx][yy];q.push({xx,yy,mp[xx][yy]});}}}unsigned long long res=0;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){if(ans[i][j]!=INT_MAX)res+=ans[i][j]*ans[i][j];//cout<<ans[i][j]<<" \n"[j==m];}}cout<<res<<'\n';}return 0;}

H. Sugar Sweet II

题意:糖果是甜的!有 \(n\) 个孩子,每个孩子有 \(a_i\) 块糖。有 \(n\) 个事件按随机顺序发生。第 \(i\) 次事件为若 \(a_i<a_{b_i}\) ,则给 \(a_i\) 加上 \(w_i\) 。问每个人最后糖果数量的期望值,模 \(10^9+7\)

限制条件:\(1\le b_i \le n \le 5×10^5,1 \le a_i,w_i \le 10^9\)

题解:就是求每个孩子能触发自己的事件的概率。如果 \(a_i<a_{b_i}\),无论如何都能触发;如果 \(a_i<a_{b_i}+w_{b_i}\) ,那就要求第 \(i\) 个事件发生在第 \(b_i\) 个事件之后,并且第 \(b_i\) 个事件成功触发,这个概率一会再考虑;如果 \(a_i \ge a_{b_i}+w_{b_i}\),那么无论如何都不能触发。

第二种情况是我们需要解决的,也就是第 \(i\) 个事件前面有多少个事件要按顺序发生了第 \(i\) 个事件才能够发生。我们考虑从 \(b_i\)\(i\) 连一条边,那么 \(i\) 号点在图中的深度就对应它要在多少事件后面发生。而这样每个点最多只有一条入边,不会形成环,可以之间建图然后bfs求各个点的深度。但是要注意!最开始只有入度为0并且对应事件一定会发生的点能被加入到队列中。 如果这个事件已经不可能发生了,那它后面的事件也是不可能发生的了。

那么如果一个事件前面有 \(k\) 个事件要按顺序发生,那么这个事件发生的概率是多少呢?其实很好求!因为任意两个事件的顺序都是随机的,然后我们要求这 \(k+1\) 个事件按照我们指定的顺序发生,也就是这些事件的全排列中的唯一一种,和其他事件的顺序是没有关系的,所以概率就是 \(\frac{1}{(k+1)!}\),预处理一下逆元就可以直接求出 \(a_i+\frac{w_i}{(k+1)!}\) 了!时间复杂度上,bfs图的部分为 \(O(n)\),求逆元的部分为 \(O(n\log M)\),M为模数,求答案的部分为 \(O(n)\)。所以总时间复杂度为 \(O(n\log M)\)

点击查看代码
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
const int M=1000000007;
ll qpow(ll a,ll b)
{ll ans=1;a%=M;while(b){if(b&1)ans=ans*a%M;a=a*a%M;b>>=1;}return ans;
}
int main()
{ios::sync_with_stdio(0);cin.tie(0);ll tttt=1;cin>>tttt;while(tttt--){ll n;cin>>n;vector<ll>a(n+7),b(n+7),w(n+7);for(int i=1;i<=n;i++){cin>>a[i];}for(int i=1;i<=n;i++){cin>>b[i];}for(int i=1;i<=n;i++){cin>>w[i];}vector<ll>dep(n+7,-1);vector<vector<ll>>G(n+7);vector<ll>per(n+7,1);vector<bool>yw(n+7,0);for(int i=1;i<=n;i++){if(a[b[i]]<=a[i]&&a[b[i]]+w[b[i]]>a[i]){G[b[i]].push_back(i);yw[i]=1;}}queue<pair<ll,ll>>q;for(int i=1;i<=n;i++){if(!yw[i]&&a[i]<a[b[i]]){q.push({i,1});}}while(!q.empty()){auto [u,now]=q.front();dep[u]=now;q.pop();for(auto i:G[u]){q.push({i,now+1});}}// for(int i=1;i<=n;i++)// {// cout<<dep[i]<<" \n"[i==n];// }for(int i=1;i<=n;i++){per[i]=per[i-1]*qpow(i,M-2)%M;}vector<ll>ans(n+7);for(int i=1;i<=n;i++){if(a[b[i]]+w[b[i]]>a[i]&&dep[i]!=-1)ans[i]=(a[i]+per[dep[i]]*w[i]%M)%M;elseans[i]=a[i];cout<<ans[i]<<" \n"[i==n];}}return 0;
}

加油加油!

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

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

相关文章

2025年11月学习机品牌推荐榜:清北双师与AI精准学排行盘点

临近学期中段,家长群里最热的议题从“报哪门网课”变成“该选哪台学习机”。十一月的期中成绩刚公布,不少家庭发现孩子知识漏洞集中、校内节奏加快,原来靠打印卷子的“土法”已跟不上新课改的进度;同时,教育部《2…

2025年11月学习机品牌推荐:护眼大屏榜多维对比排行

开学季刚过,家长群里的讨论却热度不减:新课标教材更新、期中成绩波动、线上课程时间被严格限制,一连串变化让“在家怎么学”成为高频痛点。教育部《2024全国中小学生学习负担监测报告》显示,近六成家庭每天额外学习…

Linux - 压缩解压篇

工具 核心定位 本质功能 默认生成格式 关键限制 压缩gzip 单文件快速压缩工具 仅压缩 / 解压单个文件(无归档能力) .gz 不支持目录、不支持多文件合并压缩压缩: gzip 保留源文件加 -k进度加 -v解压: gunzip/gzip -…

2025年11月学习机品牌权威榜:读书郎领衔五强对比评测

“孩子放学回家,作业不会写、错题没人讲、预习没方向”——这是不少家庭在2025年新课改全面落地后遇到的共同场景。新课标强调核心素养与探究式学习,教材更新节奏加快,家长普遍反映“辅导难度陡增”。教育部《2024全…

2025年湖南网络工程师公司权威推荐:信息安全工程师/软考网站/信息系统监理师服务供应商精选

随着企业数字化转型进程加速,网络工程师服务在确保企业IT基础设施稳定性和安全性方面发挥着至关重要的作用。本文将基于行业发展趋势,为您深入分析湖南地区网络工程师服务市场,并精选2025年度表现优异的服务提供商,…

P2416 泡芙 题解

P2416 泡芙 题解P2416 泡芙 题解 题目传送门 我的博客 前言 笔者一开始写了一版 \(O(NQ)\) 的,竟然没有TLE?(但是WA了,且做法假了 本题做法:tarjan缩点+LCA。 思路 拿到这个题首先研究样例,发现样例中竟然有环。…

MySQL超大分页怎么处理?

MySQL超大分页怎么处理?超大分页通常发生在数据量大的情况下,使用LIMIT分页查询且需要排序时效率较低。可以通过覆盖索引和子查询来解决。首先查询数据的ID字段进行分页,然后根据ID列表用子查询来过滤只查询这些ID的…

2025年上海GEO公司权威推荐:GEO运营商/GEO搜索优化/AI搜索优化服务商精选

在AI搜索引擎快速迭代的背景下,GEO(地理定位优化)服务已成为企业精准营销的核心工具。根据行业数据统计,2025年全球GEO服务市场规模预计达到800亿美元,中国企业在地理定位优化领域的投入保持年均增长率12%-15% 的…

P14364 [CSP-S 2025] 员工招聘 / employ

没见过的一种 DP 类型,我们称它为贡献延后计算。 具体来说就是我们只关心选出来了些什么,至于这些东西的顺序我们在转移的时候不重复的钦定即可。 考虑本题设 \(f_{i, j, k}\) 表决策到前 \(i\) 场面试,有 \(j\) 个…

post表单提交接口测试

新建线程组(线程数1、循环次数1),添加“HTTP请求”,服务器httpbin.org,端口80,方法POST,路径/post 勾选“使用表单数据”,在参数栏添加2组数据(如username=test、password=123456)添加“察看结果树”,运行后…

2025年常州logo设计公司权威推荐榜单:商标logo设计/文字logo设计/品牌logo设计源头公司精选

在品牌竞争日益激烈的市场环境中,专业的logo设计已成为企业构建视觉识别、传递品牌价值的核心环节。根据行业报告数据,2025年全球VI设计市场年增长率预计达12%,中国企业,尤其是长三角地区对专业设计服务的需求旺盛…

JMeter题目

一. 基础HTTP GET接口请求测试 操作步骤:打开JMeter,新建测试计划,右键添加“线程组”(线程数1、循环次数1)。线程组下添加“HTTP请求”,服务器名称/IP填写httpbin.org,端口80,请求方法选GET,路径填写/get。添…

centos7 文件夹下 按年月统计文件大小

我是一个运维人员,我想统计centos7.5环境下,/app/minio/file-bucket文件夹内,文件按照日期,按年月统计文件总大小当然可以!我来帮您改造这个命令,使其能够按照年月分组统计。当前的命令只能按月份统计,无法区分…

完整教程:舆情处置的智能化进阶:Infoseek舆情系统如何构建企业数字免疫体系

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

2025 年 BA 自控系统厂家最新推荐排行榜:行业优质企业核心优势全面解析,含权威测评数据空调箱 BA 自控系统/新风机组 BA 自控系统公司推荐

引言 在建筑楼宇智能化与工业自动化快速发展的当下,BA 自控系统作为保障建筑环境舒适、工业生产高效及能源合理利用的关键,市场需求持续攀升。但行业内厂家水平不一,为帮助需求方精准选择,行业协会开展了 BA 自控系…

基础HTTP GET 接口请求测试

打开JMETER,新建测试计划,右键添加“线程组”(线程组1、)线程组下添加“HTTP请求”,服务器名称/IP填写httpbin.org,端口80,请求方法选GET,路径填写/get添加“察看结果树”监听器,点击运行,验证响应状态码200…

HTTP POST表单提交接口测试

HTTP POST表单提交接口测试操作步骤:新建线程组(配置同上),添加“HTTP请求”,服务器httpbin.org,端口80,方法POST,路径/post。勾选“使用表单数据”,在参数栏添加2组数据(如username=test、password=123456)…

2025年铜陵钨杆回收公司权威推荐榜单:钨条回收/废钼回收/钼铁回收源头公司精选

在有色金属循环利用产业快速发展的背景下,钨、钼等稀有金属的回收再利用已成为资源可持续利用的重要环节。根据行业数据统计,2025年我国稀有金属回收市场规模预计突破500亿元,其中钨钼类金属因价值高、应用广,回收…

API接口测试

核心目的是在软件开发生命周琴早期发现缺陷、降低修复成本,并通过验证系统组件间的交互来提升整体稳定性、安全性和效率,尤其适用于前后端分离、微服务架构及高复杂度系统

▇壳子

#define gc getchar_unlocked template<typename T> void read(T &x) {char c = gc(); int f = 1; x = 0;while (!isdigit(c)) f = (c == - ? -f : f), c = gc();while (isdigit(c)) x = (x << 3) + …