Codeforces Round 1043 (Div. 3) D-F 题解

在这里插入图片描述

D. From 1 to Infinity

题意

有一个无限长的序列,是把所有正整数按次序拼接:123456789101112131415...\texttt{123456789101112131415...}123456789101112131415...。求这个序列前 k(k≤1015)k(k\le 10^{15})k(k1015) 位的数位和。

思路

二分出第 kkk 位是到哪个数字。

首先,需要预处理出所有 iii 位数的 位数和(注:不是数位和) 和最小的 iii 位数是多少。

// 预处理部分:
for(int i=1;i<=18;i++){digCnt[i]=9*pw(10,i-1)*i;digCnt[i]+=digCnt[i-1];// 计算前缀和数组mn[i]=pw(10,i-1);// 最小的i位数,pw函数为快速幂
}

二分部分如下:

int l=1,r=1e14;
while(l<r){int mid=l+r+1>>1;// 等价于(l+r)/2if(check(mid)>n) r=mid-1;else l=mid;
}

对于 check() 函数内部,其实就是需要返回:前 kkk 个数字拼接起来的位数,那么我们再写一个函数来计算一个数的位数。

int dig(int x){int res=0;while(x>0){x/=10; res++;}return res;
}

所以,check() 就是计算所有 <dig(x)<dig(x)<dig(x) 位数的位数和,即 digCntdig(x)−1digCnt_{dig(x)-1}digCntdig(x)1;加上最小的 dig(x)dig(x)dig(x) 位数到 xxx 的位数和,即 (x−mndig(x)+1)×dig(x)(x-mn_{dig(x)}+1)\times dig(x)(xmndig(x)+1)×dig(x),所以返回值就是 digCntdig(x)−1+(x−mndig(x)+1)×dig(x)digCnt_{dig(x)-1}+(x-mn_{dig(x)}+1)\times dig(x)digCntdig(x)1+(xmndig(x)+1)×dig(x) ,具体写法内容如下:

int check(int x){int p=dig(x);int res=digCnt[p-1]+(x-ID[p]+1)*p;return res;
}

剩下的部分就是一个模板题了:求 1∼l1\sim l1l 的数位和,就不具体解释了:

int sum(int n) {int res=0,p=1;while(p<=n){int r=n%(p*10);res+=(r/p)*(r/p-1)/2*p;res+=n/(p*10)*45*p+r/p*(r%p+1);p*=10;}return res;
}

最后,注意多出来的部分要补全。

C++ 代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
int digCnt[20],mn[20];
int pw(int a,int b){int res=1;while(b){if(b&1) res=res*a;a=a*a;b>>=1;}return res;
}
int dig(int x){int res=0;while(x>0){x/=10; res++;}return res;
}
int check(int x){int p=dig(x);int res=digCnt[p-1]+(x-mn[p]+1)*p;return res;
}
int sum(int n) {int res=0;int p=1;while(p<=n){int r=n%(p*10);res+=(r/p)*(r/p-1)/2*p;res+=n/(p*10)*45*p+r/p*(r%p+1);p*=10;}return res;
}
void solve(){int n; cin>>n;int l=1,r=1e14;while(l<r){int mid=l+r+1>>1;if(check(mid)>n) r=mid-1;else l=mid;}int ans=sum(l);int cur=check(l);if(cur<n){vector<int> x;int p=l+1;while(p>0){x.push_back(p%10);p/=10;}reverse(x.begin(),x.end());for(int i=0;i<n-cur;i++) ans+=x[i];}cout<<ans<<endl;
}
signed main(){for(int i=1;i<=18;i++){digCnt[i]=9*pw(10,i-1)*i;digCnt[i]+=digCnt[i-1];mn[i]=pw(10,i-1);}int T; cin>>T;while(T--) solve();return 0;
}

E. Arithmetics Competition

题意

有两组卡片。第一组有 nnn 张,点数为 aia_iai。第二组有 mmm 张,点数为 bib_ibi。共 qqq 次询问,每次给定 x,y,zx,y,zx,y,z。问:从第一组选择 0∼x0\sim x0x 张,第二组选择 0∼y0\sim y0y 张,并且总共选择恰好 zzz 张的情况下,点数和最大是多少?

思路

可以把这两组卡片分别排序,观察每次从第一组选出的数 ppp 的增大对总点数和的影响。发现这是一个先增后减的单峰函数。

对于单峰函数,考虑三分 ppp 的值即可。

