C. Doremy‘s City Construction(思维)

Problem - C - Codeforces

Doremy的新城市正在建设中! 这个城市可以被看作是一个有n个顶点的简单无向图。第i个顶点的高度为ai。现在,多雷米正在决定哪些顶点对应该用边连接。

由于经济原因,图中不应该有自循环或多条边。

由于安全原因,不应该有成对的不同顶点u、v和w,使au≤av≤aw和边(u,v)和(v,w)存在。

在这些约束条件下,Doremy想知道图中最大可能的边数。你能帮助她吗?

请注意,所构建的图允许是不连接的。

输入
输入由多个测试案例组成。第一行包含一个整数t(1≤t≤104)--测试案例的数量。测试用例的描述如下。

每个测试用例的第一行包含一个整数n(2≤n≤2⋅105)--顶点的数量。

每个测试案例的第二行包含n个整数a1,a2,...,an(1≤ai≤106)--每个顶点的高度。

保证所有测试案例的n之和不超过2⋅105。

输出
对于每个测试案例,输出图中最大可能的边数。

例子
inputCopy
4
4
2 2 3 1
6
5 2 3 1 5 2
12
7 2 4 9 1 4 6 3 7 4 2 3
4
1000000 1000000 1000000 1000000
输出拷贝
3
9
35
2

 题解:
题中说不允许出现三条边相连类似,wi <= wj <= wk的形式

那我们就构造不是这样的形式即可

记录每个f[x]的值

遍历f[x],找到小于x的值有l多少,与大于x的值r有多少

理论上每个大于x的值,两边是随便放x的值,与小于x的值的,一个大于x的值,可以构建l + f[x]条边,

那么r个大于的值,就可以构建(l + f[x])*r条边

还有一种情况,所有点值相等,n/2

#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
#include<map>
#include<vector>
#include<queue>
using namespace std;
#define int long long
//1 1 3 3 3
void solve()
{
	map<int,int> f;
	int n;
	cin >> n;
	for(int i = 1;i <= n;i++)
	{
		int x;
		cin >> x;
		f[x] ++;
	}
	int s = 0;
	int ans = 0;
	for(auto [k,v]:f)
	{
		s += v;
		ans = max(s*(n-s),ans);
	}
	if(ans == 0)
	{
		ans = n/2;
	}
	cout<<ans<<"\n";
}
signed main()
{
//	ios::sync_with_stdio(false);
//	cin.tie(0);
//	cout.tie(0);
	int t = 1;
	cin >> t;
	while(t--)
	{
		solve();
	}
}
//5 7
//2
//3 1
//4

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值