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

A.一道模拟题

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main () {
	int T;
	cin >> T;
	while(T--) {
		int n;
		cin >> n;
		std::vector<ll> a(n);
		std::vector<ll> b(n);
		std::vector<ll> 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 <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main () {
	int T;
	cin >> T;
	while(T--) {
		int n;
		cin >> n;
		std::vector<int> v(n);
		std::vector<int> 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 <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll, ll> P;
#define ft first
#define se second
std::vector<P> s(5000010);
int main () {
	int n;
	cin >> n;
	std::vector<ll> 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;
}

posted @ 2021-03-14 11:19  LightAc  阅读(89)  评论(0编辑  收藏  举报
返回顶端