样例1过了 求助
查看原帖
样例1过了 求助
883658
tony808楼主2024/10/20 18:40
#include <bits/stdc++.h>
using namespace std;
long long a[200005];
struct tree {
    int l, r;
    long long pre, add;
}t[900020];

void bulid(int p, int l, int r) {
    t[p].l = l; t[p].r = r;
    if (l == r) {
        t[p].pre = a[l];
        return;
    }
    int mid = (l + r )>> 1;
    bulid(p * 2, l, mid);
    bulid(p * 2 + 1, mid + 1, r);
    t[p].pre = t[p * 2].pre + t[p * 2 + 1].pre;
}

void spread(int p) {
    if (t[p].add) 
    {
        t[p * 2].pre += t[p].add * (t[p * 2].r - t[p * 2].l + 1);
        t[p * 2 + 1].pre += t[p].add * (t[p * 2 + 1].r - t[p * 2 + 1].l + 1);
        t[p * 2].add += t[p].add;
        t[p * 2 + 1].add += t[p].add;
        t[p].add = 0;
    }
}

void change(int p, int x, int y, long long z) {
    if (x <= t[p].l && y >= t[p].r) {
        t[p].pre += (long long)z * (t[p].r - t[p].l + 1);
        t[p].add += z;
        return;
    }
    spread(p);
    int mid = (t[p].l + t[p].r) >> 1;
    if (x <= mid) change(p * 2, x, y, z);
    if (y > mid) change(p * 2 + 1, x, y, z);
    t[p].pre = t[p * 2].pre + t[p * 2 + 1].pre;
}

long long ask(int p, int x, int y)
{
    if ((x <= t[p].l) && (y >= t[p].r)) return t[p].pre;
    spread(p);
    int mid = (t[p].l + t[p].r) >> 1;
    long long ans = 0;
    if (x <= mid) ans += ask(p * 2, x, y);
    if (y > mid) ans += ask(p * 2 + 1, x, y);
    return ans;
}
long long dfs(int remain,int ter,int l,int r) {
    for (int k = 1; k <= r; k++) {
        if (ask(1, 1, k) * ter>= remain) {
            return (k - 1);
        }
    }
}
int main() {
    long long n, q, W;
	cin >> n >> q >> W;
    long long cnt = 0;
	for (long long i = 1; i <= n; i++) {
		cin >> a[i];
		cnt += a[i];
	}
    bulid(1, 1, n);
    for (long long j = 1; j <= q; j++) {
        long long l, r, d;
        long long hp = W;
        cin >> l >> r >> d;
        change(1, l, r, d);
        long long sum=ask(1, 1, n);
        long long shang = hp / sum;
        long long shang1 = shang;
        long long shang2 = shang;
        bool checker = 1;
        long long ans = -1;
        while (shang1 >= 0) {
            ans++; 
            shang2 = shang1;
            shang1 -= (1 << ans);
            if (shang1 < 0) break;
            hp -= sum * (1 << ans);
        }
        long long turn = 1 << ans;
        ans *= n;
        if (hp == 0) {
            cout <<( ans - 1 )<< endl;
            continue;
        }
        ans+=dfs(hp, turn, 1, n);
        cout << ans << endl;
    }
	return 0;
}
2024/10/20 18:40
加载中...