QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#828985#4424. Babushka and her pierogiKevin5307AC ✓2566ms45188kbC++233.2kb2024-12-23 23:10:282024-12-23 23:10:28

Judging History

This is the latest submission verdict.

  • [2024-12-23 23:10:28]
  • Judged
  • Verdict: AC
  • Time: 2566ms
  • Memory: 45188kb
  • [2024-12-23 23:10:28]
  • Submitted

answer

//Author: Kevin
#include<bits/stdc++.h>
//#pragma GCC optimize("O2")
using namespace std;
#define ll long long
#define ull unsigned ll
#define pb emplace_back
#define mp make_pair
#define ALL(x) (x).begin(),(x).end()
#define rALL(x) (x).rbegin(),(x).rend()
#define srt(x) sort(ALL(x))
#define rev(x) reverse(ALL(x))
#define rsrt(x) sort(rALL(x))
#define sz(x) (int)(x.size())
#define inf 0x3f3f3f3f
#define pii pair<int,int>
#define lb(v,x) (int)(lower_bound(ALL(v),x)-v.begin())
#define ub(v,x) (int)(upper_bound(ALL(v),x)-v.begin())
#define uni(v) v.resize(unique(ALL(v))-v.begin())
#define longer __int128_t
void die(string S){puts(S.c_str());exit(0);}
mt19937_64 rng(20210448);
int p[200200],inv[200200];
int vis[200200];
int ls[200200],rs[200200],fa[200200],siz[200200],mn[200200],mx[200200];
ull prior[200200];
int A[200200],P[200200];
void pushup(int x)
{
	if(ls[x]) fa[ls[x]]=x;
	if(rs[x]) fa[rs[x]]=x;
	siz[x]=1+siz[ls[x]]+siz[rs[x]];
	mn[x]=mx[x]=x;
	if(ls[x])
	{
		if(P[mn[ls[x]]]<P[mn[x]]) mn[x]=mn[ls[x]];
		if(P[mx[ls[x]]]>P[mx[x]]) mx[x]=mx[ls[x]];
	}
	if(rs[x])
	{
		if(P[mn[rs[x]]]<P[mn[x]]) mn[x]=mn[rs[x]];
		if(P[mx[rs[x]]]>P[mx[x]]) mx[x]=mx[rs[x]];
	}
}
int getpos(int x)
{
	int res=siz[ls[x]]+1;
	while(fa[x]&&(x==ls[fa[x]]||x==rs[fa[x]]))
	{
		if(x==rs[fa[x]]) res+=1+siz[ls[fa[x]]];
		x=fa[x];
	}
	return res;
}
int getval(int x,int p)
{
	if(p<=siz[ls[x]]) return getval(ls[x],p);
	if(p==siz[ls[x]]+1) return x;
	return getval(rs[x],p-siz[ls[x]]-1);
}
int merge(int u,int v)
{
	if(!u||!v) return u+v;
	if(prior[u]>prior[v])
	{
		rs[u]=merge(rs[u],v);
		pushup(u);
		return u;
	}
	else
	{
		ls[v]=merge(u,ls[v]);
		pushup(v);
		return v;
	}
}
void split(int x,int s,int &a,int &b)
{
	if(!x)
	{
		a=b=0;
		return ;
	}
	if(siz[ls[x]]+1<=s)
	{
		a=x;
		split(rs[x],s-siz[ls[x]]-1,rs[a],b);
		pushup(a);
	}
	else
	{
		b=x;
		split(ls[x],s,a,ls[b]);
		pushup(b);
	}
}
int search(int x,int v)
{
	if(ls[x]&&P[mn[ls[x]]]<=P[v]) return search(ls[x],v);
	if(P[x]<=P[v]) return x;
	return search(rs[x],v);
}
void solve(int rt)
{
	if(siz[rt]==1) return ;
	int u=mn[rt];
	int v=mx[rt];
	int pos=getpos(u);
	int A,B;
	split(rt,pos,A,B);
	rt=merge(B,A);
	pos=getpos(v);
	split(rt,pos,A,B);
	int w=search(B,getval(A,1));
	rt=merge(A,B);
	pos=getpos(w);
	int x=getval(rt,pos-1);
	cout<<inv[u]<<" "<<inv[x]<<'\n';
	split(rt,pos-1,A,B);
	solve(A);
	solve(B);
}
map<int,int> Mp;
int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int t;
	cin>>t;
	while(t--)
	{
		int n,c;
		cin>>n>>c;
		ll tot=0;
		Mp.clear();
		for(int i=1;i<=n;i++)
		{
			cin>>A[i]>>P[i];
			Mp[P[i]]=i;
		}
		for(int i=1;i<=n;i++)
		{
			vis[i]=0;
			inv[i]=i;
			p[i]=Mp[A[i]];
			tot+=abs(A[i]-P[i]);
		}
		tot/=2;
		tot+=1ll*n*c;
		for(int i=1;i<=n;i++)
		{
			fa[i]=ls[i]=rs[i];
			prior[i]=rng();
			mn[i]=mx[i]=i;
			siz[i]=1;
		}
		vector<int> vrt;
		int k=n;
		for(int i=1;i<=n;i++)
			if(!vis[i])
			{
				int rt=0;
				int p=i;
				while(!vis[p])
				{
					vis[p]=1;
					rt=merge(rt,p);
					p=::p[p];
				}
				vrt.pb(rt);
				k--;
				tot-=c;
			}
		cout<<tot<<" "<<k<<'\n';
		for(auto rt:vrt) solve(rt);
	}
	return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 1403ms