C++ 代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=200005;
int a[maxn],b[maxn];
void solve(){int n,m,Q;cin>>n>>m>>Q;for(int i=1;i<=n;i++) cin>>a[i];for(int i=1;i<=m;i++) cin>>b[i];sort(a+1,a+1+n,greater<int>());sort(b+1,b+1+m,greater<int>());for(int i=1;i<=n;i++) a[i]+=a[i-1];for(int i=1;i<=m;i++) b[i]+=b[i-1];while(Q--){int u,v,w;cin>>u>>v>>w;int ans=a[min(u,w)]+b[max(w-u,0ll)];int l=max(w-v,0ll),r=min(u,w);while(l<r){int p=(2*l+r)/3,q=(l+2*r+2)/3;// 取三等分点,左边向下取整,右边向上取整int xx=a[p]+b[w-p],yy=a[q]+b[w-q];if(xx<yy) l=p+1;else if(xx>yy) r=q-1;else{l=p+1;r=q-1;}}ans=max(ans,a[l]+b[w-l]);if(l+1<=min(u,w)) ans=max(ans,a[l+1]+b[w-l-1]);cout<<ans<<endl;}
}
signed main(){int T; cin>>T;while(T--) solve();return 0;
}

F. Rada and the Chamomile Valley

说一句题外话,我这题挂了。死因:那天下午才学完边双,没有准备边双板子……

题意

有一个 nnn 个点 mmm 条边简单无向连通图,第 iii 条边连接 uiu_iuiviv_ivi。共 qqq 次询问,第 kkk 次询问为:求距离点 ckc_kck 最近的 [从 111 走到 nnn 的必经之边] 的编号。

思路

这个很显然,就是求边双连通分量(简称 BCC\text{BCC}BCC),然后缩点,缩完点以后一定是一颗树,需要建出这棵树。

记点 uuu 所在的 BCC 为 colucol_ucolu

在这一棵树上,找到从 col1col_1col1colncol_ncoln 的那一条路径,这条路径上的边就是所有的必经之边。把这些边标记一下。

然后,重新回到原图,求每个点到最近的必经边的距离和对应的边。从路径上的每条边所连接的点出发,跑一边 bfs\text{bfs}bfs 最短路,注意,每次只能跑未被标记的边,因为经过了标记的边也不会对答案造成影响,下次它还是重新变回 111

C++ 代码

#include<bits/stdc++.h>
#define mpr make_pair
#define pb emplace_back
using namespace std;
typedef pair<int,int> pii;
const int inf=2e9;
const int maxn=200005;
int dfn[maxn],low[maxn],bel[maxn],good[maxn],kd[maxn],to[maxn],tobel[maxn];
vector<pii> g[maxn],h[maxn],gg[maxn];
vector<int> ans,path,ansv,pathv;
pii edge[maxn],f[maxn];
bool used[maxn];
int n,m,k,cnt;
vector<int> st;
void tarjan(int u,int lst){low[u]=dfn[u]=++cnt; st.pb(u);for(auto i:g[u]){if(i.second==(lst^1)) continue;if(!dfn[i.first]){tarjan(i.first,i.second);low[u]=min(low[u],low[i.first]);}else{low[u]=min(low[u],dfn[i.first]);}}if(dfn[u]==low[u]){k++;bel[u]=k;while(st.back()!=u){bel[st.back()]=k;st.pop_back();}st.pop_back();}
}
void findpath(int u,int fa,int ed){pathv.pb(u);if(u==ed){ansv=pathv;ans=path;return;}for(auto[v,id]:h[u]){if(v!=fa){path.pb(id); findpath(v,u,ed); path.pop_back();}}pathv.pop_back();
}
void bfs(int u,int Id){vector<bool> vis(kd[bel[u]]+1,0);queue<int> q; q.push(u);vis[to[u]]=true;if(f[u].first>1) f[u]=mpr(1,Id);else f[u].second=min(Id,f[u].second);while(!q.empty()){int u=q.front(); q.pop();for(auto[v,id]:gg[u]){if(good[id]!=1){if(vis[to[v]]) continue;vis[to[v]]=true;if(f[u].first+1>f[v].first) continue;if(f[u].first+1==f[v].first){f[v].second=min(f[v].second,Id);continue;}f[v]=mpr(f[u].first+1,Id);q.push(v);}}}
}
void dfs(int u,int root){used[u]=true;tobel[u]=root;for(auto[v,id]:h[u]) if(good[id]!=1&&!used[v]) dfs(v,root);
}
void clear(){ansv.clear(); pathv.clear();ans.clear(); path.clear();k=cnt=0; st.clear();for(int i=1;i<=n;i++) dfn[i]=low[i]=bel[i]=kd[i]=to[i]=used[i]=tobel[i]=0,g[i].clear(),gg[i].clear(),h[i].clear(),f[i]=mpr(inf,inf);for(int i=1;i<=m;i++) good[i]=0;
}
void solve(){cin>>n>>m; clear();for(int i=1;i<=m;i++){int u,v; cin>>u>>v;g[u].pb(mpr(v,i<<1)); g[v].pb(mpr(u,i<<1|1));edge[i]=mpr(u,v);gg[u].pb(mpr(v,i));gg[v].pb(mpr(u,i));}for(int i=1;i<=n;i++) if(!dfn[i]) tarjan(i,-1);for(int u=1;u<=n;u++){for(auto[v,id]:gg[u]){if(bel[u]>=bel[v]) continue;h[bel[u]].pb(mpr(bel[v],id));h[bel[v]].pb(mpr(bel[u],id));}}findpath(bel[1],-1,bel[n]);sort(ans.begin(),ans.end());for(int u:ans) good[u]=1;for(int u:ansv) dfs(u,u);for(int i=1;i<=n;i++) to[i]=++kd[tobel[bel[i]]];for(int id:ans){auto[xx,yy]=edge[id];bfs(xx,id);bfs(yy,id);}int Q; cin>>Q;while(Q--){int u; cin>>u;if(f[u].second!=inf) cout<<f[u].second<<" ";else cout<<-1<<" ";}cout<<endl;
}
int main(){int T; cin>>T;while(T--) solve();return 0;
}

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

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

相关文章

【C语言16天强化训练】从基础入门到进阶:Day 7

&#x1f525;个人主页&#xff1a;艾莉丝努力练剑 ❄专栏传送门&#xff1a;《C语言》、《数据结构与算法》、C语言刷题12天IO强训、LeetCode代码强化刷题、洛谷刷题、C/C基础知识知识强化补充、C/C干货分享&学习过程记录 &#x1f349;学习方向&#xff1a;C/C方向学习者…

【AI基础:神经网络】16、神经网络的生理学根基:从人脑结构到AI架构,揭秘道法自然的智能密码

“道法自然,久藏玄冥”——人工神经网络(ANN)的崛起并非偶然,而是对自然界最精妙的智能系统——人脑——的深度模仿与抽象。从单个神经元的信号处理到大脑皮层的层级组织,从突触可塑性的学习机制到全脑并行计算的高效能效,生物大脑的“玄冥”智慧为AI提供了源源不断的灵感…

容器安全实践(一):概念篇 - 从“想当然”到“真相”

在容器化技术日益普及的今天&#xff0c;许多开发者和运维人员都将应用部署在 Docker 或 Kubernetes 中。然而&#xff0c;一个普遍存在的误解是&#xff1a;“容器是完全隔离的&#xff0c;所以它是安全的。” 如果你也有同样的想法&#xff0c;那么你需要重新审视容器安全了。…

腾讯开源WeKnora:新一代文档理解与检索框架

引言&#xff1a;文档智能处理的新范式 在数字化时代&#xff0c;企业和个人每天都面临着海量文档的处理需求&#xff0c;从产品手册到学术论文&#xff0c;从合同条款到医疗报告&#xff0c;非结构化文档的高效处理一直是技术痛点。2025年8月&#xff0c;腾讯正式开源了基于大…

C++之list类的代码及其逻辑详解 (中)

接下来我会依照前面所说的一些接口以及list的结构来进行讲解。1. list_node的结构1.1 list_node结构体list由于其结构为双向循环链表&#xff0c;所以我们在这里要这么初始化_next&#xff1a;指向链表中下一个节点的指针_prev&#xff1a;指向链表中上一个节点的指针_val&…

新能源汽车热管理仿真:蒙特卡洛助力神经网络训练

研究背景在新能源汽车的热管理仿真研究中&#xff0c;神经网络训练技术常被应用于系统降阶建模。通过这一方法&#xff0c;可以构建出高效准确的代理模型&#xff0c;进而用于控制策略的优化、系统性能的预测与评估&#xff0c;以及实时仿真等任务&#xff0c;有效提升开发效率…

第十九讲:C++11第一部分

目录 1、C11简介 2、列表初始化 2.1、{}初始化 2.2、initializer_list 2.2.1、成员函数 2.2.2、应用 3、变量类型推导 3.1、auto 3.2、decltype 3.3、nullptr 4、范围for 5、智能指针 6、STL的一些变化 7、右值引用和移动语义 7.1、右值引用 7.2、右值与左值引…

书写本体论视域下的文字学理论重构

在符号学与哲学的交叉领域&#xff0c;文字学&#xff08;Grammatologie&#xff09;作为一门颠覆性学科始终处于理论风暴的中心。自德里达1967年发表《论文字学》以来&#xff0c;传统语言学中"语音中心主义"的霸权地位遭遇根本性动摇&#xff0c;文字不再被视为语言…

为什么要做架构设计?架构设计包含哪些内容?

大家好,我是IT孟德,You can call me Aman(阿瞒,阿弥陀佛的ē,Not阿门的ā),一个喜欢所有对象(热爱技术)的男人。我正在创作架构专栏,秉承ITer开源精神分享给志同道合(爱江山爱技术更爱美人)的朋友。专栏更新不求速度但求质量(曹大诗人传世作品必属精品,请脑补一下《…

Vue2封装Axios

一、介绍Axios 是一个基于 promise 的 HTTP 库&#xff0c;简单的讲就是可以发送get、post等请求。二、安装npm install axios --save二、axios不同请求方式axios(config)这是 Axios 的核心方法&#xff0c;用于发送自定义配置的 HTTP 请求。通过传入一个包含请求配置的对象&am…

DataAnalytics之Tool:Metabase的简介、安装和使用方法、案例应用之详细攻略

DataAnalytics之Tool&#xff1a;Metabase的简介、安装和使用方法、案例应用之详细攻略 目录 Metabase的简介 1、特点 Metabase的安装和使用方法 1、安装 快速设置&#xff1a;开发环境 前端快速设置 后端快速设置 2、使用方法 Metabase的案例应用 Metabase的简介 Met…

frp v0.64.0 更新:开源内网穿透工具,最简洁教程

frp是一款跨平台的内网穿透工具&#xff0c;支持 Windows、macOS 与 Linux&#xff0c;它需要你有一台拥有固定公网 IP 的电脑&#xff0c;VPS 最好&#xff0c;然后就能愉快的进行内网穿透了。还支持 https&#xff0c;甚至可以用它进行小程序开发。Appinn v0.64.0 新增token…

【数据结构】B+ 树——高度近似于菌丝网络——详细解说与其 C 代码实现

文章目录B 树的定义B 树组织数据的方法往 B 树中插入键值对数据从 B 树中删除键值对把 B 树看作是 “真菌网络”——我理解并记忆 B 树的方法B 树的 C 代码实现初始化节点、B 树B 树节点内的二分查找B 树的数据插入操作B 树的删除数据操作范围查询与全局遍历销毁 B 树测试代码&…

01、数据结构与算法--顺序表

正式进入数据结构的学习&#xff0c;先从预备知识学起&#xff0c;戒焦戒躁戒焦戒躁...一、泛型的引入1、为什么需要泛型&#xff1f;先来看一个题目&#xff1a;实现一个类&#xff0c;类中包含一个数组成员&#xff0c;使得数组中可以存放任何类型的数据&#xff0c;也可以根…

8.23打卡 DAY 50 预训练模型+CBAM模块

DAY 50: 预训练模型与 CBAM 模块的融合与微调 今天&#xff0c;我们将把之前学到的知识融会贯通&#xff0c;探讨如何将 CBAM 这样的注意力模块应用到强大的预训练模型&#xff08;如 ResNet&#xff09;中&#xff0c;并学习如何高效地对这些模型进行微调&#xff0c;以适应我…

北极圈边缘生态研究:从数据采集到分析的全流程解析

原文链接&#xff1a;https://onlinelibrary.wiley.com/doi/10.1111/1744-7917.70142?afR北极圈边缘生态研究&#xff1a;从数据采集到分析的全流程解析简介本教程基于一项在俄罗斯摩尔曼斯克州基洛夫斯克市开展的长期生态学研究&#xff0c;系统讲解如何对高纬度地区特定昆虫…

Excel处理控件Aspose.Cells教程:使用Python将 Excel 转换为 NumPy

使用 Python 处理 Excel 数据非常常见。这通常涉及将数据从 Excel 转换为可高效操作的形式。将 Excel 数据转换为可分析的格式可能非常棘手。在本篇教程中&#xff0c;您将学习借助强大Excel处理控件Aspose.Cells for Python&#xff0c;如何仅用几行代码将 Excel 转换为 NumPy…

python 字典有序性的实现和OrderedDict

文章目录 一、Python 3.7+ 字典有序性的验证 二、如何在字典头部插入键值对 方法 1:创建新字典(推荐) 方法 2:使用 `collections.OrderedDict`(适合频繁头部插入场景) 方法 3:转换为列表操作(不推荐,效率低) 底层核心结构:双数组哈希表 有序性的实现原理 与旧版本(…

JVM 调优全流程案例:从频繁 Full GC 到百万 QPS 的实战蜕变

&#x1f525; JVM 调优全流程案例&#xff1a;从频繁 Full GC 到百万 QPS 的实战蜕变 文章目录&#x1f525; JVM 调优全流程案例&#xff1a;从频繁 Full GC 到百万 QPS 的实战蜕变&#x1f9e9; 一、调优本质&#xff1a;性能瓶颈的破局之道&#x1f4a1; 为什么JVM调优如此…

基于TimeMixer现有脚本扩展的思路分析

文章目录1. 加入数据集到data_loader.py和data_factory.py2. 参照exp_classification.py写自定义分类任务脚本&#xff08;如exp_ADReSS.py&#xff09;3. 接一个MLP分类头4. 嵌入指标计算、绘图、保存训练历史的函数5. 开始训练总结**一、可行性分析****二、具体实现步骤****1…