全部评论 6

  • 置顶

    一下是另外一种解法

    3天前 来自 广东

    0
  • #pragma GCC optimize("O2")
    #pragma GCC optimize("O3")
    #include <unistd.h>

    static char inBuf[1 << 16];
    static int inLen = 0, inPos = 0;

    inline int readChar() {
    if (inPos == inLen) {
    inLen = read(0, inBuf, sizeof(inBuf));
    inPos = 0;
    if (inLen <= 0) return -1;
    }
    return inBuf[inPos++];
    }

    inline int readInt() {
    int c = readChar();
    while (c <= ' ') { if (c == -1) return 0; c = readChar(); }
    int x = 0;
    while (c > ' ') { x = (x << 3) + (x << 1) + (c - '0'); c = readChar(); }
    return x;
    }

    static char outBuf[1 << 16];
    static int outLen = 0;

    inline void flushOut() {
    if (outLen > 0) { write(1, outBuf, outLen); outLen = 0; }
    }

    inline void outInt(int v) {
    if (v == 0) { if (outLen == (int)sizeof(outBuf)) flushOut(); outBuf[outLen++] = '0'; return; }
    char tmp[12]; int tl = 0;
    while (v) { tmp[tl++] = '0' + v % 10; v /= 10; }
    while (tl) { if (outLen == (int)sizeof(outBuf)) flushOut(); outBuf[outLen++] = tmp[--tl]; }
    }

    static int b[1000005], a[1000005];
    static int q[1000005];
    static int de[1000005];
    static int c_mx[1000005], c_mi[1000005];
    static int h, t, st, ed, fl, endIdx;

    inline int getcm() {
    int mi;
    if (st > ed) mi = q[t];
    else if (h > t) mi = st;
    else if (a[st] < a[q[t]] || (a[st] == a[q[t]] && st < q[t])) mi = st;
    else mi = q[t];
    return mi;
    }

    3天前 来自 广东

    0
  • inline int getmi() {
    int mi;
    if (st > ed) { mi = q[t]; t--; }
    else if (h > t) { mi = st; st++; }
    else if (a[st] < a[q[t]] || (a[st] == a[q[t]] && st < q[t])) { mi = st; st++; }
    else { mi = q[t]; t--; }
    return mi;
    }

    inline int getmx() {
    int mx;
    if (st > ed) { mx = q[h]; h++; }
    else if (h > t) { mx = ed; ed--; }
    else if (a[ed] > a[q[h]] || (a[ed] == a[q[h]] && ed > q[h])) { mx = ed; ed--; }
    else { mx = q[h]; h++; }
    return mx;
    }

    static int n;

    void solve() {
    h = 1; t = 0; st = 1; ed = n; fl = 0; endIdx = n - 1;
    for (int i = 1; i < n; i++) {
    int mx = getmx();
    int mi = getmi();
    int cm = getcm();
    a[mx] -= a[mi];
    q[t] = mx;
    c_mx[i] = mx;
    c_mi[i] = mi;
    if (a[mx] > a[cm] || (a[mx] == a[cm] && mx > cm)) {
    if (fl) {
    endIdx = i;
    break;
    }
    } else {
    fl = i;
    }
    }
    for (int i = 1; i <= n; i
    ) de[i] = endIdx + 1;
    de[c_mi[endIdx]] = endIdx;
    int ans = endIdx + 1;
    for (int i = endIdx - 1; i >= 1; i--) {
    if (de[c_mx[i]] < ans) ans = i;
    de[c_mi[i]] = i;
    }
    outInt(n - ans + 1);
    if (outLen == (int)sizeof(outBuf)) flushOut();
    outBuf[outLen++] = '\n';
    }

    int main() {
    int T = readInt();
    n = readInt();
    for (int i = 1; i <= n; i++) {
    b[i] = readInt();
    a[i] = b[i];
    }
    solve();

    for (int tc = 2; tc <= T; tc++) {
        int k = readInt();
        for (int j = 1; j <= n; j++) a[j] = b[j];
        for (int j = 0; j < k; j++) {
            int x = readInt();
            int y = readInt();
            b[x] = y;
            a[x] = y;
        }
        solve();
    }
    flushOut();
    return 0;
    

    }

    3天前 来自 广东

    0
  • 主要是acgo忘记更了,今天来补一下

    3天前 来自 广东

    0
  • orz 爆切黑题

    3天前 来自 广东

    0
暂无数据

提交答案之后,这里将显示提交结果~

首页