2023ICPC杭州题解

article/2025/8/3 20:03:46

文章目录

  • M. V图(签到)
  • J. 神秘树(交互)
  • G. 控制贪吃蛇(最短路)
  • D. 运算符优先级(构造)
  • H. 甜蜜的修噶 II(概率)
  • B. 节日装饰(bitset+根号分治)
  • F. Top Cluster(LCA+动态维护树的直径)

题目链接

M. V图(签到)

在这里插入图片描述

int cmp(int x1,int y1,int x2,int y2){int x=x1*y2,y=x2*y1;if(x>y)return 1;if(x<y)return -1;return 0;
}
void solve(){int n;cin>>n;vector<int> a(n+1);int x=-1,s=0;for(int i=1;i<=n;i++){cin>>a[i];}for(int i=2;i<n;i++){if(a[i]<a[i-1]&&a[i]<a[i+1]){x=i;break;}}int fz=0,fm=0;int ans=0,res=0;for(int i=1;i<=x;i++)s+=a[i];fz=s+a[x+1],fm=x+1;for(int i=x+2;i<=n;i++){s+=a[i];if(cmp(fz,fm,s,i)<0)fz=s,fm=i;}ans=fz,res=fm;s=0;for(int i=x-1;i<=n;i++)s+=a[i];fz=s,fm=n-x+2;int j=n-x+2;for(int i=x-2;i>=1;i--){j++;s+=a[i];if(cmp(fz,fm,s,j)<0)fz=s,fm=j;}if(cmp(ans,res,fz,fm)<0)ans=fz,res=fm;cout<<setprecision(12)<<fixed<<1.0*ans/res<<"\n";
}	

J. 神秘树(交互)

在这里插入图片描述
首先询问 ( 1 , 2 ) ( 3 , 4 ) , . . . , ( n − 1 , n ) (1,2)(3,4),...,(n-1,n) (1,2)(3,4),...,(n1,n) n 2 \frac{n}{2} 2n种,如果都不存在,那么必然不是菊花(一个菊花的中心点必然与对应的另一个点有一条边,对应着上面询问至少有一条边存在)

然后需要 3 3 3次操作内问出来

假设存在边 ( u , v ) (u,v) (u,v),因为 n ≥ 4 n \geq 4 n4,假设另外两个点为 a , b a,b a,b,询问 ( u , a ) , ( v , a ) (u,a),(v,a) (u,a),(v,a),这两条边只有一条存在;如果都不存在必然是链

假设存在的是 ( u , a ) (u,a) (u,a),那么询问 ( u , b ) (u,b) (u,b),如果存在就是菊花,否则为链

G. 控制贪吃蛇(最短路)

在这里插入图片描述

  • 算出初始蛇身的每个点,蛇尾恰好离开该点的时刻
  • 那么跑dijk的时候,只要到当前点的时刻大于等于蛇尾离开的时刻,就是可达的
  • 统计答案用unsigned long long即可
  • 复杂度 O ( n m log ⁡ ( n m ) ) O(nm \log (nm)) O(nmlog(nm))
int n,m,k;
char a[N][N];
int dx[]={-1,0,1,0};
int dy[]={0,1,0,-1};
void solve(){cin>>n>>m>>k;vector<vector<int>> dis(n+1,vector<int>(m+1,INF)),len(n+1,vector<int>(m+1));int sx=0,sy=0;for(int i=1;i<=k;i++){int x,y;cin>>x>>y;len[x][y]=i;if(i==1)sx=x,sy=y;}for(int i=1;i<=n;i++){for(int j=1;j<=m;j++)cin>>a[i][j];}priority_queue<array<int,3>,vector<array<int,3>>,greater<>> pq;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++)dis[i][j]=INF;}vector<vector<int>> vis(n+1,vector<int>(m+1));pq.push({0,sx,sy});dis[sx][sy]=0;while(!pq.empty()){auto [d,x,y]=pq.top();pq.pop();if(vis[x][y])continue;vis[x][y]=1;for(int i=0;i<4;i++){int tx=x+dx[i],ty=y+dy[i];if(tx>=1&&tx<=n&&ty>=1&&ty<=m&&a[tx][ty]!='#'){int dd=d+1;if(len[tx][ty])dd=max(dd,k-len[tx][ty]+1);if(dis[tx][ty]>dd){dis[tx][ty]=dd;pq.push({dis[tx][ty],tx,ty});}}}}unsigned long long ans=0;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){if(dis[i][j]==INF)continue;// cout<<i<<" "<<j<<" "<<dis[i][j]<<"\n";ans+=dis[i][j]*dis[i][j];}}cout<<ans<<"\n";
}	

