QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#694347#6435. Paimon Segment Treezth#WA 123ms181172kbC++233.8kb2024-10-31 17:45:272024-10-31 17:45:28

Judging History

你现在查看的是最新测评结果

  • [2024-10-31 17:45:28]
  • 评测
  • 测评结果:WA
  • 用时:123ms
  • 内存:181172kb
  • [2024-10-31 17:45:27]
  • 提交

answer

#include <bits/stdc++.h>
using namespace std;
#define int long long
typedef long long ll;

const ll mod=1e9+7;
const int MX=50000;

struct mat {
    vector<vector<ll>> a;

    mat(){}
    mat(ll w) {
        if (w!=-1) a={{1,1,2*w%mod,w*w%mod}, {0,1,2*w%mod,w*w%mod}, {0,0,1,w}, {0,0,0,1}};
        else a={{-1,-1,-1,-1}, {-1,-1,-1,-1}, {-1,-1,-1,-1}, {-1,-1,-1,-1}};
    }
} lz[10*MX+20];

mat mul_mat(mat &A, mat &B)  {
    if (A.a[0][0]==-1) return B;
    if (B.a[0][0]==-1) return A;

    mat res=mat(0);
    for (int i=0; i<4; ++i) {
        for (int j=0; j<4; ++j) {
            res.a[i][j]=0;
            for (int k=0; k<4; ++k) res.a[i][j]=(res.a[i][j]+A.a[i][k]*B.a[k][j])%mod;
        }
    }

    return res;
}

struct vec {
    ll sum_sq,sq,sum,cnt;

    vec() : sum_sq(0), sq(0), sum(0), cnt(0) {}

    vec(ll val) : sum_sq(val*val%mod), sq(val*val%mod), sum(val), cnt(1) {}

    vec(vec A, vec B) {
        sum_sq=(A.sum_sq+B.sum_sq)%mod;
        sq=(A.sq+B.sq)%mod;
        sum=(A.sum+B.sum)%mod;
        cnt=A.cnt+B.cnt;
    }

} s[10*MX+20];

vec mul_vec(vec &A, mat &B) {
    if (B.a[0][0]==-1) return A;
    vec res=vec(0);
    res.sum_sq = (B.a[0][0]*A.sum_sq%mod + B.a[0][1]*A.sq%mod + B.a[0][2]*A.sum%mod + B.a[0][3]*A.cnt%mod)%mod;
    res.sq = (B.a[1][0]*A.sum_sq%mod + B.a[1][1]*A.sq%mod + B.a[1][2]*A.sum%mod + B.a[1][3]*A.cnt%mod)%mod;
    res.sum = (B.a[2][0]*A.sum_sq%mod + B.a[2][1]*A.sq%mod + B.a[2][2]*A.sum%mod + B.a[2][3]*A.cnt%mod)%mod;
    res.cnt = (B.a[3][0]*A.sum_sq%mod + B.a[3][1]*A.sq%mod + B.a[3][2]*A.sum%mod + B.a[3][3]*A.cnt%mod)%mod;
    return res;
}

void pushlz(int l, int r, int idx) {
    s[idx]=mul_vec(s[idx],lz[idx]);
    if (l!=r) {
        lz[2*idx]=mul_mat(lz[idx],lz[2*idx]);
        lz[2*idx+1]=mul_mat(lz[idx],lz[2*idx+1]);
    }
    lz[idx]=mat(-1);
}

void update(int l, int r, int idx, int x, int y, ll val) {
    pushlz(l,r,idx);
    if (x>r || y<l) return;
    if (x<=l && r<=y) {
        lz[idx]=mat(val);
        pushlz(l,r,idx);
    } else {
        int mid=(l+r)/2;
        update(l,mid,2*idx,x,y,val);
        update(mid+1,r,2*idx+1,x,y,val);
        s[idx]=vec(s[2*idx],s[2*idx+1]);
    }
}

vec query(int l, int r, int idx, int x, int y) {
    pushlz(l,r,idx);
    if (x>r || y<l) return vec();
    if (x<=l && r<=y) return s[idx];
    int mid=(l+r)/2;
    return vec(query(l,mid,2*idx,x,y),query(mid+1,r,2*idx+1,x,y));
}

int n,m,q;
ll c[MX+5],ans[MX+5];

void build(int l, int r, int idx) {
    if (l==r) s[idx]=vec(c[l]);
    else {
        int mid=(l+r)/2;
        build(l,mid,2*idx);
        build(mid+1,r,2*idx+1);
        s[idx]=vec(s[2*idx],s[2*idx+1]);
    }
}

struct tup {
    ll a,b,c; //idx of ans, l, r
};

vector<tup> op,del[MX+5],add[MX+5];

signed main() {
    ios_base::sync_with_stdio(0); cin.tie(0);
    for (int i=0; i<=10*MX+3; ++i) lz[i]=mat(-1);
    cin>>n>>m>>q;
    for (int i=1; i<=n; ++i) cin>>c[i];
    build(1,n,1);

    op.push_back({0,0,0});
    for (int i=1; i<=m; ++i) {
        int l,r,x; cin>>l>>r>>x;
        op.push_back({l,r,x});
    }

    for (int i=1; i<=q; ++i) {
        int l,r,x,y; cin>>l>>r>>x>>y;
        add[y].push_back({i,l,r});
        if (x) del[x-1].push_back({i,l,r});
    }

    for (int i=0; i<=m; ++i) {
        ll l=op[i].a, r=op[i].b, w=op[i].c;
        if (i) {
            update(1,n,1,l,r,w);
            if (l!=1) update(1,n,1,1,l-1,0);
            if (r!=n) update(1,n,1,r+1,n,0);
        }

        for (auto s : add[i]) ans[s.a]=(ans[s.a]+query(1,n,1,s.b,s.c).sum_sq)%mod;
        for (auto s : del[i]) ans[s.a]=((ans[s.a]-query(1,n,1,s.b,s.c).sum_sq)%mod+mod)%mod;
    }

    for (int i=1; i<=q; ++i) cout<<ans[i]<<"\n";
}
/*
 3 1 1
 8 1 6
 2 3 2
 2 2 0 0
*/

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 90ms
memory: 181172kb

input:

3 1 1
8 1 6
2 3 2
2 2 0 0

output:

1

result:

ok 1 number(s): "1"

Test #2:

score: 0
Accepted
time: 123ms
memory: 180500kb

input:

4 3 3
2 3 2 2
1 1 6
1 3 3
1 3 6
2 2 2 3
1 4 1 3
4 4 2 3

output:

180
825
8

result:

ok 3 number(s): "180 825 8"

Test #3:

score: -100
Wrong Answer
time: 102ms
memory: 180272kb

input:

100 107 180
-280960553 266308104 -997644864 856103777 592874377 674379235 -946339772 641750362 642418716 -360811715 -555543246 206614021 358239245 349842656 983198973 807518446 -66612455 -980932737 109826132 -109676067 51226145 452115561 -42729559 -950621304 -87009773 714026474 375317493 693260053 -...

output:

400489222
480617351
531108525
254983761
446689548
764223236
142229431
307405789
39817281
66225912
247029353
46506707
529135498
578008236
201809860
674078444
746060191
171471121
722471473
657196163
861551838
606551808
360903956
401221326
767571915
669762004
163759234
141144218
579174939
276557168
518...

result:

wrong answer 42nd numbers differ - expected: '897565782', found: '-102434225'