CodeForces Round #529 Div.3

时间:2023-03-09 18:50:47
CodeForces Round #529 Div.3

http://codeforces.com/contest/1095

A. Repeating Cipher

#include <bits/stdc++.h>
using namespace std; int N;
string s;
string ans = ""; int main() {
scanf("%d", &N);
cin >> s;
int cnt = ;
for(int i = ; i < N;) {
ans += s[i];
cnt ++;
i += cnt;
}
cout << ans;
return ;
}

B. Array Stabilization

#include <bits/stdc++.h>
using namespace std; const int maxn = 1e5 + ;
int N;
int a[maxn]; int main() {
scanf("%d", &N);
for(int i = ; i < N; i ++)
scanf("%d", &a[i]); sort(a, a + N);
int ans1 = a[N - ] - a[];
int ans2 = a[N - ] - a[];
printf("%d\n", min(ans1, ans2));
return ;
}

C. Powers Of Two

#include <bits/stdc++.h>
using namespace std; int N, K;
priority_queue<int> q;
int cnt = ; int main() {
scanf("%d%d", &N, &K);
for(int i = ; i >= ; i --) {
if(N >= ( << i)) {
q.push(i);
N -= ( << i);
cnt ++;
}
} if(K < cnt) printf("NO\n");
else {
while(cnt < K) {
int rec = q.top();
if(rec == ) {
printf("NO\n");
return ;
} q.pop();
q.push(rec - );
q.push(rec - ); cnt ++;
} printf("YES\n");
while(!q.empty()) {
int t = q.top();
printf("%d ", ( << t));
q.pop();
} } return ;
}

D. Circular Dance

#include <bits/stdc++.h>
using namespace std; const int maxn = 2e5 + ;
vector<int> v[maxn];
int a[maxn][], vis[maxn];
int N;
vector<int> ans; void dfs(int step) {
vis[step] = ;
ans.push_back(step);
for(int i = ; i < v[step].size(); i ++) {
if(!vis[v[step][i]] && (v[step][i] == a[step][] || v[step][i] == a[step][])) {
vis[v[step][i]] = ;
dfs(v[step][i]);
}
}
} int main() {
scanf("%d", &N);
for(int i = ; i <= N; i ++) {
int st, en;
scanf("%d%d", &st, &en);
a[i][] = st, a[i][] = en;
v[st].push_back(en);
v[en].push_back(st);
} dfs();
for(int i = ; i < ans.size(); i ++)
printf("%d%s", ans[i], i != ans.size() - ? " " : "\n"); return ;
}

E. Almost Regular Bracket Sequence

(合法的括号匹配串的充要条件是 ① 前 i 项 前缀和非负 ② sum[N] == 0)

#include <bits/stdc++.h>
using namespace std; const int maxn = 1e6 + ;
int N;
string s;
int a[maxn], sum[maxn], b[maxn], c[maxn]; int main() {
cin >> N >> s;
for(int i = ; i < N; i ++) {
if(s[i] == '(')
a[i] = ;
else a[i] = -;
} sum[] = a[];
for(int i = ; i < N; i ++)
sum[i] = a[i] + sum[i - ]; c[] = sum[];
for(int i = ; i < N; i ++)
c[i] = min(c[i - ], sum[i]); b[N - ] = sum[N - ];
for(int i = N - ; i >= ; i --)
b[i] = min(sum[i], b[i + ]); int ans = ;
for(int i = ; i < N; i ++) {
if(s[i] == '(') {
if(c[i - ] >= && b[i] - >= && sum[N - ] - == ) ans ++;
} else {
if(c[i - ] >= && b[i] + >= && sum[N - ] + == ) ans ++;
}
} printf("%d\n", ans); return ;
}

F. Make It Connected

(很久没写最小生成树 这个先留一哈)

写的好烦 脑子不好用 想不到 然后开始吃薯片 还是暴躁 越来越暴躁 在放弃的边缘大鹏展翅 所以完全不想看题目 想豁奶茶想吹风