memory: 23420kb

input:

1000
3220 272696332
766498233 728308608
664527309 611122504
769309894 72297979
848647465 356897274
645591201 895123264
165094010 486891491
31233252 552012226
84149600 93558181
569880970 31233252
925517631 900673333
254671525 65782954
360356809 123019566
435505772 128102614
595657911 878072081
138392...

output:

1425165727822 3210
940 1460
3139 1625
606 1460
606 1956
520 1956
606 1720
2675 1720
2675 2853
2074 2853
2675 1268
2076 1552
2121 1552
2076 2441
985 2441
2076 1268
606 1625
193 2248
193 1625
3139 3063
578 1372
2306 1372
2306 2509
2306 1409
578 2083
1622 2083
1622 1475
578 2636
2516 2691
2272 2691
174...

result:

ok ac (1000 test cases)

Test #2:

score: 0
Accepted
time: 2318ms
memory: 33484kb

input:

5
200000 42944121
574814309 67495230
53276728 150326725
864637686 234510550
10036337 414740
506850796 483988482
236014120 843625769
809762843 19603788
507104953 885632626
866590783 119176179
188251555 598788216
652874956 535446529
193164017 235823046
925533029 523948529
50446166 36338992
380571133 6...

output:

43086875784557 199984
9721 56921
71289 197943
79922 197943
26813 132655
48247 132655
34743 132655
59265 36445
14359 36445
118243 36445
7505 132655
60550 185607
111370 197943
111370 132655
111370 185607
117941 185607
111370 131779
7505 73405
90195 153607
90195 73405
90195 55443
65926 36445
36384 5544...

result:

ok ac (5 test cases)

Test #3:

score: 0
Accepted
time: 2566ms
memory: 45188kb

input:

5
200000 22877235
36648700 36642254
935593015 935591420
912067011 912055984
229315170 229314259
83126790 83123673
949986358 949980907
563637725 563627158
131644066 131631233
202694678 202691574
747915499 747915206
433149695 433125141
466955691 466945175
770435427 770425839
333350582 333349002
794680...

output:

4576424117766 199999
155223 13670
169318 13670
122272 13670
186701 13670
25846 13670
179211 13670
193487 13670
101581 13670
66607 13670
103962 13670
172890 13670
163342 13670
74383 13670
19151 13670
117913 13670
6901 13670
126267 13670
43459 13670
87097 13670
15151 13670
59717 13670
194422 13670
865...

result:

ok ac (5 test cases)

Extra Test:

score: 0
Extra Test Passed