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;
}
相关推荐
fouryears_234172 小时前
Flutter InheritedWidget 详解:从生命周期到数据流动的完整解析
开发语言·flutter·客户端·dart
我好喜欢你~3 小时前
C#---StopWatch类
开发语言·c#
lifallen4 小时前
Java Stream sort算子实现:SortedOps
java·开发语言
IT毕设实战小研4 小时前
基于Spring Boot 4s店车辆管理系统 租车管理系统 停车位管理系统 智慧车辆管理系统
java·开发语言·spring boot·后端·spring·毕业设计·课程设计
cui__OaO5 小时前
Linux软件编程--线程
linux·开发语言·线程·互斥锁·死锁·信号量·嵌入式学习
鱼鱼说测试6 小时前
Jenkins+Python自动化持续集成详细教程
开发语言·servlet·php
艾莉丝努力练剑6 小时前
【洛谷刷题】用C语言和C++做一些入门题,练习洛谷IDE模式:分支机构(一)
c语言·开发语言·数据结构·c++·学习·算法
CHEN5_026 小时前
【Java基础面试题】Java基础概念
java·开发语言
Cx330❀8 小时前
【数据结构初阶】--排序(五):计数排序,排序算法复杂度对比和稳定性分析
c语言·数据结构·经验分享·笔记·算法·排序算法
杜子不疼.8 小时前
《Python学习之字典(一):基础操作与核心用法》
开发语言·python·学习