求调刚才A
  • 板块学术版
  • 楼主vectorxyz
  • 当前回复11
  • 已保存回复11
  • 发布时间2024/10/20 18:32
  • 上次更新2024/10/20 19:52:23
查看原帖
求调刚才A
1114241
vectorxyz楼主2024/10/20 18:32

大样例也过了,时间复杂度也没问题,WA+TLE 50pts?

#include <bits/stdc++.h>
using namespace std;
#define int long long
typedef pair<int, int> PII;
template<typename T>
T read(T x)
{
	T opt = 1, sum = 0;
	char ch = getchar();
	while(!isdigit(ch)) opt = (ch == '-') ? -1 : 1, ch = getchar();
	while( isdigit(ch)) sum = (sum << 1) + (sum << 3) + (ch ^ 48), ch = getchar();
	return opt * sum;
}
#define read read(0ll)
int n, q, w;
const int N = 2e5 + 5;
int a[N], sum;
int quick_pow(int a, int b)
{
    int ans = 1, base = a;
    while(b > 0){
        if(b & 1){
            ans *= base;
        }
        base *= base;
        b >>= 1;
    }
    return ans;
}
PII find(int x){
    int l = 0, r = max((int)1, (int)log2(w / x)), ans;
    while(l <= r){
        int mid = (l + r) / 2;
        if((quick_pow(2, mid) - 1) * x < w){
//        	cout << quick_pow(2, mid) * x << endl;
            ans = mid;
            l = mid + 1;
        }
        else r = mid - 1;
    } 
    return {ans, w - ((quick_pow(2, ans) - 1) * x)};
}
struct Segment
{
    struct node
    {
        int l, r, sum, lazy;
    }tr[N << 2];
    void build(int u, int l, int r){
        tr[u].l = l, tr[u].r = r;
        if(l == r) {
            tr[u].sum = a[l];
            return ;
        }
        int mid = (l + r) / 2;
        build(u << 1, l, mid), build(u << 1 | 1, mid + 1, r);
        tr[u].sum = tr[u << 1].sum + tr[u << 1 | 1].sum;
    }
    void update(int u, int l, int r, int k){
        if(l <= tr[u].l && tr[u].r <= r){
            tr[u].lazy += k;
            return ;
        }
        tr[u].sum += (min(tr[u].r, r) - max(tr[u].l, l) + 1) * k;
        int mid = (tr[u].l + tr[u].r) / 2;
        if(l <= mid) update(u << 1, l, r, k);
        if(r >  mid) update(u << 1 | 1, l, r, k);
    }
    int query(int u, int l, int r){
        if(l <= tr[u].l && tr[u].r <= r){
            return tr[u].sum + (tr[u].r - tr[u].l + 1) * tr[u].lazy;
        }
        int res = (min(tr[u].r, r) - max(tr[u].l, l) + 1) * tr[u].lazy;
        int mid = (tr[u].l + tr[u].r) / 2;
        if(l <= mid) res += query(u << 1, l, r);
        if(r >  mid) res += query(u << 1 | 1, l, r);
        return res;
    }
}seg;
int find2(int x, int lun){
    int l = 1, r = n - 1, ans = 0;
    while(l <= r){
        int mid = (l + r) / 2;
        if(seg.query(1, 1, mid) * (quick_pow(2, lun)) < x){
            ans = mid;
            l = mid + 1;
        }
        else r = mid - 1;
    }
    return ans;
}
signed main()
{
//	freopen("wxyt2.in","r", stdin);
//	freopen("my.out","w",stdout);
    n = read, q = read, w = read;
    for(int i = 1;i <= n;i ++ ){
        a[i] = read; sum += a[i];
    }
    seg.build(1, 1, n);
    for(int i = 1;i <= q;i ++ ){
        int l = read, r = read, d = read;
        sum += (r - l + 1) * d;
        PII k = find(sum);
        int lun = k.first, num = k.second;
        seg.update(1, l, r, d);
        int res = find2(num, lun);
//        cout << res << endl;
        cout << lun * n + res << endl;
        // cout << "==============\n";
    }
    return 0;
}
2024/10/20 18:32
加载中...