AtCoder Beginner Contest 355 A~F

A.Who Ate the Cake?(思維)

題意

已知有三個嫌疑人,有兩個證人,每個證人可以指出其中一個嫌疑人不是罪犯,如果可以排除兩個嫌疑人來確定犯人,輸出犯人的身份,如果無法確定,輸出"-1"

分析

如果輸入兩個人的編號相同,則無法確定犯人,如果不同,則 6 ? A ? B 6 - A - B 6?A?B為犯人的編號。

代碼

#include <bits/stdc++.h>
using namespace std;void solve() {int a, b;cin >> a >> b;if (a == b) cout << -1 << endl;else cout << 6 - a - b << endl;
}
int main () {solve();return 0;
}

B.Piano 2(桶數組)

題意

給出一個包含 n n n個數字的數組 A A A以及一個包含 m m m個數字的數組 B B B,將 A A A數組和 B B B數組中的數字放入數組 C C C中,并對放入的數字進行排序。

問:數組 C C C中是否存在相鄰兩項,這兩項均屬于數組 A A A(保證數組 A A A和數組 B B B中所有數字均是獨立的,即不會出現相同的數字)。

分析

使用標記數組對出現在 A A A數組中的數字進行標記,然后將數組 A A A和數組 B B B中元素放入vector中并排序。

然后依次檢查vector中相鄰兩項是否均被標記,如果均被標記,輸出Yes,如果結束循環還是沒找到,輸出No

代碼

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 3e5 + 5e2;int n, m,a[N], b[N], vis[N];
vector<int> C;void solve() {cin >> n >> m;for (int i = 1; i <= n; i++) {cin >> a[i];C.emplace_back(a[i]);vis[a[i]] = 1;}for (int i = 1; i <= m; i++) {cin >> b[i];C.emplace_back(b[i]);}sort(C.begin(), C.end());for (int i = 1; i < n + m; i++) {if (vis[C[i - 1]] == 1 && vis[C[i]] == 1) {cout << "Yes" << endl;return;}}cout << "No" << endl;
}
int main () {solve();return 0;
}

C.Bingo 2(模擬)

題意

給出一個 N × N N \times N N×N的網格,將對這個網格執行 T T T個回合操作,每個回合會選擇網格上的一個點(使用一個數字代表坐標)進行標記。

當滿足以下幾種條件之一,即獲得了勝利:

  • 存在某一行上所有的格子均被標記

  • 存在某一列上所有的格子均被標記

  • 兩條對角線上所有的格子均被標記

問:最早執行多少個回合后,就贏下了這場比賽,如果結束所有操作后還未獲勝,輸出-1.

分析

為了便于處理,將輸入的數字 A i A_i Ai?先減去 1 1 1,然后通過 A i / n , A i A_i / n, A_i Ai?/n,Ai? % n n n的方式即可得到行號和列號(此時的行號和列號從 0 0 0開始)。

然后考慮三個條件怎么進行判斷:

  • 行和列:使用數組記錄每行每列被標記的節點數量

  • 主對角線:主對角線元素行號和列號均相等,判斷當前網格的行號和列號,如果相同即進行標記

  • 副對角線:副對角線的行列號之和為 n ? 1 n - 1 n?1,判斷當前網格的行列號之和是否為 n ? 1 n - 1 n?1,如果是就進行標記

每輪標記完成后,判斷是否滿足以上三個條件,如果滿足則輸出當前輪次,并結束程序。

如果循環正常結束,輸出-1

代碼

#include <bits/stdc++.h>
using namespace std;
const int N = 3e5 + 5e2;int n, k, r[N], c[N], d[5], a[N];void solve() {cin >> n >> k;for (int i = 1; i <= k; i++) {cin >> a[i];a[i]--;int row = a[i] / n, colum = a[i] % n;r[row]++;c[colum]++;if (row == colum) d[0]++;if (row + colum == n - 1) d[1]++;if (r[row] == n || c[colum] == n || d[0] == n || d[1] == n) {cout << i << endl;return;}}cout << -1 << endl;
}
int main () {solve();return 0;
}

