CF1973E Cat, Fox and Swaps 题解

题意:对于一个长度为 \(n\) 的排列,求有多少对 \((l,r)\) 满足 \(1 \le l,r \le 2n\),且可以通过交换任意次 \(x,y(l \le x+y \le r)\) 使得原排列升序。

首先我们可以找到 \(i \ne a_i\) 的最小和最大的 \(i\),假设为 \(L\)\(R\)。若不存在则说明已经升序。

会发现满足条件的必要条件是:\(l \le L + n,r \ge R + 1\)

神奇的是若除开 \(l=r\) 的情况,上述条件也是充分条件,证明如下:

对于一个数 \(L \le x \le R-1\),我们先找到一个 \(y\) 满足 \(l \le y < r\)\(1 \le y-x \le n\),这个 \(y\) 一定存在的。那么我们可以通过交换 \((x,y-x),(y-x,x+1),(x,y-x)\) 达到交换 \((x,x+1)\) 的目的。即对于任意的 \(L \le x \le R\),我们都能做到交换 \((x,x+1)\)(并且其它数的位置不变),显然这一定能使原序列排序。

注意当 \(l=r\) 的情况时上述条件不一定成立,需要特殊考虑一下。

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int MAXN = 1e5 + 10;
int n,T,a[MAXN];
signed main() {
	for(cin >> T;T;T--) {
		cin >> n;
		int l = -1,r = -1,ans = 0,flag = 0;
		for(int i = 1;i <= n;i++) cin >> a[i];
		for(int i = 1;i <= n;i++) 
			if(a[i] != i) {
				if(flag == -1) break;
				if(flag == 0) flag = a[i] + i;
				else if(flag != a[i] + i) flag = -1;
			} 
		for(int i = 1;i <= n;i++) if(a[i] != i) r = i;
		for(int i = n;i >= 1;i--) if(a[i] != i) l = i;
		if(l == -1) l = 2 * n,r = 1;
		else l = l + n,r = r + 1;
		for(int i = r;i <= 2 * n;i++)
			ans += min(i - 1,l);
		if(flag == 0) ans += 2 * n;
		if(flag > 0) ans += 1;
		cout << ans << endl; 
	}
	return 0;
}
posted @ 2024-05-20 17:35  Creeper_l  阅读(55)  评论(0编辑  收藏  举报
  1. 1 イエスタデイ(翻自 Official髭男dism) 茶泡饭,春茶,kobasolo
  2. 2 世间美好与你环环相扣 柏松
  3. 3 True love tired
  4. 4 一笑江湖 (DJ弹鼓版) 闻人听書_
  5. 5 最好的安排 曲婉婷
  6. 6 星星在唱歌 司南
  7. 7 山川 李荣浩
  8. 8 On My Way Alan Walker
  9. 9 百战成诗 王者荣耀·100英雄官方群像献礼歌
  10. 10 雪 Distance Capper / 罗言
  11. 11 Edamame bbno$ / Rich Brian
  12. 12 半生雪 七叔-叶泽浩
  13. 13 Catch My Breath Kelly Clarkson
  14. 14 Love Is Gone SLANDER / Dylan Matthew
  15. 15 Endless Summer Alan Walker / Zak Abel
  16. 16 悬溺 葛东琪
  17. 17 风吹丹顶鹤 葛东琪
  18. 18 Normal No More TYSM
  19. 19 哪里都是你 队长
  20. 20 Stronger Kelly Clarkson
  21. 21 廖俊涛
  22. 22 消愁 毛不易
  23. 23 The Runner Yubik
  24. 24 踏山河 七叔-叶泽浩
  25. 25 Waiting For Love Avicii
  26. 26 在你的身边 盛哲
  27. 27 Dream It Possible Delacey
  28. 28 凄美地 郭顶
  29. 29 满天星辰不及你 ycc
  30. 30 侧脸 于果
  31. 31 阿拉斯加海湾 蓝心羽
  32. 32 虞兮叹 闻人听書_
  33. 33 离别开出花 就是南方凯
  34. 34 盗墓笔记·十年人间 李常超 (Lao乾妈)
哪里都是你 - 队长
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.