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;
}
相关推荐
CHANG_THE_WORLD5 小时前
c语言位运算 汇编代码分析
c语言·开发语言·汇编
立志成为大牛的小牛6 小时前
数据结构——二十二、并查集(王道408)
c语言·数据结构·笔记·学习·考研
x_feng_x6 小时前
Java从入门到精通 - 集合框架(二)
java·开发语言·windows
Le1Yu6 小时前
雪崩问题及其解决方案(请求限流、线程隔离、服务熔断、fallback、sentinel实现以上功能)
java·开发语言
大飞记Python6 小时前
Chromedriver放项目里就行!Selenium 3 和 4 指定路径方法对比 + 兼容写法
开发语言·python
std78796 小时前
用C++ 实现屏幕保护程序
开发语言·c++
tumu_C6 小时前
无用知识研究:在trailing return type利用decltype,comma operator在对函数进行sfinae原创 [二]
开发语言·c++·算法
jjjxxxhhh1236 小时前
【项目-】Qt + QCustomPlot 实现频谱监测仪:四图联动、高频信号注入、鼠标交互全解析
开发语言·qt·交互
web安全工具库6 小时前
告别刀耕火种:用 Makefile 自动化 C 语言项目编译
linux·运维·c语言·开发语言·数据库·算法·自动化
小小测试开发7 小时前
Python Arrow库:告别datetime繁琐,优雅处理时间与时区
开发语言·前端·python