D.Intersecting Intervals(雙指針)

題意

給出 N N N個區間 [ l i , r i ] [l_i, r_i] [li?,ri?],問存在多少對區間相交。

分析

考慮相交比較困難,但考慮不相交就很容易了。

不難想到,只要是右邊界小于當前區間的左邊界的所有區間,那么必然不會與當前區間相交,此時不在乎這個區間的左邊界到底是多少,因此,可以使用兩個數字存儲左右邊界,并單獨對兩個數組排序。

然后從小往大遍歷左邊界數組,使用雙指針在右邊界數組中維護所有小于當前左邊界的數量,這個數量就是不會與當前區間相交的區間數量。

使用區間總對數減去每個區間不會相交的區間數量即可。

hint: 本題 n n n較大,需要使用long long類型存儲答案。

代碼

#include <bits/stdc++.h>
using namespace std;
const int N = 5e5 + 5e2;int l[N], r[N]; void solve() {ll n;cin >> n;for (int i = 0; i < n; i++) {cin >> l[i] >> r[i];}sort(l, l + n);sort(r, r + n);int j = 0;ll ans = (n - 1) * n / 2;for (int i = 0; i < n; i++) {while (r[j] < l[i]) {j++;}ans -= j;}cout << ans << endl;
}
int main () {solve();return 0;
}

E.Guess the Sum(BFS)

題意

本題是一個交互題

