Doremy's City Construction (Codeforces 1764C)
Tags: Greedy, graphs

Doremy's new city is under construction! The city can be regarded as a simple undirected graph with $$$n$$$ vertices. The $$$i$$$-th vertex has altitude $$$a_i$$$. Now Doremy is deciding which pairs of vertices should be connected with edges.Due to economic reasons, there should be no self-loops or multiple edges in the graph.Due to safety reasons, there should not be pairwise distinct vertices $$$u$$$, $$$v$$$, and $$$w$$$ such that $$$a_u \leq a_v \leq a_w$$$ and the edges $$$(u,v)$$$ and $$$(v,w)$$$ exist.Under these constraints, Doremy would like to know the maximum possible number of edges in the graph. Can you help her?Note that the constructed graph is allowed to be disconnected.

Input: The input consists of multiple test cases. The first line contains a single integer $$$t$$$ ($$$1\le t\le 10^4$$$) — the number of test cases. The description of the test cases follows.The first line of each test case contains a single integer $$$n$$$ ($$$2 \le n \le 2\cdot 10^5$$$) — the number of vertices.The second line of each test case contains $$$n$$$ integers $$$a_1, a_2, \dots, a_n$$$ ($$$1\le a_i\le 10^6$$$) — the altitudes of each vertex.It is guaranteed that the sum of $$$n$$$ over all test cases does not exceed $$$2 \cdot 10^5$$$.

Output: For each test case, output the maximum possible number of edges in the graph.

Note: In the first test case, there can only be at most $$$3$$$ edges in the graph. A possible construction is to connect $$$(1,3)$$$, $$$(2,3)$$$, $$$(3,4)$$$. In the picture below the red number above node $$$i$$$ is $$$a_i$$$.The following list shows all such $$$u$$$, $$$v$$$, $$$w$$$ that the edges $$$(u,v)$$$ and $$$(v,w)$$$ exist.  $$$u=1$$$, $$$v=3$$$, $$$w=2$$$;  $$$u=1$$$, $$$v=3$$$, $$$w=4$$$;  $$$u=2$$$, $$$v=3$$$, $$$w=1$$$;  $$$u=2$$$, $$$v=3$$$, $$$w=4$$$;  $$$u=4$$$, $$$v=3$$$, $$$w=1$$$;  $$$u=4$$$, $$$v=3$$$, $$$w=2$$$. Another possible construction is to connect $$$(1,4)$$$, $$$(2,4)$$$, $$$(3,4)$$$.An unacceptable construction is to connect $$$(1,3)$$$, $$$(2,3)$$$, $$$(2,4)$$$, $$$(3,4)$$$. Because when $$$u=4$$$, $$$v=2$$$, $$$w=3$$$, $$$a_u\le a_v \le a_w$$$ holds, and the respective edges exist.

Sample Inputs:
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

Sample Outputs:
3
9
35
2

Solution (Python):
t = int(input())
r = []
for _ in range(t):
    n = int(input())
    a = list(map(int, input().split()))
    a.sort()
    m = a[n // 2]
    k = a.index(m)
    a.reverse()
    p = a[n // 2]
    l = a.index(p)
    r.append(max(k * (n - k), l * (n - l), n // 2))
print(*r)

Solution (Python):
t = int(input())
ans = []
for _ in range(t):
    n = int(input())
    altitude = list(map(int, input().split()))
    altitude.sort()
    mid = n // 2
    if altitude[0] == altitude[-1] == altitude[mid]:
        ans.append(mid)
        continue
    cut = 1
    for i in range(1, (n + 1) // 2):
        if altitude[mid - i] != altitude[mid]:
            cut = mid - i + 1
            break
        elif altitude[mid + i] != altitude[mid]:
            cut = mid + i
            break
    ans.append(max(mid, cut * (n - cut)))
print('\n'.join(map(str, ans)))

Solution (Python):
import sys
input = sys.stdin.readline
print = sys.stdout.write
t = int(input())
for _ in range(t):
    n = int(input())
    a = [0] + list(map(int, input().split()))
    a.sort()
    if all((a[i] == a[1] for i in range(1, n + 1))):
        print(f'{n // 2}\n')
        continue
    mid = n // 2 + 1
    if mid != n:
        while a[mid + 1] == a[mid]:
            mid += 1
            if mid == n:
                break
    if mid == n:
        maxx = 0
    else:
        maxx = mid * (n - mid)
    mid = n // 2 + 1
    while a[mid - 1] == a[mid]:
        mid -= 1
        if mid == 1:
            break
    if mid == 1:
        maxx = max(maxx, 0)
    else:
        maxx = max(maxx, (mid - 1) * (n - mid + 1))
    print(f'{maxx}\n')