QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#309637 | #8133. When Anton Saw This Task He Reacted With 😩 | ucup-team191# | WA | 3687ms | 20836kb | C++14 | 3.6kb | 2024-01-20 19:25:37 | 2024-01-20 19:25:37 |
Judging History
answer
#include <bits/stdc++.h>
#define x first
#define y second
using namespace std;
using ll=long long;
using pii=pair<int,int>;
using vi=vector<int>;
using vl=vector<ll>;
using vec=array<int,3>;
using mat=array<vec,3>;
#define pb push_back
#define all(a) begin(a),end(a)
const int N=200010,MOD=998244353,K=300;
const char en='\n';
const ll LLINF=1ll<<60;
int sub(int a,int b)
{
if (a>=b) return a-b;
return a-b+MOD;
}
int mul(int a,int b)
{
return a*1ll*b%MOD;
}
void ad(int&a,int b)
{
a+=b;
if (a>=MOD) a-=MOD;
}
vec sub(vec a,vec b)
{
return {sub(a[0],b[0]),sub(a[1],b[1]),sub(a[2],b[2])};
}
vec mul(mat a,vec b)
{
vec re;
for (int i=0;i<3;++i)
{
re[i]=0;
for (int k=0;k<3;++k)
{
ad(re[i],mul(a[i][k],b[k]));
}
}
return re;
}
vec mul(vec a,int b)
{
return {mul(a[0],b),mul(a[1],b),mul(a[2],b)};
}
vec cross(vec a,vec b)
{
return {sub(mul(a[1],b[2]),mul(a[2],b[1])),sub(mul(a[2],b[0]),mul(a[0],b[2])),sub(mul(a[0],b[1]),mul(a[1],b[0]))};
}
mat crossL(mat a,vec b)
{
return {sub(mul(a[1],b[2]),mul(a[2],b[1])),sub(mul(a[2],b[0]),mul(a[0],b[2])),sub(mul(a[0],b[1]),mul(a[1],b[0]))};
}
mat crossR(vec a,mat b)
{
return {sub(mul(b[2],a[1]),mul(b[1],a[2])),sub(mul(b[0],a[2]),mul(b[2],a[0])),sub(mul(b[1],a[0]),mul(b[0],a[1]))};
}
int n,q,lc[N],rc[N],ind[N],de[N],r[N],par[20][N];
bool impo[N];
vec va[N];
vi ord,vaz;
pair<int,mat> tra[N];
mat id;
void dfs1(int i)
{
ind[i]=ord.size();
ord.pb(i);
if (lc[i]!=-1)
{
par[0][lc[i]]=i;
de[lc[i]]=de[i]+1;
dfs1(lc[i]);
par[0][rc[i]]=i;
de[rc[i]]=de[i]+1;
dfs1(rc[i]);
}
r[i]=ord.size();
}
void dfs2(int i)
{
if (impo[i])
{
tra[i]={i,id};
vaz.pb(i);
return;
}
if (lc[i]==-1)
{
tra[i].x=-1;
tra[i].y[0]=va[i];
return;
}
dfs2(lc[i]);
dfs2(rc[i]);
if (!impo[lc[i]] && !impo[rc[i]])
{
tra[i].x=-1;
tra[i].y[0]=cross(tra[lc[i]].y[0],tra[rc[i]].y[0]);
return;
}
impo[i]=1;
if (impo[lc[i]] && impo[rc[i]])
{
tra[i]={i,id};
vaz.pb(i);
return;
}
if (impo[lc[i]] && !impo[rc[i]])
{
tra[i].x=tra[lc[i]].x;
tra[i].y=crossL(tra[lc[i]].y,tra[rc[i]].y[0]);
return;
}
if (!impo[lc[i]] && impo[rc[i]])
{
tra[i].x=tra[rc[i]].x;
tra[i].y=crossR(tra[lc[i]].y[0],tra[rc[i]].y);
return;
}
assert(0);
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
for (int i=0;i<3;++i) id[i][i]=1;
par[0][1]=1;
cin>>n>>q;
for (int i=1;i<=n;++i)
{
char ti;
cin>>ti;
if (ti=='x')
{
cin>>lc[i]>>rc[i];
}
else
{
cin>>va[i][0]>>va[i][1]>>va[i][2];
lc[i]=-1;
rc[i]=-1;
}
}
dfs1(1);
//cout<<"dfs-ed"<<endl;
vector<pair<int,vec>> qu;
for (int r=0;r<q;++r)
{
int x1,a1,b1,c1;
cin>>x1>>a1>>b1>>c1;
qu.pb({x1,{a1,b1,c1}});
if (qu.size()==K || r==q-1)
{
memset(impo,0,sizeof(impo));
for (auto x: qu) impo[x.x]=1;
vaz.clear();
dfs2(1);
reverse(all(vaz));
for (auto x: qu)
{
va[x.x]=x.y;
for (auto i: vaz)
{
if (lc[i]==-1) continue;
vec lij=mul(tra[lc[i]].y,va[tra[lc[i]].x]);
vec des=mul(tra[rc[i]].y,va[tra[rc[i]].x]);
va[i]=cross(lij,des);
}
if (vaz.back()!=1)
{
vec lij,des;
if (impo[lc[1]])
{
lij=mul(tra[lc[1]].y,va[tra[lc[1]].x]);
des=tra[rc[1]].y[0];
}
else
{
assert(impo[rc[1]]);
lij=tra[lc[1]].y[0];
des=mul(tra[rc[1]].y,va[tra[rc[1]].x]);
}
va[1]=cross(lij,des);
}
cout<<va[1][0]<<' '<<va[1][1]<<' '<<va[1][2]<<en;
}
qu.clear();
}
}
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 0ms
memory: 9720kb
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: 3687ms
memory: 20836kb
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:
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 914774641 811979590 0 914774641 811979590 0 914774641 811979590 0 914774641 811979590 0 494682488 223611556 0 494682488 223611556 0 494682488 223611556 0 494682488 223611556 0 494682488 223611556 0 494682488 223611556 0 494682488 223611556 0 494682488 223611556 0 4946...
result:
wrong answer 1st numbers differ by non-multiple of MOD, - expected: '393120558', found: '0'