給出一個數字 N N N和區間 l , r l, r l,r,題目隱藏了一個數組 A = ( A 0 , A 1 , … , A 2 n ? 1 A = (A_0, A_1, \ldots, A_{2^{n} - 1} A=(A0?,A1?,,A2n?1?,你的目標是知道 ( A l + A l + 1 + … + A r ) (A_l + A_{l + 1} + \ldots + A_{r}) (Al?+Al+1?++Ar?) % 100 100 100的結果。

你可以按以下要求進行詢問:

  • 選擇兩個非負整數 i , j i, j i,j,需要保證 2 i ( j + 1 ) ≤ 2 N 2^{i}(j + 1) \le 2^{N} 2i(j+1)2N,然后取 L = 2 i j , R = 2 i ( j + 1 ) ? 1 L = 2^{i}j, R = 2^{i}(j + 1) - 1 L=2ij,R=2i(j+1)?1,將 i , j i, j i,j告訴題目后,題目會返回 ( A L + A L + 1 + … + A R ) (A_L + A_{L + 1} + \ldots + A_{R}) (AL?+AL+1?++AR?) % 100 100 100的結果

你需要在保證詢問次數最小的情況下,找到要求的答案。

分析

由于可以通過查詢大區間減去小區間的方式獲得結果,因此直接通過倍增的方式進行查找不能保證操作次數最少。

例:當要查詢的區間為 2 k ~ 2 k + 1 ? 2 2^{k} \sim 2^{k + 1} - 2 2k2k+1?2時,通過查詢區間 2 k ~ 2 k + 1 ? 1 2^{k} \sim 2^{k + 1} - 1 2k2k+1?1減去區間 2 k + 1 ? 1 ~ 2 k + 1 ? 1 2^{k + 1} - 1 \sim 2^{k + 1} - 1 2k+1?12k+1?1的方式只需要兩次詢問,而直接使用倍增進行詢問所需的次數無法保證兩次詢問即查詢完整個區間數字總和。

因此,可以將本題中所有可能的詢問包含的兩個點之間建雙向邊,那么問題就被轉化為了 L ~ R + 1 L \sim R + 1 LR+1之間的最短路(這里為什么取 R + 1 R + 1 R+1呢?因為當移動到 R + 1 R + 1 R+1時,才能保證第 R R R個元素也被計算到了),使用 B F S BFS BFS搜索最短路,然后通過記錄的移動步數反推出最短路徑,將最短路徑上經過的所有路徑上的連接的點作為詢問,即可獲得最后的答案。

hint: 注意最優走法并不一定都是從左往右走的,可能通過先向右走一大步再回頭的方式完成,對于往回走的詢問,需要從結果中減去。

代碼

#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 5e2;
int ask(int i, int j) {int sign = 1;if (i > j) {swap(i, j);sign *= -1;}int l = log2(j - i), r = i >> l;cout << "? " << l << ' ' << r << endl;cout.flush();int ans;cin >> ans;return sign * ans;
}
int n, l, r, dist[N];
vector<int> G[N];queue<int> Q;
void bfs(int start) {Q.push(start);dist[start] = 1;while (!Q.empty()) {int u = Q.front();Q.pop();for (auto v : G[u]) {if (dist[v] == 0) {dist[v] = dist[u] + 1;Q.push(v);}}}
}void solve() {cin >> n >> l >> r;r++;for (int i = 0; i <= n; i++) {for (int j = 0; j < (1 << n); j += (1 << i)) {G[j].push_back(j + (1 << i));G[j + (1 << i)].push_back(j);}}bfs(l);int ans = 0;while (r != l) {for (auto v : G[r]) {if (dist[r] == dist[v] + 1) {ans = (ans + ask(v, r) + 100) % 100;r = v;break;}}}cout << "! " << ans << endl;
}int main () {solve();return 0;
}

F.MST Query(并查集)

題意

給出一個包含 N N N個點和 N ? 1 N - 1 N?1條邊的帶權無向連通圖,你將對這個圖進行 Q Q Q次操作,每次的操作如下:

  • 給出三個數字 u i , v i , w i u_i, v_i, w_i ui?,vi?,wi?,在點 u i u_i ui? v i v_i vi?之間連一條邊權為 w i w_i wi?的邊。

  • 計算當前圖上的最小生成樹權值

分析

由于圖上邊權的范圍很小 ( w i ≤ 10 ) (w_i \le 10) (wi?10),因此,可以維護權值為 1 ~ 10 1 \sim 10 110 10 10 10張圖,每張圖上邊權相等。

將每次加邊操作視為往對應邊權(以及更高的邊權)的圖上建邊,如果建邊之前該圖上這兩個點不屬于同一個集合,那么當前邊建立后,最小生成樹的權值就會減少,減少多少呢?就得看最低多少權值,對應的圖上這兩個點才屬于同一個集合。

從當前權值開始遍歷到 10 10 10,執行到第一個連通的權值對應的圖后,即可從維護的權值中減去這個遍歷到的權值,然后加上當前建邊的權值,即得到了最新的最小生成樹權值。

hint: 每次建邊時,需要在所有權值大于等于當前邊權的圖中建邊。

代碼

#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5e2;int n, q, f[15][N];int find(int w, int x) {return f[w][x] == x ? x : f[w][x] = find(w, f[w][x]);
}int merge(int u, int v, int w) {int fu = find(w, u),fv = find(w, v);if (fu == fv) return 1;f[w][fu] = fv;return 0;
}void solve() {cin >> n >> q;for (int i = 1; i <= n; i++) {for (int j = 0; j <= 10; j++) {f[j][i] = i;}}int sum = 0;for (int i = 1; i < n; i++) {int u, v, w;cin >> u >> v >> w;for (int j = w; j <= 10; j++) {merge(u, v, j);}sum += w;}while (q--) {int u, v, w;cin >> u >> v >> w;sum += w;for (int j = w; j <= 10; j++) {if (merge(u, v, j)) {sum -= j;break;}}cout << sum << endl;}
}int main () {solve();return 0;
}

賽后交流

在比賽結束后,會在交流群中給出比賽題解,同學們可以在賽后查看題解進行補題。

群號: 704572101,賽后大家可以一起交流做題思路,分享做題技巧,歡迎大家的加入。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/16063.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/16063.shtml
英文地址,請注明出處:http://en.pswp.cn/web/16063.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

AT_abc351_c [ABC351C] Merge the balls 題解

題目傳送門 題目大意 你有一個空序列和 N N N 個球。第 i i i 個球 ( 1 ≤ i ≤ N ) (1 \leq i \leq N) (1≤i≤N) 的大小是 2 A i 2^{A_i} 2Ai?。 計算 N N N 操作后序列中剩余的球的個數。 你將進行 N N N 次運算。 在第 i i i 次操作中&#xff0c;你將第 i i…

springboot + Vue前后端項目(第十一記)

項目實戰第十一記 1.寫在前面2. 文件上傳和下載后端2.1 數據庫編寫2.2 工具類CodeGenerator生成代碼2.2.1 FileController2.2.2 application.yml2.2.3 攔截器InterceptorConfig 放行 3 文件上傳和下載前端3.1 File.vue頁面編寫3.2 路由配置3.3 Aside.vue 最終效果圖總結寫在最后…

TabAttention:基于表格數據的條件注意力學習

文章目錄 TabAttention: Learning Attention Conditionally on Tabular Data摘要方法實驗結果 TabAttention: Learning Attention Conditionally on Tabular Data 摘要 醫療數據分析通常結合成像數據和表格數據處理&#xff0c;使用機器學習算法。盡管先前的研究探討了注意力…

Hudi 多表攝取工具 HoodieMultiTableStreamer 配置方法與示例

博主歷時三年精心創作的《大數據平臺架構與原型實現&#xff1a;數據中臺建設實戰》一書現已由知名IT圖書品牌電子工業出版社博文視點出版發行&#xff0c;點擊《重磅推薦&#xff1a;建大數據平臺太難了&#xff01;給我發個工程原型吧&#xff01;》了解圖書詳情&#xff0c;…

vue3添加收藏網站頁面

結構與樣式 <template><div class"web_view"><ul><li v-for"web in webList" :key"web.title"><a :href"web.src" :title"web.title" target"_blank"><img :src"web.img&…

微信小程序基礎 -- 小程序UI組件(5)

小程序UI組件 1.小程序UI組件概述 開發文檔&#xff1a;https://developers.weixin.qq.com/miniprogram/dev/framework/view/component.html 什么是組件&#xff1a; 組件是視圖層的基本組成單元。 組件自帶一些功能與微信風格一致的樣式。 一個組件通常包括 開始標簽 和 結…

Cyber Weekly #8

賽博新聞 1、微軟召開年度發布會Microsoft Build 2024 本周&#xff08;5.22&#xff09;微軟召開了年度發布會&#xff0c;Microsoft Build 2024&#xff0c;發布了包括大殺器 Copilot Studio 在內的 50 項更新。主要包括&#xff1a; 硬件層面&#xff1a;與英偉達 & A…

3D牙科網格分割使用基于語義的特征學習與圖變換器

文章目錄 3D Dental Mesh Segmentation Using Semantics-Based Feature Learning with Graph-Transformer摘要方法實驗結果 3D Dental Mesh Segmentation Using Semantics-Based Feature Learning with Graph-Transformer 摘要 本文提出了一種新穎的基于語義的牙科網格分割方…

民國漫畫雜志《時代漫畫》第16期.PDF

時代漫畫16.PDF: https://url03.ctfile.com/f/1779803-1248612470-6a05f0?p9586 (訪問密碼: 9586) 《時代漫畫》的雜志在1934年誕生了&#xff0c;截止1937年6月戰爭來臨被迫停刊共發行了39期。 ps:資源來源網絡&#xff01;

代碼隨想錄訓練營總結

歷經60天的訓練營終于結束啦&#xff0c;感覺自己兩個月前做的這個決定非常正確&#xff0c;非常感謝卡哥和卡哥助手&#xff0c;從一個代碼沒有系統刷題沒有體系的小白到現在已經有了一些基礎&#xff0c;也具備一些刷題的習慣和手感&#xff0c;如果是我自己沒有規劃的刷可能…

【C++】二分查找:在排序數組中查找元素的第一個和最后一個位置

1.題目 難點&#xff1a;要求時間復雜度度為O(logn)。 2.算法思路 需要找到左邊界和右邊界就可以解決問題。 題目中的數組具有“二段性”&#xff0c;所以可以通過二分查找的思想進行解題。 代碼&#xff1a; class Solution { public:vector<int> searchRange(vect…

Camunda BPM主要組件

Camunda BPM是使用java開發的,核心流程引擎運行在JVM里,純java庫,不依賴其他庫或者底層操作系統。可以完美地與其他java框架融合,比如Spring。除了核心流程引擎外,還提供了一系列的管理,操作和監控工具。 1,工作流引擎 既適用于服務或者微服務編排,也適用于人工任務管…

Leetcode42題:接雨水

1.題目描述 給定 n 個非負整數表示每個寬度為 1 的柱子的高度圖&#xff0c;計算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例1&#xff1a; 輸入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 輸出&#xff1a;6 解釋&#xff1a;上面是由數組 [0,1,0,2,1,0,1,…

hadoop節點添加與刪除測試

hadoop節點上下線 docker run -d --name hd1 -p 8888:8888 -p 2222:22 centos:basic init docker run -d --name hd2 -p 8889:8889 centos:basic init docker run -d --name hd3 centos:basic init# hosts echo "172.17.0.2 hadoop1 172.17.0.3 hadoop2 172.17.0.4 hadoo…

網絡協議:CSMA/CD 和 CSMA/CA

當多臺設備共享同一通信信道時&#xff0c;避免數據傳輸沖突至關重要。本文將探討兩種廣泛使用的協議&#xff1a;CSMA/CD&#xff08;Carrier Sense Multiple Access with Collision Detection&#xff09;和CSMA/CA&#xff08;Carrier Sense Multiple Access with Collision…

【C語言】二叉樹的實現

文章目錄 前言?一、二叉樹的定義&#x1f6b2;二、創建二叉樹&#x1f3a1;三、二叉樹的銷毀&#x1f389;四、遍歷二叉樹1. 前序遍歷2. 中序遍歷3. 后序遍歷4. 層序遍歷 &#x1f332;五、二叉樹的計算1. 計算二叉樹結點個數2. 計算二叉樹葉子結點的個數3. 計算二叉樹的深度4…

一、Elasticsearch介紹與部署

目錄 一、什么是Elasticsearch 二、安裝Elasticsearch 三、配置es 四、啟動es 1、下載安裝elasticsearch的插件head 2、在瀏覽器&#xff0c;加載擴展程序 3、運行擴展程序 4、輸入es地址就可以了 五、Elasticsearch 創建、查看、刪除索引、創建、查看、修改、刪除文檔…

【MySQL】——并發控制

&#x1f4bb;博主現有專欄&#xff1a; C51單片機&#xff08;STC89C516&#xff09;&#xff0c;c語言&#xff0c;c&#xff0c;離散數學&#xff0c;算法設計與分析&#xff0c;數據結構&#xff0c;Python&#xff0c;Java基礎&#xff0c;MySQL&#xff0c;linux&#xf…

計算機畢業設計 | springboot+vue房屋租賃管理系統(附源碼)

1&#xff0c;緒論 1.1 課題來源 隨著社會的不斷發展以及大家生活水平的提高&#xff0c;越來越多的年輕人選擇在大城市發展。在大城市發展就意味著要在外面有一處安身的地方。在租房的過程中&#xff0c;大家也面臨著各種各樣的問題&#xff0c;比如需要費時費力去現場看房&…

oj項目后端分析

1.菜單管理 我們菜單管理有菜單表(sys_menu)&#xff0c;還有用戶角色表&#xff08;sys_role&#xff09;&#xff0c;菜單表是用于管理我們用戶所擁有的權限&#xff0c;不同的用戶所看到的頁面是不一樣的&#xff0c;由于一些用戶他能夠看到題庫管理和考題管理&#xff0c;還…