Codeforces Round 758 (Div.1 + Div.2) 解題報告
\(\rm Codeforces ~ Round ~ 758 ~ (Div.1 + Div.2)\)
A. Find Array
給定 \(n\),試找出 \(n\) 個數 \(a_1,a_2, \cdots,a_n\),滿足:
- \(\forall 1 \leq i \leq n,1 \leq a_i \leq 10^9\)。
- \(a_1 < a_2 < \cdots < a_n\)
- \(\forall 2\leq i \leq n,a_{i-1}\nmid a_i\)
\(T\) 組資料。
對於 \(100\%\) 的資料,滿足 \(1 \leq T \leq 100,1 \leq n \leq 1000\)
sol
顯然 \(2,3, \cdots,n+1\) 是滿足條件的一組解。
如果想不到的話,也可以輸出前 \(n\) 個質數,這也是滿足條件的一組解。
時間複雜度為 \(\mathcal{O}(Tn)\)。
#include <bits/stdc++.h> using namespace std; int T, n; signed main() { cin >> T; while(T--) { cin >> n; for(int i = 2; i <= n + 1; ++i) cout << i << " "; cout << "\n"; } }
B. Build the Permutation
給定 \(n,a,b\),試找出 \(n\) 個數 \(p_1,p_2, \cdots,p_n\),滿足有且僅有 \(a\) 個頂和 \(b\) 個谷。
定義:
- 若 \(p_{i-1} < p_i > p_{i+1}\),則稱之為一個頂(其中 \(2\leq i \leq n-1\))。
- 若 \(p_{i-1} > p_i < p_{i+1}\),則稱之為一個谷(其中 \(2\leq i \leq n-1\))。
\(T\) 組資料。
對於 \(100\%\) 的資料,滿足 \(1 \leq T \leq 10^4,2 \leq n \leq 10^5,0 \leq a \leq b \leq n\)
sol
顯然如果 \(a+b+2>n\),那麼肯定無解。
然後,我們可以得出一個結論:\(|a-b| \leq 1\)。
簡單來說,若出現一個頂,那麼必然帶有一個谷,反之也是。
最後可能會多出來一個頂或谷。
分類討論即可。
#include <bits/stdc++.h>
using namespace std;
int T, n, a, b;
signed main()
{
cin >> T;
while(T--)
{
cin >> n >> a >> b;
if(a + b + 2 > n || abs(a - b) > 1)
{
puts("-1");
continue;
}
if(a == b)
{
int lb = 1, ub = (a + 1) * 2;
for(int i = 0; i <= a; ++i) printf("%d %d ", lb++, ub--);
for(int i = (a + 1) * 2 + 1; i <= n; ++i) printf("%d ", i);
}
else
{
int rev = 0;
if(b == a + 1) rev = 1, ++a;
int lb = n - a - a + 1, ub = n;
for(int i = 0; i < a; ++i) printf("%d %d ", (rev == 0 ? lb++ : n - (lb++) + 1), (rev == 0 ? ub-- : n - (ub--) + 1));
for(int i = n - a - a; i > 0; --i) printf("%d ", (rev == 0 ? i : n - i + 1));
}
puts("");
}
}
C. Game Master
有 \(n\) 名玩家在玩遊戲。
每名玩家有兩個屬性值:\(a_i\) 代表在地圖 A
比賽的力量,\(b_i\) 表示在地圖 B
比賽的力量。
同一張地圖裡所有玩家的力量都不相同。
你可以安排 \(n−1\) 場比賽,每次可以選擇任意比賽場地和任意兩個未淘汰的玩家進行比賽。
比賽時,力量大的玩家獲勝,失敗則被淘汰。
現在要求求出:對於每個玩家,是否有可能通過某種安排使其獲勝?
\(T\) 組資料。
對於 \(100\%\) 的資料,滿足 \(1 \leq T \leq 100,1 \leq n \leq 10^5,1 \leq a_i,b_i \leq 10^9\)。
sol
我們對於地圖 A
和 B
中的所有玩家分別按照力量值排序,之後把力量大的向力量小的連邊。
每個地圖只連一個鏈,不需要連成完全圖。
這兩個地圖在同一個圖裡連邊。
之後發現這樣連出的圖裡,一個環裡的所有的玩家都可以贏。
找下環即可。
時間複雜度 \(\mathcal O(T n \log n)\)
#include <bits/stdc++.h>
using namespace std;
const int _ = 100005;
#define pii pair<int, int>
int T, n;
vector<pii> a, b;
vector<int> d[_];
bool vis[_];
void dfs(int u)
{
vis[u] = 1;
for(int v : d[u])
{
if(!vis[v]) dfs(v);
}
}
void init()
{
a.clear();
b.clear();
for(int i = 0; i < _; i++)
{
d[i].clear();
vis[i] = 0;
}
}
signed main()
{
cin >> T;
while(T--)
{
init();
cin >> n;
for(int i = 0, x; i < n; i++)
{
cin >> x;
a.push_back({x, i});
}
for(int i = 0, x; i < n; i++)
{
cin >> x;
b.push_back({x, i});
}
sort(a.begin(), a.end());
reverse(a.begin(), a.end());
sort(b.begin(), b.end());
reverse(b.begin(), b.end());
for(int i = 1; i < a.size(); i++)
{
d[a[i].second].push_back(a[i - 1].second);
d[b[i].second].push_back(b[i - 1].second);
}
dfs(a[0].second);
dfs(b[0].second);
for(int i = 0; i < n; i++)
cout << vis[i];
cout << "\n";
}
return 0;
}
\[\rm{to ~ be ~ continued...}
\]
本文來自部落格園,作者:蒟蒻orz,轉載請註明原文連結:https://www.cnblogs.com/orzz/p/15683019.html