C. Make Equal Again

time limit per test

2 seconds

memory limit per test

256 megabytes

You have an array aa of nn integers.

You can no more than once apply the following operation: select three integers ii, jj, xx (1≤i≤j≤n1≤i≤j≤n) and assign all elements of the array with indexes from ii to jj the value xx. The price of this operation depends on the selected indices and is equal to (j−i+1)(j−i+1) burles.

For example, the array is equal to [1,2,3,4,5,1][1,2,3,4,5,1]. If we choose i=2,j=4,x=8i=2,j=4,x=8, then after applying this operation, the array will be equal to [1,8,8,8,5,1][1,8,8,8,5,1].

What is the least amount of burles you need to spend to make all the elements of the array equal?

Input

The first line contains a single integer tt (1≤t≤1041≤t≤104) --- the number of input test cases. The descriptions of the test cases follow.

The first line of the description of each test case contains a single integer nn (1≤n≤2⋅1051≤n≤2⋅105) --- the size of the array.

The second line of the description of each test case contains nn integers a1,a2,...,ana1,a2,...,an (1≤ai≤n1≤ai≤n) --- array elements.

It is guaranteed that the sum of nn for all test cases does not exceed 2⋅1052⋅105.

Output

For each test case, output one integer --- the minimum number of burles that will have to be spent to make all the elements of the array equal. It can be shown that this can always be done.

Example

Input

Copy

复制代码

8

6

1 2 3 4 5 1

7

1 1 1 1 1 1 1

8

8 8 8 1 2 8 8 8

1

1

2

1 2

3

1 2 3

7

4 3 2 7 1 1 3

9

9 9 2 9 2 5 5 5 3

Output

Copy

复制代码
4
0
2
0
1
2
6
7

4

解题说明:此题采用贪心算法,首先分别找出头部第一个和前面不同的数字,尾部第一个和后面不同的数字。如果头尾两个数字一样,那只需要把中间不相同的数字全部搞成一样即可。否则就区分情况,要么是把前面数字搞成和尾部数字一样,要么是把后面数字搞成和头部数字一样,两者比较求最小值即可。

cpp 复制代码
#include <stdio.h>

int main()
{
	int t, i, j, n, head, tail;
	scanf("%d", &t);
	for (i = 0; i < t; i++)
	{
		scanf("%d", &n);
		int a[200007];
		for (j = 0; j < n; j++)
		{
			scanf("%d", &a[j]);
		}
		for (j = 1; j < n; j++)
		{
			if (a[j] != a[0])
			{
				break;
			}
		}
		head = j;
		for (j = n - 1; j >= 0; j--)
		{
			if (a[j] != a[n - 1])
			{
				break;
			}
		}
		tail = j;
		if (a[0] == a[n - 1])
		{
			if (head == n)
			{
				printf("0\n");
			}
			else
			{
				printf("%d\n", tail - head + 1);
			}
		}
		else
		{
			if (n - head < tail + 1)
			{
				printf("%d\n", n - head);
			}
			else
			{
				printf("%d\n", tail + 1);
			}
		}
	}
	return 0;
}
相关推荐
Liknana几秒前
C++ shared_ptr 动态内存
开发语言·c++
Daking-2 分钟前
「STL::array」标准库容器:array(数组)介绍(C++)
开发语言·c++
我喜欢就喜欢5 分钟前
基于qt vs下的视频播放
开发语言·qt·音视频
过期的H2O225 分钟前
【H2O2|全栈】JS进阶知识(四)Ajax
开发语言·javascript·ajax
王俊山IT34 分钟前
C++学习笔记----10、模块、头文件及各种主题(二)---- 预处理指令
开发语言·c++·笔记·学习
Json____1 小时前
python的安装环境Miniconda(Conda 命令管理依赖配置)
开发语言·python·conda·miniconda
幼儿园园霸柒柒1 小时前
第七章: 7.3求一个3*3的整型矩阵对角线元素之和
c语言·c++·算法·矩阵·c#·1024程序员节
好想有猫猫1 小时前
【51单片机】串口通信原理 + 使用
c语言·单片机·嵌入式硬件·51单片机·1024程序员节
2401_858286111 小时前
C6.【C++ Cont】cout的格式输出
开发语言·c++
海害嗨1 小时前
牛客网Java高频面试题(2024最新版含答案)
java·开发语言