D. 运算符优先级(构造)

在这里插入图片描述
中间项用-1 2构造即可

void solve(){int n;cin>>n;n*=2;vector<int> a(n+1);for(int i=2;i<n;i++){if(i&1)a[i]=-1;else a[i]=2;}a[n]=1;int s=0;for(int i=3;i<=n;i+=2)s+=a[i]*a[i+1];a[1]=-s;for(int i=1;i<=n;i++)cout<<a[i]<<" \n"[i==n];
}

H. 甜蜜的修噶 II(概率)

在这里插入图片描述

  • 如果 a i < a b i a_i \lt a_{b_i} ai<abi事件必然发生
  • 如果 a i ≤ a b i + w b i a_i \leq a_{b_i}+w_{b_i} aiabi+wbi事件必然不发生
  • 否则设距离它最近的可能发生的点的距离为 L i L_i Li,则概率为 1 L i ! \frac{1}{L_i!} Li!1,可以看作全排列中的一个排列的概率
  • 首先拓扑判环,如果有环,环内部事件都不可能发生
  • 复杂度 O ( n ) O(n) O(n)
int qpow(int a,int b){int ans=1;for(;b;b>>=1){if(b&1)ans=ans*a%mod;a=a*a%mod;}return ans;
}
void solve(){int n;cin>>n;vector<int> a(n+1),b(n+1),w(n+1),dep(n+1),adj(n+1),din(n+1),fac(n+1),p(n+1,-1);fac[0]=1;for(int i=1;i<=n;i++)fac[i]=fac[i-1]*i%mod;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];for(int i=1;i<=n;i++){if(a[i]<a[b[i]])dep[i]=1,p[i]=1;else if(a[i]>=a[b[i]]+w[b[i]])dep[i]=p[i]=0;else{adj[i]=b[i];din[b[i]]++;}}queue<int> q;for(int i=1;i<=n;i++){if(!din[i])q.push(i);}	while(!q.empty()){auto u=q.front();q.pop();int v=adj[u];if(--din[v]==0)q.push(v);}for(int i=1;i<=n;i++){if(din[i]){dep[i]=p[i]=0;}}function<void(int)> dfs=[&](int u){if(p[u]!=-1)return;int v=adj[u];if(!v)return;dfs(v);if(p[v]>0){dep[u]=dep[v]+1;p[u]=qpow(fac[dep[u]],mod-2);}else{p[u]=0;}};for(int i=1;i<=n;i++){dfs(i);}for(int i=1;i<=n;i++)cout<<(a[i]+p[i]*w[i]%mod)%mod<<" \n"[i==n];
}	

B. 节日装饰(bitset+根号分治)

在这里插入图片描述

  • 首先有一个bitset的暴力做法
  • 对每个颜色开一个bitset记录对应的位置
  • 然后枚举每个位置,对于每个位置,我们可以用总的bitset异或当前颜色的bitset求出与当前颜色不同的位置,然后 O ( N ω ) O(\frac{N}{\omega}) O(ωN)枚举这些位置判断
  • 但是这样空间复杂度是 O ( 500 3 ) O(500^3) O(5003)会爆空间
  • 因为题目中每个位置颜色不一样,设 c n t i cnt_i cnti为颜色个数,则 ∑ c n t i = n \sum cnt_i=n cnti=n
  • 考虑根号分治,
  • 对于颜色位置数小于等于 n \sqrt n n 的,直接暴力
  • 对于大于 n \sqrt n n 的,这样的颜色数量小于 n \sqrt n n ,预处理出来
  • 这样时间复杂度为 O ( n ( n + n ω ) ) O(n(\sqrt n+\frac{n}{\omega})) O(n(n +ωn)),空间复杂度为 O ( n n ω ) O(\frac{n\sqrt n}{\omega}) O(ωnn )
  • 在更新答案时,我们需要剪枝,每个位置只更新一次答案,bitset数组开在外面
