首页 > 其他分享 >S - 数据结构复习 E. 第K大和

S - 数据结构复习 E. 第K大和

时间:2023-10-18 22:26:07浏览次数:24  
标签:return 复习 int rep long inline 数据结构 define

题目链接

妙妙题!

难度:Medium-

题意

给定一个 \(1\sim n\) 的全排列 \(A_1,A_2,\cdots,A_n\)。给定一个 \(k\),统计所有长度 \(\geq k\) 的子区间的第 \(k\) 大的数的和。

\(n\leq 5\times 10^5\),\(k\leq \min(n,80)\)。

题解

考虑如果 \(k=1\) 怎么做。

显然算每个数对答案的贡献,然后求出左右两边第一个比 \(A_i\) 大的位置 \(L\) 和 \(R\),则 \(A_i\) 对答案的贡献为 \((i-L)\times (R-i)\)。

考虑拓展到 \(k>1\) 的做法。

可以从小到大考虑 \(A_i\) 的值,每次算完贡献就把 \(A_i\) 删掉,这样数列中剩下的就都是比 \(A_i\) 大的数了。

如果可以求出 \(i\) 往前 \(k\) 个比 \(A_i\) 大的位置和后面 \(k\) 个比 \(A_i\) 大的位置的话,就可以 \(\mathcal{O}(k)\) 算出答案了。

这个可以用链表维护。时间复杂度 \(\mathcal{O}(nk)\)。

代码

#include <bits/stdc++.h>
#define int long long
#define rep(i, j, k) for (int i = (j); i <= (k); i++)
#define per(i, j, k) for (int i = (j); i >= (k); i--)
#define ll long long
#define vi vector<int>
#define sz(a) ((int)(a.size()))
#define mset(f, x) memset(f, x, sizeof(f))
#define ALL(x) (x).begin(), (x).end()
#define rALL(x) (x).rbegin(), (x).rend()
#define uni(x) x.resize(unique(ALL(x)) - x.begin())
#define ull unsigned long long
#define pii pair<int, int>
using namespace std;
inline int min(int x, int y) { return x < y ? x : y; }
inline int max(int x, int y) { return x > y ? x : y; }
inline void chmin(int &x, int y)
{
    if (y < x)
        x = y;
}
inline void chmax(int &x, int y)
{
    if (y > x)
        x = y;
}
const int N = 5e5 + 10;
int n, k, a[N], pos[N];
int pre[N], nxt[N];
vector<int> vecL, vecR;
void Main()
{
    cin >> n >> k;
    rep(i, 1, n)
    {
        cin >> a[i];
        pos[a[i]] = i;
        pre[i] = i - 1;
        nxt[i] = i + 1;
    }
    int ans = 0;
    rep(x, 1, n)
    {
        int p = pos[x];
        vecL.clear();
        vecR.clear();
        int u = p;
        rep(t, 1, k + 1)
        {
            vecL.push_back(u);
            u = pre[u];
            if (u < 1)
            {
                if (t <= k)
                    vecL.push_back(u);
                break;
            }
        }
        u = p;
        rep(t, 1, k + 1)
        {
            vecR.push_back(u);
            u = nxt[u];
            if (u > n)
            {
                if (t <= k)
                    vecR.push_back(u);
                break;
            }
        }
        rep(l, 1, k)
        {
            int r = k + 1 - l;
            if (l < sz(vecL) && r < sz(vecR))
                ans += x * (vecL[l - 1] - vecL[l]) * (vecR[r] - vecR[r - 1]);
        }
        // cerr << ans << endl;
        pre[nxt[p]] = pre[p];
        nxt[pre[p]] = nxt[p];
    }
    cout << ans << "\n";
}
signed main()
{
    ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
    int t = 1;
    cin >> t;
    while (t--)
        Main();
    return 0;
}

标签:return,复习,int,rep,long,inline,数据结构,define
From: https://www.cnblogs.com/Jerry-Jiang/p/17773465.html

