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)(x?mndig(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?+(x?mndig(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_iui?viv_ivi?。共 qqq 次詢問,第 kkk 次詢問為:求距離點 ckc_kck? 最近的 [從 111 走到 nnn 的必經之邊] 的編號。

思路

這個很顯然,就是求邊雙連通分量(簡稱 BCC\text{BCC}BCC),然后縮點,縮完點以后一定是一顆樹,需要建出這棵樹。

記點 uuu 所在的 BCC 為 colucol_ucolu?

在這一棵樹上,找到從 col1col_1col1?colncol_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
英文地址,請注明出處:http://en.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…