70ptsTLE求助
查看原帖
70ptsTLE求助
675208
coder2009楼主2024/10/21 21:14
#include <bits/stdc++.h>

using namespace std;

#define int long long
#define ls u << 1
#define rs u << 1 | 1
const int maxn = 3e5 + 5;

void read(int &a){
	int s = 0, w = 1;
	char ch = getchar();
	while(ch < '0' || '9' < ch){
		if(ch == '-') {
			w = -1;
		}
		ch = getchar(); 
	}
	while('0' <= ch && ch <= '9'){
		s = s * 10 + ch - '0';
		ch = getchar();
	}
	a = s*w;
}

struct edge {
    int l, r;
	int sum, add;
} t[maxn << 2];
int w[maxn];

inline void push_up(int u) {
    t[u].sum = t[ls].sum + t[rs].sum;
}

inline void push_down(int u) {
    if (t[u].add) {
        t[ls].add = t[ls].add + t[u].add;
        t[rs].add = t[rs].add + t[u].add;
        t[ls].sum = t[ls].sum + (t[ls].r - t[ls].l + 1) * t[u].add;
        t[rs].sum = t[rs].sum + (t[rs].r - t[rs].l + 1) * t[u].add;
        t[u].add = 0;
    }
}

inline void build(int u, int l, int r) {
    t[u].l = l;
    t[u].r = r;
    if (l == r) {
        t[u].sum = w[l];
        return;
    }
    int mid = (l + r) >> 1;
    build(ls, l, mid);
    build(rs, mid + 1, r);
    push_up(u);
}

inline int query(int u, int l, int r) {
    if (t[u].l >= l && t[u].r <= r) {
        return t[u].sum;
    }
    push_down(u);
    int mid = (t[u].l + t[u].r) >> 1;
    int s = 0;
    if (l <= mid) {
        s = query(ls, l, r);
    }
    if (r > mid) {
        s += query(rs, l, r);
    }
    return s;
}

inline void modify(int u, int l, int r, int val) {
    if (t[u].l >= l && t[u].r <= r) {
        t[u].sum += (t[u].r - t[u].l + 1) * val;
        t[u].add = t[u].add + val;
        return;
    } else {
        push_down(u);
        int mid = (t[u].l + t[u].r) >> 1;
        if (l <= mid) {
            modify(ls, l, r, val);
        }
        if (r > mid) {
            modify(rs, l, r, val);
        }
        push_up(u);
    }
}

inline int check(int u, int val, int c) {
	int mid = (t[u].l + t[u].r) >> 1;
	int s = c * query(1, 1, mid);
	if (s == val) {
		return mid - 1;
	}
	if (t[u].l == t[u].r) {
        return t[u].l - 1;
    }
    
    if (s > val) {
    	return check(ls, val, c);
	} else {
		return check(rs, val, c);
	}
}

inline void coder() {
    int W, n, q;
//    cin >> n >> q >> W;
    read(n);
    read(q);
    read(W);
    for (int i = 1; i <= n; ++i) {
        read(w[i]);
    }
    build(1, 1, n);
    while(q--) {
    	int v, x, y;
        read(x);
    	read(y);
    	read(v);
        modify(1, x, y, v);
        int ans = 0;
        int s = 1ll;
        int val = W;
        while (s * t[1].sum < val) {
            val -= s * t[1].sum;
            ans += n;
            s <<= 1ll;
        }
        ans += check(1, val, s);
        cout << ans << '\n';
    }
}


 main() {

	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	
    coder();


    return 0;
}
2024/10/21 21:14
加载中...