QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#309667#8133. When Anton Saw This Task He Reacted With 😩ucup-team191#TL 3485ms21032kbC++143.8kb2024-01-20 19:45:292024-01-20 19:45:31

Judging History

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

  • [2024-01-20 19:45:31]
  • 评测
  • 测评结果:TL
  • 用时:3485ms
  • 内存:21032kb
  • [2024-01-20 19:45:29]
  • 提交

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=500;
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 rr=0;rr<q;++rr)
	{
		int x1,a1,b1,c1;
		cin>>x1>>a1>>b1>>c1;
		qu.pb({x1,{a1,b1,c1}});
		if (qu.size()==K || rr==q-1)
		{
			memset(impo,0,sizeof(impo));
			for (auto x: qu) impo[x.x]=1;
			vaz.clear();
			dfs2(1);
			/*cout<<"----"<<en;
			cout<<vaz.size()<<en;
			for (auto x: vaz) cout<<x<<' ';
			cout<<en;
			cout<<"----"<<en;*/
			bool prv=1;
			for (auto x: qu)
			{
				va[x.x]=x.y;
				for (auto i: vaz)
				{
					if (lc[i]==-1) continue;
					if (!prv && (ind[i]>ind[x.x] || r[i]<=ind[x.x])) 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;
				prv=0;
			}
			qu.clear();
		}
	}
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 3ms
memory: 9948kb

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: 0
Accepted
time: 3355ms
memory: 19584kb

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:

393120558 773766615 387297348
759959566 981774500 128012497
294611811 980011608 533642029
404379574 745296852 53493560
404565501 828869760 78021156
592494858 647751304 881427733
190018467 515243135 518180555
628180500 509984554 257430135
13737245 352087791 917410487
932051309 366591227 479931477
199...

result:

ok 300000 numbers

Test #3:

score: 0
Accepted
time: 3349ms
memory: 21032kb

input:

199999 100000
x 154525 80092
v 450407262 725458410 590777520
x 24720 135901
v 719242117 114943104 186796011
v 382530926 89156744 943939337
x 183376 26042
x 109984 157873
x 151637 150600
x 4115 27454
x 163135 92648
x 16764 33212
v 849210403 945083972 689295397
v 471196117 68587428 225597765
x 24643 5...

output:

677067461 996514296 449166851
810403092 258196842 853459733
410756156 253348518 912664471
327134890 519245783 922528759
317367558 536888537 506214109
484753530 879045782 772404948
422920052 152084658 517340457
1207902 348787162 320821077
776293878 699474926 711114530
871858473 468497588 822120121
24...

result:

ok 300000 numbers

Test #4:

score: 0
Accepted
time: 3485ms
memory: 20984kb

input:

199999 100000
x 72889 193806
x 35339 33069
v 314802407 406980523 492377265
x 108307 60027
x 144922 140917
v 328481079 117663280 644171354
v 482028404 951751561 166221217
v 936461869 436114879 421819757
x 152919 99965
x 61168 150607
v 56403640 743462679 134896557
v 24809217 462947115 966139991
v 7828...

output:

23709876 380448367 629159667
760678420 539369190 611778104
114926687 653692915 939877414
674199470 304745735 544123803
953800112 186017361 49200537
327282782 871001677 293980713
588783157 502130649 190564297
102680906 993889016 963478755
510012481 105416897 281770975
811082806 367139818 493674194
32...

result:

ok 300000 numbers

Test #5:

score: -100
Time Limit Exceeded

input:

199999 100000
x 134204 79203
v 152855933 152545887 271660214
v 393332175 182708769 115884220
v 731792305 965028257 676889584
x 89631 14495
x 142016 85686
v 600051847 172947969 906920949
v 846126215 214556203 657929902
x 125721 133526
x 93179 35713
v 330716449 450417250 611411649
v 114397688 58644961...

output:

139597616 375474977 14619793
889328460 79727434 363703631
397351102 877961602 429046190
588368345 819425899 502148739
520578911 186408072 484373545
997888597 816534316 338411279
334166269 288211584 608252640
509280845 362972392 286415695
363396960 878881251 3658455
711270872 94816531 100279034
48844...

result: