QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#419888 | #4424. Babushka and her pierogi | OvO_Zuo | AC ✓ | 511ms | 11140kb | C++14 | 3.0kb | 2024-05-24 12:17:39 | 2024-05-24 12:17:41 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
#define pii pair<int,int>
#define fi first
#define se second
#define mkp make_pair
typedef long long ll;
const int N=2e5+5;
int n,C;
int p[N],q[N];
int help[N];
bool vis[N];
int lst[N],nxt[N];
vector<pii> opt;
int rid[N];
int iv[N];
void swp(int &x,int &y) {
x^=(y^=(x^=y));
}
void work() {
int i,j,l,r;
int tp;
for(i=n;i>=1;) {
tp=iv[i];
//cout<<i<<" "<<tp<<endl;
if(lst[tp]==tp) { --i;continue;}
if(lst[lst[tp]]==tp) {
opt.push_back(mkp(rid[tp],rid[lst[tp]]));
lst[lst[tp]]=lst[tp],lst[tp]=tp;
--i;
continue;
}
for(l=nxt[tp],r=lst[tp];;l=nxt[l],r=lst[r]) {
//cout<<tp<<" "<<l<<" "<<r<<" "<<i<<" "<<p[tp]<<" "<<p[l]<<" "<<p[r]<<endl;
if(p[l]<=p[lst[tp]]) {
//cout<<"A:"<<lst[l]<<" "<<lst[tp]<<" "<<rid[lst[l]]<<" "<<rid[lst[tp]]<<endl;
opt.push_back(mkp(rid[lst[l]],rid[lst[tp]]));
//swp(p[lst[l]],p[lst[tp]]);
swp(rid[lst[tp]],rid[lst[l]]);
//swp(q[lst[l]],q[lst[tp]]);
swp(nxt[lst[tp]],nxt[lst[l]]);
swp(lst[tp],lst[l]);
break;
} else if(p[r]>p[lst[tp]]) {
//cout<<"B:"<<r<<" "<<lst[tp]<<" "<<rid[r]<<" "<<rid[lst[tp]]<<endl;
opt.push_back(mkp(rid[r],rid[lst[tp]]));
//swp(p[r],p[lst[tp]]);
//swp(q[r],q[lst[tp]]);
swp(rid[r],rid[lst[tp]]);
j=nxt[r];
swp(nxt[r],nxt[lst[tp]]);
swp(lst[j],lst[tp]);
break;
}
}
}
}
void sol()
{
int i,j;
fill(vis,vis+1+n,0);
scanf("%d%d",&n,&C);
//mp.clear();
for(i=1;i<=n;i++) {
scanf("%d%d",&p[i],&q[i]);
help[i]=p[i];
}
ll ansv=(ll)2*n*C;
int ans=n;
opt.clear();
for(i=1;i<=n;i++) ansv+=abs(p[i]-q[i]),rid[i]=i;
sort(help+1,help+1+n);
for(i=1;i<=n;i++) {
p[i]=lower_bound(help+1,help+1+n,p[i])-help;
q[i]=lower_bound(help+1,help+1+n,q[i])-help;
iv[p[i]]=i;
}
for(i=1;i<=n;i++) {
if(vis[i]) continue;
ans--,ansv-=2*C;
for(j=i;!vis[j];j=iv[q[j]]) {
vis[j]=1;
lst[iv[q[j]]]=j;
nxt[j]=iv[q[j]];
}
}
work();
printf("%lld %d\n",ansv/2,ans);
for(pii t:opt) printf("%d %d\n",t.fi,t.se);
}
int main()
{
int t;
scanf("%d",&t);
while(t) {
--t;
sol();
}
return 0;
}
/*
任意操作,不会合并两个环,因为这样会增加操作次数且难以减少代价
每次操作是选择两个点交换其出度,这样总会将原来的环分成两个独立的环
总操作次数仍为环长-1
于是答案有下界 1/2 * sigma(abs(p[i]-q[i])) + (n-置换环个数)*C
这要求每次选择的两个点 i,j (q[i]<q[j]) 应当满足 q[i]<=p[j]<=p[i]<=q[j]
每次选择 q 最大的点 x,一定存在点满足限制
否则这要么是自环要么根本不构成环
长度 <=2 的环容易计算,只考虑长度 >=3 的环
设连边情况为 ...->y[2]->y[1]->x->z[1]->z[2]->...
设 y[0]=z[0]=x,若 z[i>0] > y[1],交换 y[1] 和 z[i-1]
若 z[i>1] > z[1] ,交换 z[i] 和 z[1] 即可
同时找 y[i],z[i],一定能在不超过 len/2 次前找到合法的 y/z
复杂度即为 nlogn
每次都解决最大点所在的环即可
*/
详细
Test #1:
score: 100
Accepted
time: 454ms
memory: 11140kb
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 2616 308 270 3064 1220 704 692 704 2736 1847 736 1930 2215 1930 510 2400 1082 2400 584 1517 2327 330 197 330 892 1790 180 1790 718 2610 606 1460 723 2017 594 2017 245 2715 270 2715 170 2343 2773 2578 60 2578 2142 1095 764 2854 3025 1454 2609 1454 3114 1454 1771 1860 2485 1860 1903...
result:
ok ac (1000 test cases)
Test #2:
score: 0
Accepted
time: 511ms
memory: 11100kb
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 111370 197943 138351 193807 54506 193807 101256 52147 155777 109517 39985 199311 109048 199311 173518 96416 98032 96416 67822 96416 187136 96416 118088 76924 158884 76924 65279 171566 25127 171566 149102 126922 100871 126922 57396 141120 171025 156412 191791 29126 81214 136638 ...
result:
ok ac (5 test cases)
Test #3:
score: 0
Accepted
time: 473ms
memory: 10928kb
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