QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#324399#8133. When Anton Saw This Task He Reacted With 😩ucup-team055WA 1539ms57536kbC++205.4kb2024-02-10 18:16:532024-02-10 18:16:54

Judging History

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

  • [2024-02-10 18:16:54]
  • 评测
  • 测评结果:WA
  • 用时:1539ms
  • 内存:57536kb
  • [2024-02-10 18:16:53]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=(int)a;i<(int)b;i++)
#define all(p) p.begin(),p.end()
using ll =long long;

// バグっとる

constexpr ll mod = 998244353;
struct mm {
    ll x;
    mm(ll x_ = 0): x(x_ % mod) {
        if(x < 0) x += mod;
    }
    friend mm operator+(mm a, mm b) { return a.x + b.x; }
    friend mm operator-(mm a, mm b) { return a.x - b.x; }
    friend mm operator*(mm a, mm b) { return a.x * b.x; }
    friend mm operator/(mm a, mm b) { return a.x * b.inv(); }
    friend void operator+=(mm& a, mm b) { a = a.x + b.x; }
    friend void operator-=(mm& a, mm b) { a = a.x - b.x; }
    friend void operator*=(mm& a, mm b) { a = a.x * b.x; }
    friend void operator/=(mm& a, mm b) { a = a.x * b.inv(); }
    mm inv() const { return pow(*this, mod - 2); }
    friend mm pow(mm a, ll b) {
        mm c = 1;
        while(b) {
            if(b & 1) c *= a;
            a *= a;
            b >>= 1;
        }
        return c;
    }
};

template<class T,T (*op)(T,T),T (*e)()>
struct segtree{
    int size=1,n_;
    vector<T> d;
    segtree(int n){
        n_=n;
        while(size<n) size*=2;
        d.resize(size*2,e());
    }
    void set(int ind,T v){
        assert(0<=ind&&ind<n_);
        ind+=size;
        d[ind]=v;
        while(ind!=1){
            ind/=2;
            d[ind]=op(d[ind*2],d[ind*2+1]);
        }
    }
    void get(int ind){
        return d[ind+size];
    }
    T prod(int l,int r){
        assert(0<=l&&l<=r&&r<n_);
        l+=size,r+=size;
        T lres=e(),rres=e();
        while(r-l>0){
            if(l&1){
                lres=op(lres,d[l--]);
            }
            if(r&1){
                rres=op(d[--r],rres);
            }
            l/=2;r/=2;
        }
        return op(lres,rres);
    }
};

using mint = mm;
using F1=array<mint,3>;
using F2=array<array<mint,3>,3>;

F1 cross(F1 l,F1 r){
    F1 res;
    res[0]=l[1]*r[2]-l[2]*r[1];
    res[1]=l[2]*r[0]-l[0]*r[2];
    res[2]=l[0]*r[1]-l[1]*r[0];
    return res;
}

F2 op(F2 l,F2 r){
    F2 res;
    rep(i,0,3) rep(j,0,3) res[i][j]=0;
    rep(i,0,3) rep(j,0,3) rep(k,0,3) res[i][k]+=l[i][j]*r[j][k];
    return res;
}
F2 e(){
    F2 base;
    rep(i,0,3) rep(j,0,3) base[i][j]=(i==j?1:0);
    return base;
}

F2 to_mat(F1 l){
    F2 res;
    res[0]={0,l[2]*-1,l[1]};
    res[1]={l[2],0,l[0]*-1};
    res[2]={l[1]*-1,l[0],0};
    return res;
}

F1 mul21(F2 l,F1 r){
    F1 res;
    rep(i,0,3) res[i]=0;
    rep(i,0,3) rep(j,0,3) res[i]+=l[i][j]*r[j];
    return res;
}

