当前位置: 首页 > article >正文

Maximum Crossings (Hard Version)最大交叉次数(困难版本)

time limit per test

1 second

memory limit per test

256 megabytes

The only difference between the two versions is that in this version n≤2⋅105n≤2⋅105 and the sum of nn over all test cases does not exceed 2⋅1052⋅105.

A terminal is a row of nn equal segments numbered 11 to nn in order. There are two terminals, one above the other.

You are given an array aa of length nn. For all i=1,2,…,ni=1,2,…,n, there should be a straight wire from some point on segment ii of the top terminal to some point on segment aiai of the bottom terminal. You can't select the endpoints of a segment. For example, the following pictures show two possible wirings if n=7n=7 and a=[4,1,4,6,7,7,5]a=[4,1,4,6,7,7,5].

A crossing occurs when two wires share a point in common. In the picture above, crossings are circled in red.

What is the maximum number of crossings there can be if you place the wires optimally?

Input

The first line contains an integer tt (1≤t≤10001≤t≤1000) — the number of test cases.

The first line of each test case contains an integer nn (1≤n≤2⋅1051≤n≤2⋅105) — the length of the array.

The second line of each test case contains nn integers a1,a2,…,ana1,a2,…,an (1≤ai≤n1≤ai≤n) — the elements of the array.

The sum of nn across all test cases does not exceed 2⋅1052⋅105.

Output

For each test case, output a single integer — the maximum number of crossings there can be if you place the wires optimally.

Example

Input

Copy

 

4

7

4 1 4 6 7 7 5

2

2 1

1

1

3

2 2 2

Output

Copy

6
1
0
3

Note

The first test case is shown in the second picture in the statement.

In the second test case, the only wiring possible has the two wires cross, so the answer is 11.

In the third test case, the only wiring possible has one wire, so the answer is 00.


每个测试的时间限制 1 秒
每个测试的内存限制 256 兆字节
两个版本之间的唯一区别是,在这个版本中 n≤2⋅105
并且所有测试用例的 n
之和不超过 2⋅105

终端是一行 n
个相等的线段,按顺序编号为 1
到 n
。有两个终端,一个在另一个之上。

给定一个长度为 n
的数组 a
。对于所有 i=1,2,…,n
,应该有一条直线从顶部终端的线段 i
上的某个点到底部终端的线段 ai
上的某个点。您无法选择线段的端点。例如,如果 n=7
和 a=[4,1,4,6,7,7,5]
,以下图片显示了两种可能的布线。

当两根线共享一个共同点时,就会发生交叉。在上图中,交叉点用红色圆圈圈出。

如果以最佳方式放置电线,则最多可以有多少个交叉点?

输入
第一行包含一个整数 t
(1≤t≤1000
) — 测试用例的数量。

每个测试用例的第一行包含一个整数 n
(1≤n≤2⋅105
) — 数组的长度。

每个测试用例的第二行包含 n
个整数 a1,a2,…,an
(1≤ai≤n
) — 数组的元素。

所有测试用例的 n
之和不超过 2⋅105

输出
对于每个测试用例,输出一个整数 — 如果以最佳方式放置电线,则最多可以有多少个交叉点。

示例
InputCopy
4
7
4 1 4 6 7 7 5
2
2 1
1
1
3
2 2 2
OutputCopy
6
1
0
3
注意
第一个测试用例显示在语句中的第二张图片中。

在第二个测试用例中,唯一可能的接线是两根电线交叉,因此答案是 1

在第三个测试用例中,唯一可能的接线是一根电线,因此答案是 0

 代码:
 

#include <iostream>
#include <vector>
using namespace std;

class FenwickTree {
public:
    FenwickTree(int n) : tree(n + 1, 0) {}

    void update(int idx, int delta) {
        while (idx < tree.size()) {
            tree[idx] += delta;
            idx += idx & (-idx);
        }
    }

    int query(int idx) {
        int sum = 0;
        while (idx > 0) {
            sum += tree[idx];
            idx -= idx & (-idx);
        }
        return sum;
    }

private:
    vector<int> tree;
};

int main() {
    int t;
    cin >> t;
    vector<long long> results(t);

    for (int test_case = 0; test_case < t; test_case++) {
        int n;
        cin >> n;
        vector<int> a(n);

        for (int i = 0; i < n; i++) {
            cin >> a[i];
        }

        FenwickTree fenwick(n);
        long long result = 0;

        for (int i = n - 1; i >= 0; i--) {
            result += fenwick.query(a[i]);
            fenwick.update(a[i], 1);
        }

        results[test_case] = result;
    }

    for (long long result : results) {
        cout << result << endl;
    }

    return 0;
}


http://www.kler.cn/a/451372.html

相关文章:

  • 实现 QTreeWidget 中子节点勾选状态的递归更新功能只影响跟节点的状态父节点状态不受影响
  • “高精度算法”思想 → 大数阶乘
  • EMS(energy managment system)从0到1
  • 运动控制卡网络通讯的心跳检测之C#上位机编程
  • flask基础
  • SecureCRT汉化版
  • ROS1入门教程5:简单行为处理
  • 【es6复习笔记】生成器(11)
  • C++-------回溯最大最小算法
  • Word表格批量添加题注代码
  • 反汇编一个简单的C程序
  • MySQL的架构设计和设计模式
  • 面试记录24年新
  • 乐乐音乐Flutter版
  • OceanBase之primary_one概念学习
  • call、bind、apply的区别
  • Python OCR 文字识别
  • 基于若依的ruoyi-nbcio-plus支持VForm3表单字段数据保存到数据库的一种方法——全网首创(二)
  • 外包干了两年,技术退步明显。。。。
  • 时钟芯片入门指南:从原理到实践
  • 作业帮基于 Apache DolphinScheduler 3_0_0 的缺陷修复与优化
  • HarmonyOS Next 应用元服务开发-分布式数据对象迁移数据文件资产迁移
  • 力扣-图论-18【算法学习day.68】
  • 掌握 Ansys ACP 中的参考方向:简化复杂的复合材料设计
  • 怎么设置电脑密码?Windows和Mac设置密码的方法
  • RPC入门教学(一) ———— RPC介绍与protobuf的介绍与使用