QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#419888#4424. Babushka and her pierogiOvO_ZuoAC ✓511ms11140kbC++143.0kb2024-05-24 12:17:392024-05-24 12:17:41

Judging History

This is the latest submission verdict.

  • [2024-05-24 12:17:41]
  • Judged
  • Verdict: AC
  • Time: 511ms
  • Memory: 11140kb
  • [2024-05-24 12:17:39]
  • Submitted

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