首页 > 其他分享 >蓝桥2128 重新排序(差分)

蓝桥2128 重新排序(差分)

时间:2024-11-29 16:37:47浏览次数:6  
标签:int 2128 差分 Li 蓝桥 数组 pair Ri first

给定一个数组A和一些查询Li和Ri,求数组第Li个至第Ri个元素之和。 小蓝觉得这个问题很无聊, 于是他想重新排列一下数组, 使得最终每个查询结果的和尽可能地大。小蓝想知道相比原数组, 所有查询结果的总和最多可以增加多少?

大致思路:m次查询,每次求Li至Ri之和,我们可以用差分统计每个位置被加多少次数,由贪心可知,次数多的位置放的数要尽可能大,按照这个要求排序就可以统计答案,减去原来的答案就是增加了多少。

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e5 + 10;
int n, m, a[N], s[N], c[N], ans1, ans2;
pair<int, int> q[N], b[N];
bool cmp1(int x, int y) {
    return x > y;
}
bool cmp2(pair<int, int> x, pair<int, int> y) {
    return x.first > y.first;
}
signed main() {
    cin >> n;
    for (int i = 1; i <= n; i ++) {
        cin >> a[i];
        s[i] = a[i] + s[i - 1];
    }
    cin >> m;
    for (int i = 1; i <= m; i ++) {
        int l, r; cin >> l >> r;
        q[i].first = l, q[i].second = r;
        b[l].first ++, b[r + 1].first --;
        ans1 += s[r] - s[l - 1];//统计最初的答案 
    }
    memset(s, 0, sizeof(s));
    for (int i = 1; i <= n; i ++) {
        b[i].second = i;
        b[i].first += b[i - 1].first;
    }
    sort(a + 1, a + n + 1, cmp1);
    sort(b + 1, b + n + 1, cmp2);
    for (int i = 1; i <= n; i ++) c[b[i].second] = a[i];
    for (int i = 1; i <= n; i ++) s[i] = c[i] + s[i - 1];
    for (int i = 1; i <= m; i ++) {
        int x = q[i].first, y = q[i].second;
        ans2 += s[y] - s[x - 1];//统计最优答案 
    }
    cout << ans2 - ans1 << '\n';
    return 0;
}

 

标签:int,2128,差分,Li,蓝桥,数组,pair,Ri,first
From: https://www.cnblogs.com/love-lzt/p/18577011

相关文章

  • 元器件选型与参数11 运算放大器各类电路-直流电压 电流检测、交流耦合与直流叠加、反
    目录一、直流电压、直流电流检测1、电压检测2、电流检测二、交流耦合与直流的叠加1、交流耦合2、同相直流叠加3、跨阻-反相直流叠加4、基准源的提供5、差分放大器-基准源一、直流电压、直流电流检测1、电压检测    通过对输入电压进行电阻分压,从而得到与......
  • 蓝桥3511飞机降落
    样例输入230100101010100220301020101020201020样例输出YESNO思路:具体来说,对于每架飞机,有起飞时间(t)、降落时间限制(d)和飞行时长(l)等信息,代码要判断能否按照一定规则安排这些飞机的起降顺序,使得所有飞机都能在其降落时间限制内完成降落。代码展示:#incl......
  • 基础算法——前缀和、差分 学习笔记
    前缀和及差分前缀和一维前缀和定义一维前缀和,就是数组前若干项的和。我们对于前缀和数组的定义非常广泛,例如定义\(S(x)\)表示数组\(A(x)\)的前缀和,定义\(A(l,r)\)表示\(A(l)+A(l+1)+\dots+A(r)\),\(S(x)=A(0,x)\);\(S(x)=A(1,x)\);\(S(x)=A(1,x-1)\);\(S(x)......
  • 蓝桥杯c++算法秒杀【6】之动态规划【下】(数字三角形、砝码称重(背包问题)、括号序列、
    别忘了请点个赞+收藏+关注支持一下博主喵!!!! ! ! ! !关注博主,更多蓝桥杯nice题目静待更新:)动态规划三、括号序列【问题描述】        给定一个括号序列,要求尽可能少地添加若干括号使得括号序列变得合法,当添加完成后,会产生不同的添加结果,请问有多少种本质......
  • 差分约束系统
    差分约束给出\(n\)个活动,设\(t_i\)表示第\(i\)个活动开始的时间。这些活动满足以下\(m\)个类似关系:\[\begin{cases}t_{i1}-t_{j1}<=B_1\\t_{i2}-t_{j2}<=B_2\\\dots\\t_{im}-t_{jm}<=B_m\end{cases}\]其中\(1<=i_1,i_2,\dots,i_m,j_1,j_2,\dots,j_m<=n\)求满......
  • 蓝桥杯每日真题 - 第24天
    题目:(货物摆放)题目描述(12届C&C++B组D题)解题思路:这道题的核心是求因数以及枚举验证。具体步骤如下:因数分解:通过逐一尝试小于等于的数,找到n的所有因数,并保存到数组中,确保不会遗漏对称因数对。三重循环验证:枚举所有可能的(L,W,H)的组合,验证这三数的乘积是否等于......
  • 蓝桥杯--奇怪的捐赠
    先来看题目:·根据题目要求,我们需要将100万分成7的若干次方,且不能有剩余,相同金额的份数不能超过5份·我们可以通过暴力,从7的0次方开始循环,因为7的7次方已经超过了100万,我们可以将循环控制到7的7次方,依次循环,知道找到符合条件的结果,退出循环·以下我们通过代码来实现:#includ......
  • 蓝桥杯c++算法秒杀【6】之动态规划【上】(数字三角形、砝码称重(背包问题)、括号序列、
     下将以括号序列、组合数问题超级吧难的题为例子讲解动态规划别忘了请点个赞+收藏+关注支持一下博主喵!!!! ! ! ! !关注博主,更多蓝桥杯nice题目静待更新:)动态规划一、数字三角形【问题描述】        上图给出了一个数字三角形。从三角形的顶部到底部有很......
  • 蓝桥杯c++算法学习【5】之枚举与模拟(卡片、回文日期、赢球票、既约分数:::非常典型的比刷
     别忘了请点个赞+收藏+关注支持一下博主喵!!!! ! ! !!!关注博主,更多蓝桥杯nice题目静待更新:)枚举与模拟一、卡片:【问题描述】        小蓝有很多数字卡片,每张卡片上都是一个数字(0到9)。         小蓝准备用这些卡片来拼一些数,他想从1开始拼出正整数......
  • 第十六届蓝桥杯模拟赛(第二期)—Java
    2024第十六届蓝桥杯模拟赛/校赛第二期个人题解,有错误的地方欢迎各位大佬指正问题一(填空题)【问题描述】如果一个数p是个质数,同时又是整数a的约数,则p称为a的一个质因数。请问,2024的最大的质因数是多少?【答案提交】这是一道结果填空的题,你只需要算出结果后......