概括:
7.00-8.00 看书60页《计算机网络》
8.30-10.00 刷题两道
10.30 - 13.30打CF比赛
详细:
比赛:
这个D题差了一点点时间,维护的不是很好,一开始没有考虑后面也会被限制然后导致修改的不能达到最大。
WA样例三
#include <bits/stdc++.h>
using namespace std;
#define OST ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
#define ll long long
#define endl "\n"
const ll mod = 1e9 + 7;
const int N = 2e5 + 5;
int c[N];
int lowbit(int x) {
return x & (-x);
}
void updta(int x, int v) {
while (x < N) {
c[x] += v;
x += lowbit(x);
}
}
int getsum(int x) {
int res = 0;
while (x > 0) {
res += c[x];
x -= lowbit(x);
}
return res;
}
void solve() {
ll n;
cin >> n;
vector<int> a(n + 1);
for (int i = 1; i <= n; i ++) cin >> a[i];
vector<int> b(n + 1, 1);
for (int i = 1; i <= n; i++) {
if (i > 1) {
if (a[i] >= b[i - 1] + 1) {
b[i] = b[i - 1] + 1;
} else {
b[i] = a[i];
}
}
}
// for (auto x : b) {
// cout << x << " ";
// }
// cout << endl;
ll ans = 0;
for (int i = 1; i <= n; i ++) {
ans += min(a[i], b[i]);
}
for (int i = 1; i <= n; i ++) {
updta(i - b[i] + 1, 1);
updta(i + 1, -1);
}
// cout << ans << endl;
int q;
cin >> q;
while (q--) {
int x, v;
cin >> x >> v;
int tmp = 0;
if (x > 1 && v >= b[x - 1] + 1) {
tmp = b[x - 1] + 1;
} else if (x > 1) {
tmp = v;
}
int ans1 = ans;
if (tmp == 0 || tmp == b[x]) {
cout << ans1 << endl;
continue;
} else {
int sum = getsum(x);
// cout << sum << "--";
if (tmp > b[x]) {
ans1 += sum * (tmp - b[x]);
} else {
ans1 -= sum * (b[x] - tmp);
}
}
cout << ans1 << endl;
}
}
signed main() {
OST;
int T = 1;
// cin >> T;
while (T--) { solve(); }
return 0;
}