这一场打的非常一般,不过把D想出来了(当然只剩10min没有写出来)。

A.Hard Way

  • 题意:(很怪的题,我读题读半天)给你一个三角形(端点都在整数点上),问从x轴往上划线(不一定垂直)画不到的点集的长度。
  • 思路:输出题目还说一堆浮点数误差(可是根本用不到double),就是判断是否存在两个点y相同,而且另外一个点的y小鱼他们然后就是这两个点x的距离,否则就是0

B.Power Walking

  • 页面:cj

C. Great Sequence

  • 题意:求加最少的数使得数列中所有数都能够成功配对(配对的两个数要有x倍关系)
  • 思路:首先消掉能配对的然后剩下的数互相都不能配对,然后答案就是剩下数的个数。我用的是排序+二分(对于相同的数从前往后用,用了就标记一下)

D.Repetitions Decoding

  • 题意:给你一个数列,每次操作在中间插入两个相同的数,问你能否构造出由连续多个“对等数列”构成的数列(长度\(2*k\),其中\(a_i=a_i+k\)
  • 思路:发现一个性质:对于数列前x个数\(a_1,a_2,a_3...a_x\)值按从前到后的顺序一次再上一次的中间插入(这样x次),得到\(a_1,a_2...a_x,a_1,a_2...a_x,a_x,a_x,a_{x-1}...,a_2,a_1\)然后发现前\(\frac{2}{3}\)个构成了“对等数列”,然后后面刚好给a的前x个反序,然后就有了reverse操作。
    先判无解后,我们排序构造出一个目标的合法序列。然后从后往前还原,比如当前第x位,先在前x-1位中找到该值的位置p,然后reverse(p),值此时转到第一个再reverse(x),这样也不会影响到x+1……n个。
    代码调了很久又是因为val写成了a
  • code:
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
int as[N],ts,dd,val[N],a[N],b[N],t[N],m,L=0,p[N],c[N],kk;
set<int> S[N];
void Rev(int x) {
	int tmp=L+x;
	for(int i=1;i<=x;i++) {
		p[++kk]=tmp++;c[kk]=a[i];
	}
	for(int i=1;i<=x;i++) t[i]=a[i];
	for(int i=1;i<=x;i++) {a[i]=t[x-i+1];}
	L+=x*2;m+=x*2;
	as[++ts]=x*2;
}
int main() {
//	freopen("data.in","w",stdout);
	int T;scanf("%d",&T);
	while(T--) {
		ts=L=kk=0;
		int n;scanf("%d",&n);m=n;
		for(int i=1;i<=n;i++) scanf("%d",&a[i]),val[i]=a[i];
//		printf("%d\n",n);
//		for(int i=1;i<=n;i++) printf("%d ",a[i]);puts("");
		int cnt=0,tot=0;bool flag=1;
		sort(val+1,val+1+n);
		val[n+1]=-1;
		for(int i=1;i<=n+1;i++) {
			if(val[i]!=val[i-1]) {
				if(cnt&1) {flag=0;break;}
				for(int j=1;j<=cnt/2;j++)b[++tot]=val[i-1];
				cnt=1;
			}
			else cnt++;
		}
		if(!flag) {printf("-1\n");continue;}
		for(int i=1;i<=n/2;i++) b[i+(n/2)]=b[i];
//		for(int i=1;i<=n;i++)printf("%d ",b[i]);puts("");
		for(int i=n;i>1;i--) {
			if(a[i]==b[i])continue;
			for(int j=1;j<i;j++) if(a[j]==b[i]) {
				Rev(j);Rev(i);break;
			}
		}
//		for(int i=1;i<=n;i++)printf("%d ",a[i]);puts("");
		printf("%d\n",kk);
		for(int i=1;i<=kk;i++) {
			printf("%d %d\n",p[i],c[i]);
		}
		as[++ts]=n;
		printf("%d\n",ts);
		for(int i=1;i<=ts;i++) printf("%d ",as[i]);puts("");
	}
	return 0;
}