void solve(){
    int N,Q;
    cin>>N>>Q;
    vector<vector<int>> G(N);
    vector<F1> A(N);
    vector<int> pare(N,-1),to(N,-1);
    rep(i,0,N){
        char c;
        cin>>c;
        if(c=='v'){
            rep(j,0,3){
                ll a;
                cin>>a;
                A[i][j]=a;
            }
        }
        else{
            int a,b;
            cin>>a>>b;
            a--,b--;
            G[i]={a,b};
            pare[a]=i;pare[b]=i;
        }
    }
    mint sign=1;
    vector<int> order,inv(N),wei(N),bot(N);
    auto dfs1=[&](auto self,int var) -> void {
        if(G[var].empty()) wei[var]++;
        else{
            self(self,G[var][0]);
            self(self,G[var][1]);
            wei[var]=1+wei[G[var][0]]+wei[G[var][1]];
            if(wei[G[var][0]]>wei[G[var][1]]){
                sign*=-1;
                swap(G[var][0],G[var][1]);
            }
        }
    };
    dfs1(dfs1,0);
    auto dfs2=[&](auto self,int var) -> void {
        if(to[var]==-1) to[var]=var;
        inv[var]=order.size();
        order.push_back(var);
        if(!G[var].empty()){
            to[G[var][1]]=to[var];
            self(self,G[var][1]);
            self(self,G[var][0]);
            A[var]=cross(A[G[var][0]],A[G[var][1]]);
            bot[var]=bot[G[var][1]];
        }
        else{
            bot[var]=var;
        }
    };
    auto out=[&](F1 a){
        cout<<a[0].x<<" "<<a[1].x<<" "<<a[2].x<<"\n";
    };
    dfs2(dfs2,0);
    segtree<F2,op,e> seg(N);
    rep(i,0,N){
        if(!G[i].empty()){
            seg.set(inv[i],to_mat(A[G[i][0]]));
        }
    }
    auto calc=[&](int var) -> F1 {
        if(G[var].empty()) return A[var];
        F1 tmp;
        tmp=mul21(seg.prod(inv[var],inv[bot[var]]),A[bot[var]]);
        return tmp;
    };
    auto upd=[&](int var,F1 a) -> F1 {
        A[var]=a;
        while(var>=0){
            if(to[var]!=var){
                a=mul21(seg.prod(inv[to[var]],inv[var]),a);
            }
            if(var==0){
                return a;
            }
            else{
                //out(a);
                var=to[var];
                A[var]=a;
                if(var==0) return a;
                seg.set(inv[pare[var]],to_mat(a));
                var=pare[var];
                a=calc(var);
            }
        }
        return a;
    };
    while(Q--){
        int ind;
        cin>>ind;
        ind--;
        F1 a;
        rep(i,0,3){
            ll b;
            cin>>b;
            a[i]=b;
        }
        auto ans=upd(ind,a);
        ans=calc(0);
        rep(i,0,3) ans[i]*=sign;
        out(ans);
    }
}

int main(){
    int T=1;
    //cin>>T;
    while(T--) solve();
}

/*
5 3
x 2 3
v 1 0 1
x 4 5
v 0 2 1
v 1 1 1
4 1 2 3
5 0 1 1
4 0 2 2

 */

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 0ms
memory: 3756kb

input:

5 3
x 2 3
v 1 0 1
x 4 5
v 0 2 1
v 1 1 1
4 1 2 3
5 0 1 1
4 0 2 2

output:

998244351 0 2
1 998244351 998244352
0 0 0

result:

ok 9 numbers

Test #2:

score: -100
Wrong Answer
time: 1539ms
memory: 57536kb

input:

199999 100000
x 137025 65661
v 572518668 158967010 74946561
x 129836 192657
x 141948 187810
v 574918069 328924434 141474729
x 143312 111002
x 52772 148497
v 922857701 690080961 651915759
v 656198340 28002884 129579416
v 639893144 265359784 646791226
v 796871409 411409966 598676495
v 882562617 224394...

output:

169742284 360746539 545195571
727055100 55085226 733239733
60436935 51151013 236419278
870912633 193898253 619765784
853110811 974699500 379256709
434193618 207546112 28473614
144335407 946604292 270483257
29616113 913806518 181877904
844335593 209919570 977490194
439572632 695146746 148825782
90437...

result:

wrong answer 1st numbers differ by non-multiple of MOD, - expected: '393120558', found: '169742284'