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,11,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,11,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;
}
相关推荐
Bruce_Liuxiaowei2 小时前
Python 实例赋值遮蔽类属性:一个从不报错的静默陷阱
开发语言·python·语法糖
aramae3 小时前
MySQL内置函数(7)
开发语言·笔记·后端·mysql·其他
91刘仁德6 小时前
C++ 继承和多态 设计模式
c语言·c++·笔记
码行山野赴时序归途6 小时前
链表家族收官篇:循环链表
c语言·开发语言·数据结构·链表
景熙55236 小时前
单体项目编写思路和落地形式
java·开发语言
库玛西6 小时前
哈夫曼树与前缀编码:数据压缩的贪心核心
c语言·c++·笔记·考研
计算机毕设定制辅导-无忧学长7 小时前
《基于SpringBoot的未成年人健康知识科普平台的设计与实现》
java·开发语言·vue.js·spring boot·未成年人健康知识科普平台
Ivanqhz7 小时前
Ping-Pong 双缓冲
开发语言·人工智能·python·深度学习·mlir
m0_734571767 小时前
深入理解C++ RAII
开发语言·c++
泡海椒7 小时前
jquick-pdf 表格实战:动态数据 PDF 报表生成
java·开发语言·pdf