求调,维护平方和维护错了
查看原帖
求调,维护平方和维护错了
759274
Stevehim楼主2023/11/29 16:26

rt,挺离谱的,调了快1h也没看出来维护的平方和到底哪里出问题了...

#include <bits/stdc++.h>
#define maxn 501000
using namespace std;
typedef long long ll;
const int mod = 1000007;
// const lsl INF=100000000000000000;
int num[maxn];
struct node{
    int l, r, siz;
    ll mi, ma, sum, ssum; //注意:ssum为平方和
};
struct SegmentTree{
    node tr[maxn];
    //-----一大堆便利的宏定义--------
    #define ls p*2
    #define rs p*2+1
    #define lp tr[p].l
    #define rp tr[p].r
    // #define mid (lp+rp)>>1
    #define psiz tr[p].siz
    #define padd tr[p].add
    #define psum tr[p].sum
    #define pssum tr[p].ssum
    //-----一大堆便利的宏定义--------
    inline void pushup(int p){
        tr[p].ma = max(tr[ls].ma, tr[rs].ma), tr[p].mi = min(tr[ls].mi, tr[rs].mi);
        psum = (tr[ls].sum + tr[rs].sum + mod) % mod;
        pssum = (tr[rs].ssum + tr[ls].ssum) % mod;
    }
    inline void build(int p,int l,int r){
        lp = l, rp = r;
        if(l == r){
            tr[p].ssum = num[l] * num[l] % mod; //平方和
            tr[p].sum = num[l] % mod;
            tr[p].ma = tr[p].mi = num[l];
            return;
        }
        int mid = (l + r) >> 1;
        build(ls, l, mid);
        build(rs, mid + 1, r);
        pushup(p);
    }
    inline void change(int p,int l,int r, int q,int z){
        if(r == l){
            tr[p].ma = tr[p].mi = psum = z;
            pssum = z * z % mod;
            return;
        }
        int mid = (l + r) >> 1;
        if(q <= mid) change(ls, l, mid, q, z);
        else change(rs, mid + 1, r, q, z);
        pushup(p);
    }
    inline ll ask_mi(int p,int l,int r){
        if(l <= lp && r >= rp) return tr[p].mi;
        ll ans = LONG_LONG_MAX;
        int mid = (lp + rp) >> 1;
        if(l <= mid) ans = min(ans, ask_mi(ls, l, r));
        if(r > mid) ans = min(ans, ask_mi(rs, l, r));
        return ans;
    }
    inline ll ask_ma(int p,int l,int r){
        if(l <= lp && r >= rp) return tr[p].ma;
        ll ans = LONG_LONG_MIN;
        int mid = (lp + rp) >> 1;
        if(l <= mid) ans = max(ans, ask_ma(ls, l, r));
        if(r > mid) ans = max(ans, ask_ma(rs, l, r));
        return ans;
    }
    inline ll ask_sum(int p,int l,int r){
        if(l <= lp && r >= rp) return psum;
        ll ans = 0;
        int mid = (lp + rp) >> 1;
        if(l <= mid) ans = (ans + ask_sum(ls, l, r)) % mod;
        if(r > mid) ans = (ans + ask_sum(rs, l, r)) % mod;
        return ans;
    }
    inline ll ask_ssum(int p,int l,int r){
        if(l <= lp && r >= rp) return (pssum + mod)% mod;
        ll ans = 0;
        int mid = (lp + rp) >> 1;
        if(l <= mid) ans = (ans + ask_ssum(ls, l, r) + mod) % mod;
        if(r > mid) ans = (ans + ask_ssum(rs, l, r) + mod) % mod;
        return ans;
    }
    inline bool ask_legal(int l,int r){
        ll mi = ask_mi(1, l, r), ma = ask_ma(1, l, r), ssum = ask_ssum(1, l, r), sum = ask_sum(1, l, r);
        cout << mi << ' ' << ma  << ' ' << sum << ' ' << ssum << endl;
        if(((ma * (ma + 1) * (2 * ma + 1)) % mod - ((mi - 1) * mi * (2 * mi - 1)) % mod + mod) % mod == ssum * 6 % mod && ((mi + ma) * (r - l + 1) % mod) == sum * 2 % mod) return true;
        return false;
    }
    //-----一大堆解除-------
    #undef ls
    #undef rs
    #undef psum
    #undef psiz
    #undef padd
    #undef pssum
    #undef rp
    #undef lp
    //-----一大堆解除-------
}tree;

int n, m, opt, x, y;
int main(){
    // freopen("1.in", "r" ,stdin);
    // freopen("ans.out", "w", stdout);
    ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
    cin >> n >> m;
    for(int i = 1; i <= n; i++) cin >> num[i];
    tree.build(1, 1, n);
    while(m--){
        cin >> opt >> x >> y;
        if(opt == 1) tree.change(1, 1, n, x, y);
        else cout << (tree.ask_legal(x, y) ? "damushen" : "yuanxing") << '\n';
    }
    return 0;
}
2023/11/29 16:26
加载中...