Codeforces Round #707 (Div. 2, based on Moscow Open Olympiad in Informatics)


A.一道模拟题

#include 
using namespace std;
typedef long long ll;
int main () {
	int T;
	cin >> T;
	while(T--) {
		int n;
		cin >> n;
		std::vector a(n);
		std::vector b(n);
		std::vector t(n);
		for(int i = 0; i < n; ++i) {
			cin >> a[i] >> b[i];
		}
		for(int i = 0; i < n; ++i) {
			cin >> t[i];
		}
		ll last = 0;
		ll ans = 0;
		for(int i = 0; i < n; ++i) {
			last = (i == 0) ? 0 : b[i - 1]; 
			ans += a[i] - last;
			ans += t[i];
			if(i == n - 1) {
				break;
			}
			ll gap = ll(double(b[i] - a[i]) / 2.0 + 0.5);
			ans += gap;
			if(ans < b[i]) ans = b[i];
			// cout << ans << endl;
		}
		cout << ans << endl;
	}
}

B 从顶部往下部扫描O(n)。如果区间修改,考虑树状数组O(nlogn)

#include 
using namespace std;
typedef long long ll;
int main () {
	int T;
	cin >> T;
	while(T--) {
		int n;
		cin >> n;
		std::vector v(n);
		std::vector ans(n, 0);
		for(int i = 0; i < n; ++i) {
			cin >> v[i];
		}
		int gap = v[n - 1];
		for(int i = n - 1; i >= 0; ) {
			if(gap) {
				ans[i] = 1;
				gap--;
			}
			i--;
			gap = max(gap, v[i]);
		}
		for(int i = 0; i < n; ++i) {
			cout << ans[i];
			if(i == n - 1) {
				cout << endl;
			} else {
				cout << " ";
			}
		}
	}
}

C 利用鸽巢原理分析如果为yes,判断在Time Exceed之前即可完成

#include 
using namespace std;
typedef long long ll;
typedef pair P;
#define ft first
#define se second
std::vector

s(5000010); int main () { int n; cin >> n; std::vector v(n + 1); for(int i = 1; i <= n; ++i) { cin >> v[i]; } for(int i = 1; i < n; ++i) { for(int j = i + 1; j <= n; ++j) { ll x = v[i] + v[j]; if(s[x].ft && s[x].se && s[x].ft != i && s[x].ft != j && s[x].se != i && s[x].se != j) { cout << "YES" << endl; cout << s[x].ft << " " << s[x].se << " " << i << " " << j << endl; return 0; } s[x].ft = i, s[x].se = j; } } cout << "NO" << endl; }