相关文章

  • 数据结构——图
    图的基本概念图是由顶点集合及顶点间的关系组成的一种数据结构:G=(V,E)其中:顶点集合V,边集合EV={x|x属于某个数据对象集}E={(x,y)|x,y属于V}(x,y)表示点x到点y的一条双向通路,是无方向的顶点:图中的节点,第几个顶点记作vi两个顶点vi和vj相关联称为顶点vi到顶点vj之间的一条边图分为有向图和......
  • 小白学算法-什么是矩阵数据结构以及有哪些应用?
    什么是矩阵数据结构以及有哪些应用矩阵表示按行和列的顺序排列的数字的集合。必须将矩阵的元素括在圆括号或方括号中。例如:具有9个元素的矩阵如下所示。该矩阵M有3行和3列。矩阵M的每个元素都可以通过其行号和列号来引用。例如,M[2][3]=6。矩阵是由行和列组成的二维数组。......
  • 3.1-Pandas数据结构
    3.1-Pandas数据结构  3.1.1认识Pandas库¶基于Numpy的一种工具,为解决数据分析任务而创建的,纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具基本上你能用Excel或者Bi工具进行的数据处理,Pandas也都能实现,而且更快 In [ ]:......
  • 【数据结构】7.平衡搜索树(AVL树和红黑树)
    0.概述对于普通的搜索树,如果一直插入比第一个元素小的元素,它会退化成一个无限向左下角眼神的单链表,使得时间复杂度退化为O(n)。如果我们在插入时保持树的结构是平衡的,则可以保证查找、插入和删除的时间复杂度有对数级的时间性能,下面讲到的AVL树和红黑树都是平衡搜索树,通过旋......
  • 1数据结构
    数据结构数据结构是一门研究非数值计算的程序设计问题中的操作对象,以及它们之间的关系和操作等相关问题的学科。基本概念数据:是描述客观事物的符号,是计算机中可以操作的对象,是能被计算机识别,并输入给计算机处理的符号集合。数据元素:是组成数据的、有一定意义的基本单位,在计算......
  • C#学习笔记--数据结构、泛型、委托事件等进阶知识点
    C#进阶简单数据结构类ArrayList元素类型以Object类型存储,支持增删查改的数组容器。因而存在装箱拆箱操作,谨慎使用。//ArrayListArrayListarray=newArrayList();//增=================array.Add("Hello");array.Add(true);array.Add("Tony");//添加单个元素array.Add(......
  • TARJAN复习 求强连通分量、割点、桥
    TARJAN复习求强连通分量、割点、桥目录TARJAN复习求强连通分量、割点、桥强连通分量缩点桥割点感觉之前写的不好,再水一篇博客强连通分量“有向图强连通分量:在有向图G中,如果两个顶点vi,vj间(vi>vj)有一条从vi到vj的有向路径,同时还有一条从vj到vi的有向路径,则称两个顶点强连通(......
  • 十天学完基础数据结构-第四天(链表(Linked List))
    链表的基本概念链表是一种线性数据结构,与数组不同,链表的元素(节点)之间通过指针相互连接。链表有以下基本概念:节点:链表中的每个数据项称为节点,每个节点包含数据和一个指向下一个节点的指针。头节点:链表的第一个节点称为头节点,它通常用来表示整个链表的起始位置。尾节点:链表的最后一个......
  • 数据结构
    数据结构数据结构是一门研究非数值计算的程序设计问题中的操作对象,以及它们之间的关系和操作等相关问题的学科。基本概念数据:是描述客观事物的符号,是计算机中可以操作的对象,是能被计算机识别,并输入给计算机处理的符号集合。数据元素:是组成数据的、有一定意义的基本单位,在计算......
  • 每天5分钟复习OpenStack(五)CPU虚拟化
    KVM虚拟化之CPU虚拟化存在是为了更高效的利用物理机的资源,而虚拟机技术主要是针对三大组件,分别是CPU虚拟化、存储虚拟化、网络虚拟化。下面我们分别介绍下三大组件的常用知识。CPU虚拟化1.1CPU虚拟化支持KVM的虚拟化是需要CPU硬件支持的。还记得我们在前面的章节讲过......