CF1681C Double Sort 题解

一道普及-我写了两个半小时

题面

需要注意的是,每次交换需要将 a 和 b 两个数组同时交换,因此便可以想到唯一可行情况: a , b 序列数字间的大小关系必须一致。

举个例子

2 4 6 21 3 1 3

1 7 9 70 6 1 2

在上面的例子中,两个序列中任意 ij 满足 aiajbibj ,或者 aiajbibj ,此时上下同时交换这两个数的位置,前面的结论仍然成立。因此,便可以得到一个判断是否有解的部分代码。

flag = 1;
fr(i , 2 , n)
{
	if((a[i] <= a[i - 1] && b[i] <= b[i - 1]) || (a[i] >= a[i - 1] && b[i] >= b[i - 1]))
	{
		continue;
	}
	flag = 0;
}
if(!flag)
{
	printf("-1\n");
	continue;
}

对于同时交换两个数组的操作,考虑冒泡排序,由于 2n100 ,因此冒泡排序可以放心食用。

在每次交换时,判断只要 a 数组或者 b 数组满足交换条件,便可以同时交换,同时用一个 ans 数组记录交换次数及步骤。

由于是只要 a 数组或者 b 数组满足交换条件便同时交换,需要再遍历此时的两个数组是否依旧符合题意(不然就WA#2)。

还需要注意一点,输出的 k 必须不能超过 104 ,否则就直接输出 -1

这是我奇怪的代码。

#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
#define ld double
#define ll long long
#define maxx 200005
#define inf 0x3f3f3f3f
#define fr(i , a , b) for(ll i = a ; i <= b ; ++i)
#define fo(i , a , b) for(ll i = a ; i >= b ; --i)
#pragma comment(linker , "/stack : 200000000")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
using namespace std;
inline char gchar()
{
    static char buf[1000000] , *p1 = buf , *p2 = buf;
    return p1 == p2 && (p2 = (p1 = buf) + fread(buf , 1 , 1000000 , stdin) , p1 == p2) ? EOF : *p1++;
}
inline ll read()
{
    ll x = 0 , f = 1;
    char ch = gchar();
    while(ch < '0' || ch > '9')
	{
        if(ch == '-')
        {
        	f = -1;
		}
        ch = gchar();
    }
    while(ch >= '0' && ch <= '9')
	{
        x = (x << 1) + (x << 3) + (ch ^ 48);
        ch = gchar();
    }
    return x * f;
}
ll T , n , a[maxx] , b[maxx];
ll flag;
struct node
{
	ll i , j;
}ans[maxx];
signed main()
{
	T = read();
	while(T--)
	{
		n = read();
		fr(i , 1 , n)
		{
			a[i] = read();
		}
		fr(i , 1 , n)
		{
			b[i] = read();
		}
		flag = 1;
		fr(i , 2 , n)
		{
			if((a[i] <= a[i - 1] && b[i] <= b[i - 1]) || (a[i] >= a[i - 1] && b[i] >= b[i - 1]))
			{
				continue;
			}
			flag = 0;
		}
		if(!flag)
		{
			printf("-1\n");
			continue;
		}
		ll k = 0;
		fr(i , 1 , n)
		{
			fr(j , i + 1 , n)
			{
				if(a[i] > a[j] || b[i] > b[j])
				{
					swap(a[i] , a[j]);
					swap(b[i] , b[j]);
					ans[++k].i = i;
					ans[k].j = j;
				}
			}
		}
		flag = 1;
		fr(i , 2 , n)
		{
			if(b[i] < b[i - 1] || a[i] < a[i - 1])
			{
				flag = 0;
				break;
			}
		}
		if(flag && k <= 10000)
		{
			printf("%lld\n" , k);
			fr(i , 1 , k)
			{
				printf("%lld %lld\n" , ans[i].i , ans[i].j);
			}
		}
		else
		{
			printf("-1\n");
		}
	}
    return 0;
}
posted @   心海秋的墨木仄  阅读(40)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示