const int N=250010,sq=510;
bitset<N> bs[501],all,tmp,que;
void solve(){int n,q;cin>>n>>q;vector<int> pos[n+1],id(n+1,-1),X(n+1),C(n+1);for(int i=1;i<=n;i++){cin>>X[i]>>C[i];pos[C[i]].push_back(X[i]);all.set(X[i]);}int cnt=0;int idx=0;for(int i=1;i<=n;i++){if(pos[i].size()>=sq){for(auto x:pos[i])bs[idx].set(x);id[i]=idx++;}}vector<int> ans(N+1),D(q+1);for(int i=1;i<=q;i++){cin>>D[i];que.set(D[i]);}for(int i=1;i<=n;i++){if(id[C[i]]==-1)for(auto x:pos[C[i]])all.flip(x);else all^=bs[id[C[i]]];tmp=que&(all>>X[i]);for(int j=tmp._Find_first();j<N;j=tmp._Find_next(j)){ans[j]=i;que.reset(j);}if(id[C[i]]==-1)for(auto x:pos[C[i]])all.flip(x);else all^=bs[id[C[i]]];}for(int i=1;i<=q;i++){cout<<ans[D[i]]<<"\n";}
}

F. Top Cluster(LCA+动态维护树的直径)

在这里插入图片描述

  • 看到mex想到二分答案,可以先对w排个序,可以预处理出前缀mex,二分出来的答案就是当前前缀的mex,check函数转化为求[1-mid]的点到达x的距离<=k
  • 那么只要最大值小于等于k,一个经典的trick,一个点到达子树的最大值一定是该子树直径的其中一个端点
  • 另一个经典的trick就是,假设当前直径为 u , v u,v u,v,新加入一个点 x x x,直径如果改变,只会是 u , x u,x u,x或者 v , x v,x v,x,实际上和上面的结论本质是一个道理
  • 因此我们预处理出前缀直径,查询的时候check, d i s t ( u , x ) ≤ k dist(u,x) \leq k dist(u,x)k d i s t ( v , x ) ≤ k dist(v,x) \leq k dist(v,x)k即可
  • 查询dist的时候可以用欧拉序预处理,达到 O ( 1 ) O(1) O(1)查询,减少一个log
  • 复杂度 O ( ( n + q ) log ⁡ n ) O((n+q)\log n) O((n+q)logn)
int dep[N],seq[N<<1],fir[N],dfc;
vector<PII> adj[N];
void dfs(int u,int fa){seq[++dfc]=dep[u];fir[u]=dfc;for(auto [v,c]:adj[u]){if(v==fa)continue;dep[v]=dep[u]+c;dfs(v,u);seq[++dfc]=dep[u];}
}
int st[N<<1][30];
void init(){for(int i=1;i<=dfc;i++)st[i][0]=seq[i];for(int j=1;j<30;j++){for(int i=1;i+(1<<j)-1<=dfc;i++)st[i][j]=min(st[i][j-1],st[i+(1<<j-1)][j-1]);}
}
int query(int l,int r){int k=__lg(r-l+1);return min(st[l][k],st[r-(1<<k)+1][k]);
}
int dist(int u,int v){if(fir[u]>fir[v])swap(u,v);return dep[u]+dep[v]-2*query(fir[u],fir[v]);
}
void solve(){   int n,q;cin>>n>>q;vector<PII> w(n+1);vector<int> ans(n+1);for(int i=1;i<=n;i++){cin>>w[i].F;w[i].S=i;}for(int i=1;i<n;i++){int u,v,w;cin>>u>>v>>w;adj[u].push_back({v,w});adj[v].push_back({u,w});}sort(w.begin()+1,w.end());dfs(1,0);init();vector<PII> D(n+1);map<int,int> vis;int mex=0;for(int i=1;i<=n;i++){vis[w[i].F]=i;while(vis.count(mex))mex++;ans[i]=mex;if(i==1)D[i]={w[i].S,w[i].S};else{D[i]=D[i-1];auto [x,y]=D[i];auto xx=w[i].S;int dis1=dist(x,xx),dis2=dist(y,xx),dis3=dist(x,y);if(dis1>=dis2&&dis1>=dis3)D[i]={x,xx};else if(dis2>=dis1&&dis2>=dis3)D[i]={y,xx};else D[i]={x,y};}}while(q--){int x,k;cin>>x>>k;int l=0,r=n;auto check=[&](int mid){auto [u,v]=D[mid];return dist(u,x)<=k&&dist(v,x)<=k;};while(l<r){int mid=l+r+1>>1;if(check(mid))l=mid;else r=mid-1;}cout<<ans[l]<<"\n";}
}

