题意是给你一串数,除了a[u]<=a[v]<=a[w]中,(u,v)和(v,w)之间不可以连边,其他边之间都可以连边,问你最多可以连多少条边?
分析:
这个题首先我没有任何思路...然后我就又想到了环,有些思维定势了,总时往并查集啥啥的方向去想,其实题目是很灵活的好不啦
其实应该发掘一下题目的本质,我也发现了。
应该三个数中有一个:小大小 大小大的这样的一个关系
所以我们首先对这一串数进行排序,前面的数都是小于后面的,说实话都可以连
所以划分成一个二分图的样子。
总共有两个部分,保证了一个部分里面的每一个数都要严格小于另一边的每一个数,然后把两个部分的每条边都连接起来,就能保证小大小 大小大全部满足情况,还不会有递增的情况出现。
所以对排好序的数组进行枚举:i*(n-i)就是每一次的答案,如果有相同的数,不可以被放两边
其实为什么可以用二分图呢
因为在序列中,有一些数是不可以被相连起来的,有一些是可以的,正好符合这样的一个关系。
下面看代码:
//#pragma GCC optimize(1)
//#pragma GCC optimize(2)
//#pragma GCC optimize(3,"Ofast","inline")
#define IOS ios::sync_with_stdio(false), cin.tie(0);
#include<iostream>
#include<map>
#include<set>
#include<cstdio>
#include<cstring>
#include<vector>
#include<stack>
#include<algorithm>
#include<cmath>
#include<queue>
#include<deque>
using namespace std;
#define int long long
typedef long long ll;
typedef pair<int,int> PAII;
const int N=2e6+10,M=5050,INF=1e18,mod=998244353;
int a[N];
signed main(){
//IOS;
int T;
//T=1;
cin>>T;
while(T--)
{
int n;
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
int pos=a[1];
int f=1;
for(int i=1;i<=n;i++)
{
if(a[i]==pos) continue;
else
{
f=0;
break;
}
}
if(f==1)
{
cout<<n/2<<"\n";
continue;
}
sort(a+1,a+n+1);
int maxn=-1;
for(int i=1;i<=n;i++)
{
int j=i;
while(j<=n&&a[j]==a[i]) j++;
maxn=max(maxn,(j-1)*(n-j+1));
i=j-1;
}
cout<<maxn<<"\n";
}
return 0;
}
/*
*/