重新排序(蓝桥杯,acwing,差分)

题目描述:

给定一个数组 A 和一些查询 Li,Ri,求数组中第 Li至第 Ri 个元素之和。

小蓝觉得这个问题很无聊,于是他想重新排列一下数组,使得最终每个查询结果的和尽可能地大。

小蓝想知道相比原数组,所有查询结果的总和最多可以增加多少?

输入格式:

输入第一行包含一个整数 n。

第二行包含 n个整数 A1,A2,⋅⋅⋅,An相邻两个整数之间用一个空格分隔。

第三行包含一个整数 m表示查询的数目。

接下来 m行,每行包含两个整数 Li、Ri相邻两个整数之间用一个空格分隔。

输出格式:

输出一行包含一个整数表示答案。

数据范围:

对于 30% 的评测用例,n,m≤50;

对于 50% 的评测用例,n,m≤500;

对于 70% 的评测用例,n,m≤5000;

对于所有评测用例,1≤n,m≤1e5,1≤Ai≤1e6,1≤Li≤Ri≤n。

输入样例:

复制代码
5
1 2 3 4 5
2
1 3
2 5

输出样例:

复制代码
4

样例解释:

原来的和为 6+14=206+14=20,重新排列为 (1,4,5,2,3) 后和为 10+14=24,增加了 4。

分析步骤:

第一:拿到这道题目我们可以知道,要更新后得到的值越大的话,就要把最大的数放到用过最多的次数的位置,而用过一次就+1,用过一次就+1,这就又回到了我们的区间问题,我们可以用差分数组,将区间问题转化为两个点的问题,这样就大大减小了运算量。节约时间。

第二:书写主函数,构建整体架构。

输入值,输入查询的次数和位置。

cpp 复制代码
cin>>n;
    for(int i = 1; i <= n ; i ++){
        cin>>arr[i];
    }
    cin>>ask;
    while(ask--){
        cin>>x>>y;
        tet[x]++;
        tet[y+1]--;
    }

用一个for循环将差分数组的值计算下来,我们就可以得知每一个位置用了多少次

再用for去计算原本这个点的值 乘上 这个点所用过的次数就可以得到原本的答案

cpp 复制代码
for(int i =1 ; i <= n ; i++){
        tet[i] = tet[i-1] + tet[i];
    }
    for(int i =1 ; i <= n ; i ++){
        ans1 += (long long)tet[i]*arr[i];
    }

再将这两个数组排个序让他们都成单调的状态,这样大的值就可以用大的次数,小的值就用小的次数,这样得到的新答案就会是最大的!!!!

cpp 复制代码
sort(arr+1,arr+1+n);
    sort(tet+1,tet+1+n);
    for(int i =1 ; i <= n ; i ++){
        ans2 +=(long long) tet[i]*arr[i];
    }
    cout<<ans2-ans1;

代码:

cpp 复制代码
#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 1e5+10;

int n ; 
int arr[N];
int tet[N];
int ask;
int x,y;
long long ans1 , ans2;

int main()
{
    cin>>n;
    for(int i = 1; i <= n ; i ++){
        cin>>arr[i];
    }
    cin>>ask;
    while(ask--){
        cin>>x>>y;
        tet[x]++;
        tet[y+1]--;
    }
    for(int i =1 ; i <= n ; i++){
        tet[i] = tet[i-1] + tet[i];
    }
    for(int i =1 ; i <= n ; i ++){
        ans1 += (long long)tet[i]*arr[i];
    }
    sort(arr+1,arr+1+n);
    sort(tet+1,tet+1+n);
    for(int i =1 ; i <= n ; i ++){
        ans2 +=(long long) tet[i]*arr[i];
    }
    cout<<ans2-ans1;
    return 0;
}
相关推荐
wzdark42 分钟前
基于启发式搜索的最优路径规划算法研究4
算法
动词ing1 小时前
【学习笔记】数据结构栈与队列(栈先进后出+队列先进先出+括号匹配+消消乐模型)
数据结构·笔记·学习
l1t1 小时前
用superpi、tinypi、tpi等工具计算圆周率的比较
c语言·算法
t-think1 小时前
C++ string 类(上)—— string类初识与常用接口详解
开发语言·c++
a187927218311 小时前
【算法】链表(二):链表上的双指针——变速、异链与定距,和一份路程账本
数据结构·算法·leetcode·链表·go·指针·环形链表
cpp_learners1 小时前
C++ 实现责任链模式(Chain of Responsibility):从一堆 if-else 到可插拔的处理管道
开发语言·c++·责任链模式
郝学胜_神的一滴1 小时前
C++11 工程级应用 12:编译期类型魔法,干掉重复与臃肿的代码
c++·visual studio
2601_958352902 小时前
还要写 AEC 算法?0 代码 + 6 个引脚,F-18 让通话清晰度提升 300%
人工智能·算法·降噪消回音
happyprince2 小时前
03-regmix-深刻观-哲学与升华
算法
zcmodeltech2 小时前
火电厂模型能演示冷态启动和故障处理吗?——基于STM32与Modbus RTU的集控实训控制系统设计
数据结构·stm32·单片机·嵌入式硬件·能源