Codeforces Global Round 10
阿新 • • 發佈:2020-08-19
A
#include <bits/stdc++.h> #define all(n) (n).begin(), (n).end() #define se second #define fi first #define pb push_back #define mp make_pair #define sqr(n) (n)*(n) #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 IO ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr) using namespace std; typedef long long ll; typedef pair<int, int> PII; typedef pair<ll, ll> PLL; typedef vector<int> VI; typedef double db; const int N = 2e5 + 5; int n, m, _, k; ll a[N]; int main() { IO; for (cin >> _; _; --_) { cin >> n >> a[1]; bool f = 1; rep (i, 2, n) { cin >> a[i]; if (a[i] != a[i - 1]) f = 0; } if (n == 1) { cout << 1 << '\n'; continue; } else if (n == 2) { cout << (a[1] == a[2] ? 2 : 1) << '\n'; continue; } else if (!f) cout << 1 << '\n'; else cout << n << '\n'; } return 0; }
B
#include <bits/stdc++.h> #define all(n) (n).begin(), (n).end() #define se second #define fi first #define pb push_back #define mp make_pair #define sqr(n) (n)*(n) #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 IO ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr) using namespace std; typedef long long ll; typedef pair<int, int> PII; typedef pair<ll, ll> PLL; typedef vector<int> VI; typedef double db; const int N = 2e5 + 5; int n, m, _, k; ll a[N], c; int main() { IO; for (cin >> _; _; --_) { cin >> n >> c >> a[1]; int mx = 1, mi = 1; rep (i, 2, n) { cin >> a[i]; if (a[i] > a[mx]) mx = i; if (a[i] < a[mi]) mi = i; } if (c & 1) { rep (i, 1, n) cout << a[mx] - a[i] << ' '; cout << '\n'; } else { rep (i, 1, n) cout << a[i] - a[mi] << ' '; cout << '\n'; } } return 0; }
C
記錄上次一增加了多少, 可以無縫銜接給下次, 貪心
#include <bits/stdc++.h> #define all(n) (n).begin(), (n).end() #define se second #define fi first #define pb push_back #define mp make_pair #define sqr(n) (n)*(n) #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 IO ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr) using namespace std; typedef long long ll; typedef pair<int, int> PII; typedef pair<ll, ll> PLL; typedef vector<int> VI; typedef double db; const int N = 2e5 + 5; int n, m, _, k; ll a[N]; int main() { IO; for (cin >> _; _; --_) { cin >> n >> a[1]; ll mx = a[1], m = 0, ans = 0; rep (i, 2, n) { cin >> a[i]; if (a[i] > mx) mx = a[i], m = 0; else if (a[i] == mx) m = 0; else { ll cur = mx - a[i] - m; if (cur > 0) ans += cur, m += cur; else m = mx - a[i]; } } cout << ans << '\n'; } return 0; }
D
發現連續兩個都是合法的, 所以對於 三個連續的 必須改一次
肯定是改連續的第三個字母啦
1.對於全是一種字母的, 每3次改一次, 對於最後多出來的 1 或 2個再改一次就好
2.混合的, 我們斷環, 當然是從 s[i] != s[i - 1] 處斷環, 使得字母每段都是連續的
還是每3次改一次, 但是對於每段多出來的 1 或 2個, 比如 RRR RR L 發現由於餘出的 RR 左邊變成了 L, 並不用修改 (相當於 RRR -> RRL, 已經被改好了)
即, 每段長度 / 3即可
#include <bits/stdc++.h>
#define all(n) (n).begin(), (n).end()
#define se second
#define fi first
#define pb push_back
#define mp make_pair
#define sqr(n) (n)*(n)
#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 IO ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr)
using namespace std;
typedef long long ll;
typedef pair<int, int> PII;
typedef pair<ll, ll> PLL;
typedef vector<int> VI;
typedef double db;
const int N = 2e5 + 5;
int n, m, _, k;
string s;
int main() {
IO;
for (cin >> _; _; --_) {
cin >> n >> s;
int f = -1;
rep (i, 1, n - 1) {
s += s[i - 1];
if (s[i] != s[i - 1]) {
f = i;
break;
}
}
if (f == -1) cout << n / 3 + (n % 3 != 0) << '\n';
else {
int ans = 0, cnt = 1;
rep (i, f + 1, f + n - 1)
if (s[i] == s[i - 1]) ++cnt;
else ans += cnt / 3, cnt = 1;
cout << ans + cnt / 3 << '\n';
}
}
return 0;
}
E
每個位置無非是從 上和左走來, 所以確保 次對角線 上的每個點的 數值範圍 不相交 即可
#include <bits/stdc++.h>
#define all(n) (n).begin(), (n).end()
#define se second
#define fi first
#define pb push_back
#define mp make_pair
#define sqr(n) (n)*(n)
#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 IO ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr)
using namespace std;
typedef long long ll;
typedef pair<int, int> PII;
typedef pair<ll, ll> PLL;
typedef vector<int> VI;
typedef double db;
const int N = 25;
int n, m, _, k;
ll a[N][N];
PII ans[N << 1];
PLL b[N][N];
int main() {
IO; cin >> n;
rep (k, 1, (n - 1) << 1) {
ll cur = -1;
rep (i, max(0, k - n + 1), min(k, n - 1)) {
int j = k - i;
ll mn = 1e18, mx = -1e18;
if (i) mn = min(mn, b[i - 1][j].fi), mx = max(mx, b[i - 1][j].se);
if (j) mn = min(mn, b[i][j - 1].fi), mx = max(mx, b[i][j - 1].se);
b[i][j] = {cur + 1, cur += 1 + mx - mn};
a[i][j] = b[i][j].fi - mn;
}
}
rep (i, 0, n - 1) {
rep (j, 0, n - 1) cout << a[i][j] << ' ';
cout << '\n';
}
cout.flush();
cin >> m;
rep (i, 1, m) {
ll k; cin >> k;
int x = n - 1, y = n - 1;
per (i, n - 1 << 1, 0) {
ans[i] = {x + 1, y + 1};
k -= a[x][y];
if (x && k >= b[x - 1][y].fi && k <= b[x - 1][y].se) --x;
else --y;
}
rep (i, 0, n - 1 << 1) cout << ans[i].fi << ' ' << ans[i].se << '\n';
cout << '\n';
cout.flush();
}
return 0;
}