http://www.hkcw.cn/article/rIdlHQwkvB.shtml

相关文章

图文详解Java并发面试题

文章目录 1、并发与并行2、线程安全3、线程、进程、协程4、线程间通信5、线程创建方式6、8G内存创建的线程数7、普通Java程序含有的线程8、start()、run()9、线程调度、6种状态、强制停止线程、上下文切换10、守护线程、用户线程11、 volatile 、synchronized12、sleep() 、 wa…

文档核心结构优化(程序C++...)

文档核心结构优化 一、文档核心结构优化二、C关键特性详解框架2.1 从C到C的范式迁移 三、深度代码解析模板3.1 现代C特性分层解析 四、C vs C 关键差异矩阵五、交互式文档设计策略5.1 三维学习路径5.2 代码缺陷互动区 六、现代C特性演进图七、性能优化可视化呈现&#xff08;深…

Python打卡训练营Day42

DAY 42 Grad-CAM与Hook函数 知识点回顾 回调函数lambda函数hook函数的模块钩子和张量钩子Grad-CAM的示例 作业&#xff1a;理解下今天的代码即可 import torch import torch.nn as nn import torch.nn.functional as F import torchvision import torchvision.transforms as tr…

Redis 架构设计

找实习中。。。学项目学到redis&#xff0c;又偶然看了个拓展的。是得物的Redis设计&#xff0c;拿出来分享了。 文章地址&#xff0c;https://mp.weixin.qq.com/s/dnlxCXgAxHsfyVNYTDsewA 话说&#xff0c;架构师就是干这种工作的吗&#xff1f; 插曲 才知道这么念&#xff…

振动力学:无阻尼单自由度系统

单自由度振动系统是最简单的一类振动系统,仅用一个坐标就可描述。从力学角度分析,一个实际的振动系统可由三个元件组成:惯性质量、弹性、阻尼,,它们分别描述系统的惯性、弹性、能耗机制。惯性元件是运动的实体,弹性元件提供振动回复力,阻尼元件在振动过程中消耗或吸收外界…

LangChain-结合智谱AI大模型实现自定义tools应用实例

准备: 1.可供调用的实时查询天气的接口: 百度天气接口:https://lbsyun.baidu.com/faq/api?title=webapi/weather/base(没有可以去注册用户实名认证后即可免费使用) 可以使用接口工具ApiPost调用,验证接口是否正常 2.一个csv文件,文件内容中包含各个省市区的行政编码 …

DAY 34 超大力王爱学Python

CPU性能的查看&#xff1a;看架构代际、核心数、线程数GPU性能的查看&#xff1a;看显存、看级别、看架构代际GPU训练的方法&#xff1a;数据和模型移动到GPU device上类的call方法&#xff1a;为什么定义前向传播时可以直接写作self.fc1(x) ps&#xff1a;在训练过程中可以在命…

BLIP-2

目录 摘要 Abstract BLIP-2 模型框架 预训练策略 模型优势 应用场景 实验 代码 总结 摘要 BLIP-2 是一种基于冻结的图像编码器和大型语言模型的高效视觉语言预训练模型&#xff0c;由 Salesforce 研究团队提出。它在 BLIP 的基础上进一步优化&#xff0c;通过轻量级…

通过WiFi无线连接小米手机摄像头到电脑的方法

通过WiFi无线连接小米手机摄像头到电脑的方法 以下是基于Scrcpy和DroidCam两种工具的无线连接方案&#xff0c;需提前完成开发者模式与USB调试的开启&#xff08;参考原教程步骤&#xff09;&#xff1a; 方法一&#xff1a;Scrcpy无线投屏&#xff08;无需手机端安装&#xf…

8088 单板机 NMI 中断程序示例 (脱离 DOS 环境)

