首页 > 其他分享 >CF1779 Least Prefix Sum

CF1779 Least Prefix Sum

时间:2023-01-06 01:55:05浏览次数:61  
标签:前缀 前面 int res Sum Prefix 即可 multiset CF1779

url:Problem - C - Codeforces

题意:

给n个数字和一个m

给一个操作:每次使得其中一个下标的数字 *= -1

要求最后在所有前缀和中前m个数字是最小的

思路:

在所有前缀和中分为三类,一类是在m前面的前缀和,一类是在m后面的前缀和,一类就是m本身

先考虑在m前面的前缀和

如何让在m前面的前缀和全部都>=m前缀和?

直接反过来考虑,从m开始向前面累加,如果累加的值>0了,代表需要操作一次了

因为如果累加值>0了,前面的一个前缀和直接不加这后面的一坨即可 < m前缀和

关于这个思路怎么来的

我借鉴了一下ygg的思路

k为其他前缀和的下标

a[1,k] >= a[1,m] => a[1,k] >= a[1,k] + a[k + 1,m]

所以能得到 a[k + 1,m] <= 0

又因为k >= 1,所以可以得到

任意的 i∈[2,m] 都有a[i,m] <= 0

所以要维护这个性质,就用上面的逆序处理即可

再考虑m后面的前缀和

跟前面的思路类似,对于i∈[m + 1,n]维护a[m + 1,i] >= 0即可

 

然后就是怎么去实现操作次数最小

直接贪心即可:每次需要操作时从已经遍历的数中取一个最大值/最小值即可

这个性质非常符合优先队列,当然multiset也可以

我用的multiset写的

代码如下:

void solve()
{
    int ans = 0;
    cin >> n >> m;
    vector<int> a(n + 10);
    for(int i = 1;i <= n;i++) cin >> a[i];
    int res = 0;
    multiset<int> s;
    for(int i = m;i >= 2;i--)
    {
        res += a[i];
        s.insert(a[i]);
        if(res > 0)
        {
            ans++;
            res -= 2 * (*prev(s.end()));
            s.erase(prev(s.end()));
        }
    }
    s.clear();
    res = 0;
    for(int i = m + 1;i <= n;i++)
    {
        res += a[i];
        s.insert(a[i]);
        if(res < 0)
        {
            ans++;
            res -= 2 * (*s.begin());
            s.erase(s.begin());
        }
    }
    cout << ans << endl;
}

 

                                           

标签:前缀,前面,int,res,Sum,Prefix,即可,multiset,CF1779
From: https://www.cnblogs.com/rickly233/p/17029301.html

相关文章

  • Least Prefix Sum(贪心)
    题目链接题目描述:Baltic,afamouschessplayerwhoisalsoamathematician,hasanarray\(a_1,a_2,…,a_n\),andhecanperformthefollowingoperationsevera......
  • 观看入口| Pulsar Summit Asia 2022 Day 1 分论坛热播
    大会介绍ApachePulsar社区年度峰会PulsarSummitAisa2022已于2022年11月19日线上启动。大会分为主论坛和分论坛,汇聚技术大咖和行业先行者分享ApachePulsar实......
  • [ABC283Ex] Popcount Sum
    ProblemStatementFindthesumofpopcountsofallintegersbetween$1$and$N$,inclusive,suchthattheremainderwhendividedby$M$equals$R$.Here,thep......
  • [ABC283Ex] Min + Sum
    ProblemStatementYouaregiventwosequencesofintegersoflength$N$:$A=(A_1,A_2,\ldots,A_N)$and$B=(B_1,B_2,\ldots,B_N)$.Printthenumberofp......
  • java8中常用函数式接口Supplier<T>、Consumer<T>、Function<T,R>、Predicate<T>使用示
    场景函数式接口(FunctionalInterface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。而java中的函数式编程体现就是Lambda,所以函数式接口就是可以适用......
  • Codeforces 1373 D. Maximum Sum on Even Positions 做题记录(单调队列)
    因为只能转一个子数组,很显然转长度为奇数的子数组,对最大化答案是没有意义的(偶数位的数字之和不会变化)。因此只考虑转偶长度的子数组。转动偶数长度的子数组,相当于......
  • UVa10827 Maximum sum on a torus
    思路一道比较经典的题目。首先我们可以把方阵扩展一下,变成\(4n^2\)大小的方阵。问题就变为在长度为\(2\timesn\)的方阵中求一个长和宽均小于等于\(n\)的子矩阵的......
  • CodeForces 1726E Tree Sum
    洛谷传送门CF传送门不错的一道Combinatorics。结论1:\(n\)为奇数时答案为\(0\)。设\(d_i\)为与点\(i\)相连的边边权乘积。每加入一条边对两端的\(d_i\)贡献......
  • P2398 GCD SUM——欧拉函数
    此题可以拓展为\(\sum\limits^n_{i=1}\sum\limits^m_{j=1}\gcd(i,j)\)结论是\(\sum\limits^{\min(n,m)}_{d=1}\varphi(d)\lfloor\dfrac{n}{d}\rfloor\lfloor\dfrac{m}{......
  • Sumitomo Mitsui Trust Bank Programming Contest 2019 —— B
    也不知道这比赛为啥要取这么长的名称(传送门:https://atcoder.jp/contests/sumitrust2019/tasks/sumitb2019_e哈哈,你被骗了!但网址是真的!题意有红绿蓝三种帽子RedandBl......