75小数据全挂求助 码风良好有注释
  • 板块P6155 修改
  • 楼主wandasd
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/10/25 19:12
  • 上次更新2023/11/2 11:26:25
查看原帖
75小数据全挂求助 码风良好有注释
376181
wandasd楼主2023/10/25 19:12

思路:a从小到大,b从大到小。a依次压入栈(值和时间),ans加上的值就是(出栈时间-入栈时间)*放在b对应的位置的值

#include <bits/stdc++.h>
using namespace std;

const int MAXN = 1e6 + 5;
int a[MAXN], b[MAXN];
struct Data {
    // 压入的值和时间
    int x;
    int time;
};
map<int, int> num; // 存数字为i的个数

int main() {
    int n;
    scanf("%d", &n);
    for (int i = 0; i < n; i++) {
        scanf("%lld", &a[i]);
        num[a[i]]++;
    }
    for (int i = 0; i < n; i++) {
        scanf("%lld", &b[i]);
    }
    sort(a, a + n);
    sort(b, b + n, greater<int> ());

    stack<Data> s;
    int tm = 0, cnt = 0; // 记录时间和弹出的个数(也就是对应b的值的下标)
    unsigned long long ans = 0;
    
    for (int i = 0; i < n; i) {
        int num_p = num[a[i]];
        while (num_p--) {
            // 压入所有相同数
            tm++;
            s.push({a[i], tm});
            i++;
        }
        // 弹出顶部
        Data p = s.top();
        s.pop();
        ans += 1ull * b[cnt++] * (tm - p.time);
    }
    while (!s.empty()) {
        Data p = s.top();
        s.pop();
        ans += 1ull * b[cnt++] * (tm - p.time);
        // cout << ans << endl;
    }
    cout << ans << endl;
    return 0;
}
2023/10/25 19:12
加载中...