QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#694438#6435. Paimon Segment Treezth#WA 112ms181272kbC++233.6kb2024-10-31 17:57:062024-10-31 17:57:06

Judging History

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

  • [2024-10-31 17:57:06]
  • 评测
  • 测评结果:WA
  • 用时:112ms
  • 内存:181272kb
  • [2024-10-31 17:57:06]
  • 提交

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(){a={{1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0, 1, 0}, {0, 0, 0, 1}};}
    mat(ll w) {
        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}};
    }
} 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)%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)%mod;
    }

} 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 + B.a[0][1]*A.sq + B.a[0][2]*A.sum + B.a[0][3]*A.cnt)%mod;
    res.sq = (B.a[1][0]*A.sum_sq + B.a[1][1]*A.sq + B.a[1][2]*A.sum + B.a[1][3]*A.cnt)%mod;
    res.sum = (B.a[2][0]*A.sum_sq + B.a[2][1]*A.sq + B.a[2][2]*A.sum + B.a[2][3]*A.cnt)%mod;
    res.cnt = (B.a[3][0]*A.sum_sq + B.a[3][1]*A.sq + B.a[3][2]*A.sum + B.a[3][3]*A.cnt)%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();
}

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);
    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
*/

詳細信息

Test #1:

score: 100
Accepted
time: 91ms
memory: 180792kb

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: 87ms
memory: 179884kb

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: 112ms
memory: 181272kb

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
-470864509
578008236
-798190147
674078444
746060191
171471121
722471473
657196163
-138448169
606551808
-639096051
401221326
767571915
669762004
163759234
141144218
579174939
276557168...

result:

wrong answer 13th numbers differ - expected: '529135498', found: '-470864509'