-J T2
  • 板块学术版
  • 楼主hulean
  • 当前回复7
  • 已保存回复7
  • 发布时间2023/10/21 16:33
  • 上次更新2024/7/19 18:01:33
查看原帖
-J T2
107468
hulean楼主2023/10/21 16:33

个人觉得思路没问题,但是代码只有5分(甚至过不了特殊AB条件的点),但是搞了半天hack不掉自己,求组hack数据/kel

#include <bits/stdc++.h>
using namespace std;
const int N = 100005;
int st[N], top;
int v[N], a[N];
int n, d;
int nxt[N];
inline int read() {
    int s = 0; char c = getchar();
    while (c < '0' || c > '9') c = getchar();
    while (c >= '0' && c <= '9') {
        s = s * 10 + int(c - '0');
        c = getchar();
    }
    return s;
}
signed main () {
    n = read(); d = read();
    for (int i = 2; i <= n; i++) v[i] = read(), v[i] += v[i - 1];
    for (int i = 1; i <= n; i++) a[i] = read();
    for (int j = n; j >= 1; j--) {
        if (top && a[st[top]] > a[j]) top --;
        nxt[j] = st[top];
        st[++top] = j;
    }
    for (int i = 1; i <= n; i++) if (nxt[i] == 0) nxt[i] = n;
    // for (int i = 1; i <= n; i++) cout<<nxt[i]<<" "; cout<<endl;
    int ans = 0, m = 0, now = 1;
    while (now < n) {
        while (now < n && v[nxt[now]] - v[now] - m <= 0) {
            now = nxt[now];
            m -= v[nxt[now]] - v[now];
        }
        if (now == n) break;
        int dis = v[nxt[now]] - v[now];
        dis -= m;
        // cout << dis<<" ";
        if (dis % d == 0) {
            ans += a[now] * (dis / d); m = 0; now = nxt[now];
        }
        else {
            ans += a[now] * (dis / d + 1); m = (dis / d + 1) * d - dis;
            now = nxt[now];
        }
        // cout << now <<" "<< ans <<" "<<m <<endl;
    }
    printf("%d\n", ans);
    return 0;
}
2023/10/21 16:33
加载中...