QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#672068#7904. Rainbow SubarrayCalculatelove#RE 1ms6008kbC++142.8kb2024-10-24 15:30:362024-10-24 15:30:37

Judging History

你现在查看的是最新测评结果

  • [2024-10-24 15:30:37]
  • 评测
  • 测评结果:RE
  • 用时:1ms
  • 内存:6008kb
  • [2024-10-24 15:30:36]
  • 提交

answer

#include <bits/stdc++.h>

typedef long long s64;

const int N = 500100;
const int SIZE = 1e9;

int n; s64 k;
int a[N];

namespace SGT {
    const int pond = 2000100;

    int nClock, root[N];
    struct node {
        int lc, rc;
        int cnt;
        s64 sum;
    } t[pond];

    void insert(int &p, int q, int l, int r, int x) {
        p = ++ nClock;
        t[p] = t[q];
        t[p].cnt ++, t[p].sum += x;
        if (l == r) return;
        int mid = (l + r) >> 1;
        if (x <= mid)
            insert(t[p].lc, t[q].lc, l, mid, x);
        else
            insert(t[p].rc, t[q].rc, mid + 1, r, x);
    }

    int ask_cnt(int p, int q, int l, int r, int s, int e) {
        if (s <= l && r <= e) return t[q].cnt - t[p].cnt;
        int mid = (l + r) >> 1;
        int cnt = 0;
        if (s <= mid)
            cnt += ask_cnt(t[p].lc, t[q].lc, l, mid, s, e);
        if (mid < e)
            cnt += ask_cnt(t[p].rc, t[q].rc, mid + 1, r, s, e);
        return cnt;
    }

    s64 ask_sum(int p, int q, int l, int r, int s, int e) {
        if (s <= l && r <= e) return t[q].sum - t[p].sum;
        int mid = (l + r) >> 1;
        s64 sum = 0;
        if (s <= mid)
            sum += ask_sum(t[p].lc, t[q].lc, l, mid, s, e);
        if (mid < e)
            sum += ask_sum(t[p].rc, t[q].rc, mid + 1, r, s, e);
        return sum;
    }

    int ask_kth(int p, int q, int l, int r, int k) {
        if (l == r) return l;
        int mid = (l + r) >> 1;
        int lcnt = t[t[q].lc].cnt - t[t[p].lc].cnt;
        if (k <= lcnt)
            return ask_kth(t[p].lc, t[q].lc, l, mid, k);
        else
            return ask_kth(t[p].rc, t[q].rc, mid + 1, r, k - lcnt);
    }
}

using namespace SGT;

bool check(int mid) {
    for (int i = 1; i + mid - 1 <= n; i ++) {
        int p = ask_kth(root[i - 1], root[i + mid - 1], -n, SIZE, (mid + 1) / 2);

        int lcnt = ask_cnt(root[i - 1], root[i + mid - 1], -n, SIZE, -n, p);
        s64 lsum = ask_sum(root[i - 1], root[i + mid - 1], -n, SIZE, -n, p);

        int rcnt = (t[root[i + mid - 1]].cnt - t[root[i - 1]].cnt) - lcnt;
        s64 rsum = (t[root[i + mid - 1]].sum - t[root[i - 1]].sum) - lsum;

        s64 cost = (rsum - 1ll * rcnt * p) + (1ll * lcnt * p - lsum);
        if (cost <= k) return 1;
    }
    
    return 0;
}

void work() {
    scanf("%d%lld", &n, &k);
    
    for (int i = 1; i <= n; i ++)
        scanf("%d", &a[i]), a[i] -= i;

    SGT::nClock = 0;
    for (int i = 1; i <= n; i ++)
        SGT::insert(SGT::root[i], SGT::root[i - 1], -n, SIZE, a[i]);

    int l = 1, r = n;
    while (l < r) {
        int mid = (l + r + 1) >> 1;
        if (check(mid)) l = mid; else r = mid - 1;
    }

    printf("%d\n", l);
}

int main() {
    int T;
    scanf("%d", &T);

    while (T --)
        work();
    
    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 1ms
memory: 6008kb

input:

5
7 5
7 2 5 5 4 11 7
6 0
100 3 4 5 99 100
5 6
1 1 1 1 1
5 50
100 200 300 400 500
1 100
3

output:

4
3
5
1
1

result:

ok 5 lines

Test #2:

score: -100
Runtime Error

input:

11102
2 167959139
336470888 134074578
5 642802746
273386884 79721198 396628655 3722503 471207868
6 202647942
268792718 46761498 443917727 16843338 125908043 191952768
2 717268783
150414369 193319712
6 519096230
356168102 262263554 174936674 407246545 274667941 279198849
9 527268921
421436316 3613460...

output:

1
4
3
2
6
5
7
2
4
1
4
1
1
3
2
2
7
8
7
7
1
7
6
2
4
3
1
6
7
7
3
4
3
9
3
8
6
6
3
1
6
3
1
2
4
6
4
6
4
1
4
7
1
6
3
5
6
6
1
7
5
3
1
6
4
5
3
2
2
6
2
3
10
1
4
3
2
4
5
1
7
5
5
5
8
5
3
6
3
5
5
8
5
4
5
2
1
5
2
3
3
4
8
1
3
1
2
2
8
3
1
6
8
1
8
4
5
6
6
8
4
8
3
2
8
4
5
6
2
6
2
4
1
5
4
5
3
2
4
1
2
1
4
5
8
3
7
3
3
3...

result: