1. 程式人生 > 實用技巧 >Codeforces Global Round 10

Codeforces Global Round 10

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;
}