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