QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#324399 | #8133. When Anton Saw This Task He Reacted With 😩 | ucup-team055 | WA | 1539ms | 57536kb | C++20 | 5.4kb | 2024-02-10 18:16:53 | 2024-02-10 18:16:54 |
Judging History
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'