ARC C 求调
  • 板块学术版
  • 楼主Rzsesy
  • 当前回复4
  • 已保存回复4
  • 发布时间2023/1/22 22:03
  • 上次更新2023/10/24 03:18:39
查看原帖
ARC C 求调
785117
Rzsesy楼主2023/1/22 22:03
#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm>

using namespace std;

const long long N = 5010;

int T;
int n;
int a[N], b[N];
vector<int> wz[N];

int main(){
	
	scanf("%d", &T);
	while(T--){
		scanf("%d", &n);
		for(int i = 1; i <= n; i++){
			scanf("%d", &a[i]);
		}
		for(int i = 1; i <= n; i++){
			scanf("%d", &b[i]);
		}
		bool ans = 0;
		for(int i = 0; i < n; i++){
			
			for(int j = 1; j <= n; j++){
				wz[j].clear();
			}
			for(int j = 1; j <= n; j++){
				wz[a[j]].push_back(j);
			}
			
			bool tans = 1;
			int minn = 0;
			for(int j = 1; j <= n; j++){
				if(j < minn || a[j] != b[j]){
					int at = lower_bound(wz[b[j]].begin(), wz[b[j]].end(), max(minn, j)) - wz[b[j]].begin();
					if(at == wz[b[j]].size()){
						tans = 0;
						break;
					}else{
						minn = wz[b[j]][at];
					}
				}
			}
			
			if(tans){
				ans = 1;
				break;
			}
			
			int asw = a[1], bsw = b[1];
			for(int j = 1; j < n; j++){
				a[j] = a[j+1];
				b[j] = b[j+1];
			}
			a[n] = asw;
			b[n] = bsw;
//			for(int j = 1; j <= n; j++){
//				printf("%d ", a[j]);
//			}
//			puts("");
		}
		if(ans){
			puts("Yes");
		}else{
			puts("No");
		}
	}
	
	return 0;
}

ac 26个,wa34个。

思路是枚举断环成链,然后依次考虑每一位要从后方的哪里“推”过来。

2023/1/22 22:03
加载中...