求组DeepSeek给的将要进行的8088单板机NMI中断编程示例。 /* nmidemo.c - 8088 单板机 NMI 中断演示程序 */ /* 脱离 DOS 环境&#xff0c;直接运行在裸机上 */ /* 使用 Digital Mars C 编译器&#xff0c;TINY 模式编译 *//* 硬件配置假设:- 8088 CPU 4.77MHz- 8255 PPI (可…

详解鸿蒙开发如何上传三方库到ohpm仓库

前两天幽蓝君在ohpm仓库上传了自己的第一个三方库&#xff0c;完整体验了一下ohpm的上传流程&#xff0c;感觉还是比较繁琐的&#xff0c;所以把上传流程和一些注意事项分享给大家。 先介绍一下怎么开发一个三方库&#xff0c;在项目名称右键&#xff0c;新建Module&#xff0…

PHP与MYSQL结合中中的一些常用函数,HTTP协议定义,PHP进行文件编程,会话技术

MYSQL&#xff1a; 查询函数: 执行查询语句: 1.mysql_query("SQL语法"); 凡是执行操作希望拿到数据库返回的数据进行展示的(结果返回: 数据结果); 2.执行结果的处理:成功为结果集&#xff0c;失败为false; 成功返回结果:SQL指令没有错误&#xff0c;但是查询结果…

[Protobuf]常见数据类型以及使用注意事项

[Protobuf]常见数据类型以及使用注意事项 水墨不写bug 文章目录 一、基本数据类型1、字段2、字段的修饰规则 二、自定义数据类型1、message类型2、enum类型3、Any类型4、oneof类型5、map类型 三、小工具1.hexdump2.decode 四、注意事项 一、基本数据类型 protobuf 支持多种基础…

邂逅Webpack和打包过程

前端开发方向 目前国内的前端开发 主要使用Vue和React 一般你写个项目&#xff0c;过程就是&#xff1a;npm/yarn --> webpack架构 --> Vue/React框架 而针对Vue和React都有脚手架的&#xff0c;脚手架是基于webpack搭建的 你写.jsx或者ts之类的浏览器是不认识的&…

计算机网络第1章(下):网络性能指标与分层模型全面解析

目录 一、计算机网络的性能指标1.1 性能指标1&#xff1a;速率1.2 性能指标2&#xff1a;带宽1.3 性能指标3&#xff1a;吞吐量1.4 性能指标4&#xff1a;时延1.5 性能指标5&#xff1a;时延带宽积1.6 性能指标6&#xff1a;往返时延1.7 性能指标7&#xff1a;信道利用率 二、计…

多模态大语言模型arxiv论文略读(102)

Chat2Layout: Interactive 3D Furniture Layout with a Multimodal LLM ➡️ 论文标题&#xff1a;Chat2Layout: Interactive 3D Furniture Layout with a Multimodal LLM ➡️ 论文作者&#xff1a;Can Wang, Hongliang Zhong, Menglei Chai, Mingming He, Dongdong Chen, Ji…

python学习打卡day42

DAY 42 Grad-CAM与Hook函数 知识点回顾 回调函数lambda函数hook函数的模块钩子和张量钩子Grad-CAM的示例 作业&#xff1a;理解下今天的代码即可 1.回调函数 Hook本质是回调函数&#xff0c;所以我们先介绍一下回调函数 回调函数是作为参数传递给其他函数的函数&#xff0…

VeriFree:无需Verifier的通用RL框架

文章目录 前言1. 研究背景与挑战1.1 传统强化学习框架&#xff08;RLVR&#xff09;的领域局限性1.2 引入LLM作为验证器的新挑战1.3 研究目标的提出 2. VeriFree方法核心原理2.1 问题定义与形式化建模2.2 核心思想&#xff1a;隐式验证与概率最大化2.3 训练技术细节 3. 实验4. …

uniapp uni-id 如果是正式项目,需自行实现发送邮件的相关功能

(3) 使用云对象sendEmailCode 发送邮箱验证码&#xff0c;报错送邮箱验证码失败 Error: 已启动测试模式&#xff0c;直接使用&#xff1a;123456作为邮箱验证码即可。 如果是正式项目&#xff0c;需自行实现发送邮件的相关功能 - DCloud问答 uni-id 没有实现邮箱验证码逻辑&am…

HiEV独家 | 整合智能化战线,奇瑞辅助驾驶驶向何方?

作者 |德新 编辑 |王博 组织调整是战略变革的映射&#xff0c;而战略变革最终要在产品上体现。 5月30日&#xff0c;奇瑞汽车官宣整合旗下雄狮科技、大卓智能与研发总院相关业务&#xff0c;成立「智能化中心」。智能化中心下设有智能座舱、智能辅助驾驶、电子电气架构等子中…