QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#828985 | #4424. Babushka and her pierogi | Kevin5307 | AC ✓ | 2566ms | 45188kb | C++23 | 3.2kb | 2024-12-23 23:10:28 | 2024-12-23 23:10:28 |
Judging History
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