文章目录
刷题之Educational Codeforces Round 124 (Rated for Div. 2)
题单链接:Educational Codeforces Round 124 (Rated for Div. 2)
1651A. Playoff
- 思路:最后出线的是编号 2 n − 1 2^n-1 2n−1 的球员。
#include<bits/stdc++.h>
using namespace std;
#define rep(i, a, b) for(int i = (a); i <= (b); i++)
#define per(i, a, b) for(int i = (a); i >= (b); i--)
#define ll long long
#define db double
#define VI vector<int>
#define PII pair<int, int>
const db Pi = 3.141592653589793;
const int INF = 0x7fffffff;
const int N = 1e5 + 5;
const db eps = 1e-10;
int cas, n, m, a[N];
int main(){
cin >> cas;
while(cas--){
cin >> n;
cout << ((1 << n) - 1) << endl;
}
}
1651B. Prove Him Wrong
- 思路:不妨设
a
i
<
a
j
a_i<a_j
ai<aj,要使
a
i
+
a
j
>
2
∣
a
i
−
a
j
∣
=
2
(
a
j
−
a
i
)
a_i+a_j>2|a_i-a_j|=2(a_j-a_i)
ai+aj>2∣ai−aj∣=2(aj−ai),则
3
a
i
>
a
j
3a_i> a_j
3ai>aj
- 于是举出反例,只需要 3 a i ≤ a j 3a_i\le a_j 3ai≤aj
- 又因为 1 ≤ a j ≤ 1 0 9 1\le a_j\le 10^9 1≤aj≤109,发现 3 19 > 1 0 9 3^{19}>10^9 319>109,于是当 n ≥ 20 n\ge 20 n≥20 时, a n > 1 0 9 a_n>10^9 an>109,无解
- 否则按照 3 3 3 为等比的等比数列输出即可。
#include<bits/stdc++.h>
using namespace std;
#define rep(i, a, b) for(int i = (a); i <= (b); i++)
#define per(i, a, b) for(int i = (a); i >= (b); i--)
#define ll long long
#define db double
#define VI vector<int>
#define PII pair<int, int>
const db Pi = 3.141592653589793;
const int INF = 0x7fffffff;
const int N = 1e5 + 5;
const db eps = 1e-10;
int cas, n;
int main(){
cin >> cas;
while(cas--){
cin >> n;
if(n >= 20) puts("NO");
else{
ll now = 1;
puts("YES");
cout << 1 << " ";
rep(i, 2, n){
now *= 3;
cout << now << " ";
}
cout << endl;
}
}
}
1651C. Fault-tolerant Network
- 思路:要求任意一个机器故障,不会将网络分成多个部分。则四个机器
a
[
1
]
,
a
[
n
]
,
b
[
1
]
,
b
[
n
]
a[1],a[n],b[1],b[n]
a[1],a[n],b[1],b[n] 点一定要连接。四个点至少练两条线,至多四条线。
- 两条线(两种情况):
- a [ 1 ] − > b [ 1 ] , a [ n ] − > b [ n ] a[1]->b[1],a[n]->b[n] a[1]−>b[1],a[n]−>b[n]
- a [ 1 ] − > b [ n ] , a [ n ] − > b [ 1 ] a[1]->b[n],a[n]->b[1] a[1]−>b[n],a[n]−>b[1]
- 三条线(四种情况):
- a [ 1 ] − > b [ 1 ] a[1]->b[1] a[1]−>b[1] 时, a [ n ] , b [ n ] a[n],b[n] a[n],b[n] 选择最佳位置
- a [ 1 ] − > b [ n ] a[1]->b[n] a[1]−>b[n] 时, a [ n ] , b [ 1 ] a[n],b[1] a[n],b[1] 选择最佳位置。
- a [ n ] − > b [ 1 ] a[n]->b[1] a[n]−>b[1] 时, a [ 1 ] , b [ n ] a[1],b[n] a[1],b[n] 选择最佳位置
- a [ n ] − > b [ n ] a[n]->b[n] a[n]−>b[n] 时, a [ 1 ] , b [ 1 ] a[1],b[1] a[1],b[1] 选择最佳位置
- 四条线(一种情况):
- a [ 1 ] , b [ 1 ] , a [ n ] , b [ n ] a[1],b[1],a[n],b[n] a[1],b[1],a[n],b[n] 各自选择最佳位置
- 两条线(两种情况):
#include<bits/stdc++.h>
using namespace std;
#define rep(i, a, b) for(int i = (a); i <= (b); i++)
#define per(i, a, b) for(int i = (a); i >= (b); i--)
#define ll long long
#define db double
#define VI vector<int>
#define PII pair<int, int>
const db Pi = 3.141592653589793;
const int INF = 0x7fffffff;
const int N = 2e5 + 5;
const db eps = 1e-10;
int cas, n;
ll a[N], b[N];
ll ans, a1, an, b1, bn;
bool check(int x, int p1, int p2){
return abs(b[p1] - x) == abs(b[p2] - x);
}
ll calc(int x, int y){
return abs(a[x] - b[y]);
}
int main(){
// freopen("1.in","r",stdin);
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin >> cas;
while(cas--){
cin >> n;
rep(i, 1, n) cin >> a[i];
rep(i, 1, n) cin >> b[i];
//预处理
a1 = an = b1 = bn = INF;
rep(i, 1, n){
a1 = min(a1, calc(1, i));
an = min(an, calc(n, i));
b1 = min(b1, calc(i, 1));
bn = min(bn, calc(i, n));
}
//二线
ans = min(calc(1, 1) + calc(n, n), calc(1, n) + calc(n, 1));
//三线
ans = min(ans, calc(1, 1) + an + bn);
ans = min(ans, calc(1, n) + an + b1);
ans = min(ans, calc(n, 1) + a1 + bn);
ans = min(ans, calc(n, n) + a1 + b1);
//四线
ans = min(ans, a1 + an + b1 + bn);
cout << ans << endl;
}
}
/*
2
3
1 10 1
20 4 25
4
1 1 1 1
1000000000 1000000000 1000000000 1000000000
*/
1651D. Nearest Excluded Points
-
知识点:多源BFS
-
思路:记录所有点周围上下左右四点中未标记的点。从这些点开始进行 BFS。每次遇到标记点还未赋值答案,便赋值,再加入队列即可。
#include<bits/stdc++.h>
using namespace std;
#define rep(i, a, b) for(int i = (a); i <= (b); i++)
#define per(i, a, b) for(int i = (a); i >= (b); i--)
#define ll long long
#define db double
#define VI vector<int>
#define PII pair<int, int>
const db Pi = 3.141592653589793;
const int INF = 0x7fffffff;
const int N = 2e5 + 5;
const db eps = 1e-10;
int n, x[N], y[N];
int dx[5] = {0, 0, 1, -1};
int dy[5] = {-1, 1, 0, 0};
map<PII, int> mp;
queue<PII> q;
map<PII, PII> ans;
void bfs(){
while(q.size()){
PII now = q.front(); q.pop();
rep(j, 0, 3){
int nxtx = now.first + dx[j], nxty = now.second + dy[j];
if(mp.count({nxtx, nxty}) && !ans.count({nxtx, nxty})){
ans[{nxtx, nxty}] = ans[{now.first, now.second}];
q.push({nxtx, nxty});
}
}
}
}
int main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin >> n;
rep(i, 1, n){
cin >> x[i] >> y[i];
mp[{x[i], y[i]}] = 1;
}
//初始化队列
rep(i, 1, n){
rep(j, 0, 3){
int nxtx = x[i] + dx[j], nxty = y[i] + dy[j];
if(mp.count({nxtx, nxty})) continue;
q.push({nxtx, nxty});
ans[{nxtx, nxty}] = {nxtx, nxty};
break;
}
}
bfs();
rep(i, 1, n){
PII t = ans[{x[i], y[i]}];
cout << t.first << " " << t.second << endl;
}
}
/*
6
2 2
1 2
2 1
3 2
2 3
5 5
8
4 4
2 4
2 2
2 3
1 4
4 2
1 3
3 3
*/