题意:
给定n个点,然后连边,当a[i]<=a[j]<=a[k]时不能连,否则可以
问你最多连多少边
思路:
手动模拟一下可知,有些点在凹处,有些点在凸处,因此可以把结点划分成两种,所以这个图就是二分图
答案就是这个二分图里最多连边,肯定是左右两边连起来,因此答案就是乘积
那么哪些点是1哪些点是0我们不知道
因此我们取枚举分界线就好了,然后记录最大值
记得特殊情况的特判
当所有元素都是一样时,就不是二分图,此时边数为n/2
Code:
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int mxn=2e5+10;
map<int,int> mp;
int n,m;
int a[mxn],sum[mxn];
void solve(){
memset(sum,0,sizeof(sum));
mp.clear();
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i],mp[a[i]]++;
sort(a+1,a+1+n);
int len=unique(a+1,a+1+n)-(a+1);
if(len==1){
cout<<n/2<<'\n';
return;
}
for(int i=1;i<=len;i++) sum[i]=sum[i-1]+mp[a[i]];
int ans=-1;
for(int i=1;i<=len;i++){
ans=max(ans,sum[i]*(n-sum[i]));
}
cout<<ans<<'\n';
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int __=1;cin>>__;
while(__--)solve();return 0;
}