P10885 【MX-S3-T1】「FeOI Round 1」野心

题目背景

原题链接:https://oier.team/problems/S3A


外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

题目描述

给出一个 1 ∼ n 1 \sim n 1n 的排列 p p p,询问存在多少个数 i i i 1 ≤ i < n 1 \le i <n 1i<n)满足 [ p 1 , p 2 , ⋯   , p i ] [p_1,p_2,\cdots,p_i] [p1,p2,,pi] [ p i + 1 , p i + 2 , ⋯   , p n ] [p_{i+1},p_{i+2},\cdots,p_n] [pi+1,pi+2,,pn] 排序后都是等差数列。

输入格式

本题单个测试点内包含多组数据。

第一行一个整数 T T T 表示数据组数。

接下来,对于每组数据,格式如下:

第一行一个数 n n n 表示排列长度。

接下来一行 n n n 个数表示排列 p p p

输出格式

对于每组测试数据,输出一行一个数表示询问的答案。

输入输出样例 #1

输入 #1

2
4
1 3 2 4
5
1 5 3 2 4

输出 #1

3
3

输入输出样例 #2

输入 #2

4
6
2 1 4 3 6 5
6
1 2 3 4 5 6
3
1 3 2
1
1

输出 #2

2
5
2
0

输入输出样例 #3

输入 #3

6
2
1 2
20
16 2 10 18 4 6 8 20 14 12 3 9 17 13 1 15 7 11 19 5
9
3 4 1 5 2 6 7 8 9
10
1 3 2 4 7 6 5 8 10 9
13
5 7 3 11 1 9 13 6 10 4 2 8 12
5
1 2 3 4 5

输出 #3

1
1
4
5
1
4

说明/提示

【样例解释 #1】

第一组:三种拆分为 [ 1 , 3 , 2 ] [ 4 ] [1,3,2][4] [1,3,2][4] [ 1 , 3 ] [ 2 , 4 ] [1,3][2,4] [1,3][2,4] [ 1 ] [ 3 , 2 , 4 ] [1][3,2,4] [1][3,2,4]

第二组:三种拆分为 [ 1 ] [ 5 , 3 , 2 , 4 ] [1][5,3,2,4] [1][5,3,2,4] [ 1 , 5 ] [ 3 , 2 , 4 ] [1,5][3,2,4] [1,5][3,2,4] [ 1 , 5 , 3 ] [ 2 , 4 ] [1,5,3][2,4] [1,5,3][2,4]

【样例解释 #2】

第一组:两种拆分为 [ 2 , 1 ] [ 4 , 3 , 6 , 5 ] [2,1][4,3,6,5] [2,1][4,3,6,5] [ 2 , 1 , 4 , 3 ] [ 6 , 5 ] [2,1,4,3][6,5] [2,1,4,3][6,5]

第二组:每种拆分都是合法的。

第三组:每种拆分都是合法的。

第四组:不存在拆分方案,故没有方案合法。

【数据范围】

本题开启捆绑测试。

∑ n \sum n n 为单个测试点内所有的 n n n 之和。

对于 100 % 100\% 100% 的数据, 1 ≤ T ≤ 1 0 5 1 \le T \le 10^5 1T105 1 ≤ n ≤ 1 0 6 1 \le n \le 10^6 1n106 1 ≤ ∑ n ≤ 2 × 1 0 6 1 \le \sum n \le 2 \times 10^6 1n2×106,保证 p p p 是排列且 1 ≤ p i ≤ n 1 \le p_i \le n 1pin

子任务编号 $n $ $\sum n $ 分数
1 1 1 ≤ 1 0 3 \le 10^3 103 ≤ 5 × 1 0 3 \le 5\times 10^3 5×103 30 30 30
2 2 2 ≤ 1 0 5 \le 10^5 105 ≤ 5 × 1 0 5 \le 5\times 10^5 5×105 30 30 30
3 3 3 ≤ 1 0 6 \le 10^6 106 ≤ 2 × 1 0 6 \le 2\times 10^6 2×106 40 40 40

请使用较快的输入输出方式。

新增子任务 4 为 hack 数据,分值为 0 \boldsymbol{0} 0

C++实现

#include <bits/stdc++.h>
using namespace std;
int T,n,v,s,da,o,i,j,dan,ou;
int a[1000001],b[1000001],f[1000001],c[1000001],d[1000001];
int main(){
	cin>>T;
	while(T--){
		cin>>n;v=0;
		for(i=1;i<=n;i++) cin>>a[i];
		for(i=1;i<n;i++){
			int fl=0,k,j;
			for(j=1;j<=i;j++)
				b[j]=a[j];
			sort(b+1,b+i+1);
			if(i!=1){
				s=b[2]-b[1];
				for(j=2;j<i;j++)
					if(b[j+1]-b[j]!=s){
						fl=1;
						break;
					}
			}
			if(fl==1) continue;
			for(j=i+1,k=1;j<=n;j++,k++)
				b[k]=a[j];
			k--;
			sort(b+1,b+k+1);
			if(k!=1){
				s=b[2]-b[1];
				for(int j=2;j<k;j++)
					if(b[j+1]-b[j]!=s){
						fl=1;
						break;
					}
			}
			if(fl==1) continue;
			v++;
		}
		cout<<v<<"\n";
	}
}

在这里插入图片描述

后续

接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