QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#672068 | #7904. Rainbow Subarray | Calculatelove# | RE | 1ms | 6008kb | C++14 | 2.8kb | 2024-10-24 15:30:36 | 2024-10-24 15:30:37 |
Judging History
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;
}
詳細信息
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...