梦熊十三联测 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;
}
相关推荐
逻辑驱动的ken9 分钟前
Java高频面试考点场景题09
java·开发语言·数据库·算法·oracle·哈希算法·散列表
帅小伙―苏24 分钟前
力扣42接雨水
前端·算法·leetcode
AI科技星39 分钟前
精细结构常数α的几何本源:从第一性原理的求导证明、量纲分析与全域验证
算法·机器学习·数学建模·数据挖掘·量子计算
6Hzlia1 小时前
【Hot 100 刷题计划】 LeetCode 287. 寻找重复数 | C++ 数组判环 (快慢指针终极解法)
c++·算法·leetcode
MegaDataFlowers1 小时前
26.删除有序数组中的重复项
算法
Robot_Nav2 小时前
DPMPC-Planner:复杂静态环境与动态障碍物下的无人机实时轨迹规划框架
c++·无人机·mpc
码完就睡2 小时前
数据结构——栈和队列的相互模拟
数据结构
iiiiyu2 小时前
常用API(SimpleDateFormat类 & Calendar类 & JDK8日期 时间 日期时间 & JDK8日期(时区) )
java·大数据·开发语言·数据结构·编程语言
故事和你912 小时前
洛谷-数据结构1-4-图的基本应用2
开发语言·数据结构·算法·深度优先·动态规划·图论
吴可可1232 小时前
C#合并首尾相连多段线实战
算法·c#