梦熊十三联测 B题 图书管理

听完讲解感觉这道题也不是很难啊。

解题思路:

我们要知道我们要计算的是每个中位数pi的贡献。

对于pj>pi,令aj=1,对于pj<pi,令aj=-1,问题可以转变为有多个区间[l,r]满足

从i往左扫描并累加和,使用一个数组标记每种sj的取值个数

类似从i往右扫描并累加和,并询问取值为-tj的s数量

这种做法时间复杂度为O(n^2)。

代码如下:

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
int n, p[10005];
long long tmp[20010];
int main() {
    freopen("book.in", "r", stdin);
    freopen("book.out", "w", stdout);
    cin.tie(0)->sync_with_stdio(false);
    cin >> n;
    for (int i = 1; i <= n; i++) cin >> p[i];
    long long ans = 0;
    for (int i = 1; i <= n; i++) {
        long long sws = 0;
        for (int j = 0; j <= 20004; j++) tmp[j] = 0;
        int plc = 0;
        for (int j = 1; j <= n; j++)
            if (p[j] == i)
                plc = j;
        int sum = 10002;
        for (int j = plc; j >= 1; j--) {
            if (p[j] < i)
                sum--;
            if (p[j] > i)
                sum++;
            tmp[sum] += j;
        }
        sum = 10002;
        for (int j = plc; j <= n; j++) {
            if (p[j] < i)
                sum--;
            if (p[j] > i)
                sum++;
            sws += tmp[20004 - sum] * j;
        }
        ans += sws * i;
    }
    cout << ans;
    return 0;
}

此题暴力做法能打到50分,剩下的点会TLE掉

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e4 + 10;
int n;
int a[maxn], b[maxn];
int val[maxn][maxn];
long long ans;

void f(int l, int r) {
    if (l == r) {
        val[l][r] = a[l];
        return;
    }
    int mid = (l + r) / 2;
    f(l, mid);
    f(mid + 1, r);
    int c[maxn];
    int p = l, q = mid + 1, k = 0;
    memcpy(c, b, sizeof(b));
    while (p <= mid || q <= r) {
        if (p > mid) {
            c[l + (k++)] = b[q];
            q++;
        } else if (q > r) {
            c[l + (k++)] = b[p];
            p++;
        } else {
            if (b[p] <= b[q]) {
                c[l + (k++)] = b[p];
                p++;
            } else {
                c[l + (k++)] = b[q];
                q++;
            }
        }
    }
    for (int i = l; i <= r; i++) {
        b[i] = c[i];
    }
    val[l][r] = b[mid];
}

int main() {
    freopen("book.in", "r", stdin);
    freopen("book.out", "w", stdout);
    scanf("%d", &n);
    for (int i = 1; i <= n; i++) {
        scanf("%d", &a[i]);
    }
    for (int l = n / 2 * 2; l >= 0; l -= 2) {
        for (int i = 1; i + l <= n; i++) {
            int j = i + l;
            memcpy(b, a, sizeof(a));
            if (val[i][j] == 0)
                f(i, j);
            ans += 1LL * i * j * val[i][j];
        }
    }
    printf("%lld", ans);
    return 0;
}
相关推荐
不会c嘎嘎9 分钟前
【数据结构】AVL树详解:从原理到C++实现
数据结构·c++
却话巴山夜雨时i16 分钟前
394. 字符串解码【中等】
java·数据结构·算法·leetcode
haing201918 分钟前
使用黄金分割法计算Bezier曲线曲率极值的方法介绍
算法·黄金分割
leoufung24 分钟前
LeetCode 230:二叉搜索树中第 K 小的元素 —— 从 Inorder 遍历到 Order Statistic Tree
算法·leetcode·职场和发展
jyyyx的算法博客26 分钟前
多模字符串匹配算法 -- 面试题 17.17. 多次搜索
算法
da_vinci_x28 分钟前
Sampler AI + 滤波算法:解决 AIGC 贴图“噪点过剩”,构建风格化 PBR 工业管线
人工智能·算法·aigc·材质·贴图·技术美术·游戏美术
惊鸿.Jh30 分钟前
503. 下一个更大元素 II
数据结构·算法·leetcode
客梦34 分钟前
数据结构-栈与队列
数据结构·笔记
chao18984436 分钟前
MATLAB 实现声纹识别特征提取
人工智能·算法·matlab
zhishidi38 分钟前
推荐算法之:GBDT、GBDT LR、XGBoost详细解读与案例实现
人工智能·算法·推荐算法