首页 > 其他分享 >【CDQ分治】[P5094 [USACO04OPEN] MooFest G 加强版

【CDQ分治】[P5094 [USACO04OPEN] MooFest G 加强版

时间:2024-08-06 20:28:19浏览次数:16  
标签:begin return 加强版 int auto self mid CDQ MooFest

P5094 [USACO04OPEN] MooFest G 加强版 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

#include <bits/stdc++.h>

using namespace std;

using i64 = long long;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n;
    cin >> n;

    vector<array<int, 2>> a(n);
    for (auto &[x, y] : a) {
        cin >> x >> y;
    }

    sort(a.begin(), a.end());

    i64 ans = 0;
    auto cdq = [&](auto && self, int l, int r)->void{
        if (l == r)
            return ;
        int mid = l + r >> 1;
        self(self, l, mid);
        self(self, mid + 1, r);


        sort(a.begin() + l, a.begin() + mid + 1, [](auto x, auto y) {
            if (x[1] != y[1]) return x[1] < y[1];
            return x[0] < y[0];
        });

        sort(a.begin() + mid + 1, a.begin() + r + 1, [](auto x, auto y) {
            if (x[1] != y[1]) return x[1] < y[1];
            return x[0] < y[0];
        });

        int sum1 = 0, sum2 = 0;
        for (int i = l; i <= mid; i ++)
            sum1 += a[i][1];

        int i = l, j = mid + 1;
        while (j <= r) {
            while (i <= mid && a[i][1] < a[j][1]) {
                sum1 -= a[i][1], sum2 += a[i][1];
                i ++;
            }
            int cnt1 = i - l, cnt2 = mid - i + 1;
            ans += 1ll * a[j][0] * (cnt1 * a[j][1] - sum2 + sum1 - cnt2 * a[j][1]);
            j ++;
        }

    };

    cdq(cdq, 0, n - 1);

    cout << ans << '\n';

    return 0;
}

标签:begin,return,加强版,int,auto,self,mid,CDQ,MooFest
From: https://www.cnblogs.com/Kescholar/p/18345933

相关文章

  • CDQ分治
    CDQ分治CDQ分治是一种思想而不是具体的算法,与动态规划类似。目前这个思想的拓展十分广泛,依原理与写法的不同,大致分为三类:解决和点对有关的问题。1D动态规划的优化与转移。通过CDQ分治,将一些动态问题转化为静态问题。解决和点对有关的问题这类问题多数类似于「给定一......
  • cdq分治
    cdq分治主要思想为分治,分为三个部分:左区间内部。左区间对右区间。右区间内部。一个保险的标准顺序是先处理左区间,再处理左区间对右区间的贡献,最后处理右区间,这样就可以保证时序性了。注意这种写法在处理左区间对右区间贡献是要先按标号排序分出正确的左右区间,如果是先递归......
  • P4449 于神之怒加强版 (题解)
    题目链接P4449于神之怒加强版题目大意:求\[\sum_{i=1}^{n}\sum_{j=1}^{m}gcd(i,j)^k\]\(数据范围n,m\leq5e6\)\(二话不说,先开导式子(假定n<m):\)\begin{aligned}ans&=\sum_{i=1}^{n}\sum_{j=1}^{m}gcd(i,j)^k\\\end{aligned}\[先套路地枚举d=gcd(i,j)\]\begin{align......
  • App Inventor 2 低功耗蓝牙 BlueToothLE 拓展中文文档(完整翻译加强版)
    低功耗蓝牙,也称为蓝牙LE或简称BLE,是一种类似于经典蓝牙的新通信协议,不同之处在于它旨在消耗更少的功耗和成本,同时保持同等的功能。因此,低功耗蓝牙是与耗电资源有限的物联网设备进行通信的首选。BluetoothLE扩展需要Android5.0或更高版本。BlueToothLE拓展中文文档入口......
  • 简单题 加强版
    由简单版中,我们已经推出了\[\sum_{d=1}^n\mu^2(d)d^{k+1}\sum_{t=1}^{\lfloor{\frac{n}{d}}\rfloor}\mu(t)t^k\sum_{i=1}^{\lfloor{\frac{n}{dt}}\rfloor}\sum_{j=1}^{\lfloor{\frac{n}{dt}}\rfloor}(i+j)^k\]我们设\(T=td\),则设\(S(x)=\sum_{i=1}^x\sum_{j=1......
  • P5825 排列计数 加强版
    加强版和原题不同之处在于\(p\)不再是一个排列,而是一个普通的值域为\([1,n]\)的数组考虑将\([p_i<p_{i+1}]\)转化为\(1-[p_i\gep_{i+1}]\),方便计算后面的\(g\),也就是恰好\(n-k-1\)不上升点的方案数记一段不上升点的连续段为非升段,\(f_i\)表示恰好\(i\)个不上升......
  • IOI2022 邮局 加强版 题解
    [IOI2000]邮局加强版题解考虑动态规划,设\(f_{i,j}\)为经过了\(i\)个村庄,正在建第\(j\)​个邮局的最优距离。以及\(w_{i,j}\)表示区间\([i,j]\)​内建一个邮局时的距离总和。\(a\)数组表示每个村庄的坐标编号。朴素版状态转移方程:\[f_{i,j}=\min(f_{i,j},f_{k,j......
  • cdq分治 提高篇
    优化动态规划序列首先要会最长上升子序列的转移,这里就不说了。我们\(i\)位置的初始值为\(a_i\),可能变成的最大值为\(mx_i\),可能变成的最小值为\(mn_i\)。然后如果\(j\)要转移到\(i\),则需要满足:\(j<i,mx_j\lea_i,a_j\lemn_i\)。然后考虑把\([l,mid]\)按照\(mx\)......
  • cdq分治
    简介前置芝士:归并排序。\(cdq\)分治是个离线算法,可以解决三维偏序或者优化\(dp\)。题目直接上个题目:陌上花开。维护三维偏序有个口诀:一维排序,二维归并,三位数据结构。考虑第一维直接排序解决掉,然后还剩两维。我们考虑第二维用归并排序解决掉。然后假设当前区间\([l,r]\),......
  • 离线分治算法:cdq 分治
    \(\texttt{0x00}\):前置芝士归并排序;树状数组;重载运算符(这个大概都会吧)。\(\texttt{0x01}\):介绍cdq分治是一种离线分治算法,可用来处理以下几种问题:解决和点对有关的问题。1D动态规划的优化与转移。通过CDQ分治,将一些动态问题转化为静态问题。它们的本质都是通过一......