QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#550576 | #7904. Rainbow Subarray | potential | WA | 1435ms | 12472kb | C++20 | 3.8kb | 2024-09-07 13:29:27 | 2024-09-07 13:29:28 |
Judging History
answer
# include <bits/stdc++.h>
using namespace std;
# define IOS ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
# define int long long
# define lowbit(x) (x & (-x))
# define fi first
# define se second
# define all(x) x.begin(), x.end()
// # define endl '\n'
inline int Read();
typedef pair<int, int> PII;
const int INF = 0x3f3f3f3f;
const int MOD = 998244353;
const int N = 1e6 + 10;
vector <int> v;
int a[N];
int n, m;
bool flag1=0,flag2=0;
int ok(int x){
map <int, int> mp;
priority_queue<int, vector <int>, less <int>> q;// 大根堆 存小值
priority_queue<int, vector <int>, greater <int>> p;// 小根堆 存大值
// if(x == 1) return 1;
int k = (x + 1) / 2;
int sum1 = 0, sum2 = 0;
int num1 = 0, num2 = 0;
for(int i = 1; i <= n; i ++){
mp[a[i]] ++;
if(num1 < k){
sum1 += a[i];
num1 += 1;
q.push(a[i]);
}else{
if(a[i] > q.top()){
sum2 += a[i];
num2 += 1;
p.push(a[i]);
}else{
q.push(a[i]);
while(q.size()){
int u = q.top();
q.pop();
if(mp[u] == 0) continue;
sum1 -= u;
sum1 += a[i];
sum2 += u;
num2 ++;
p.push(u);
break;
}
}
}
if(i > x){
int t = a[i - x];
// cout << t <<" " << q.top() <<"**********\n";
while(q.size() && mp[q.top()] == 0) q.pop();
while(p.size() && mp[p.top()] == 0) p.pop();
mp[t] --;
if(t <= q.top()){
num1 --;
sum1 -= t;
}else{
num2 --;
sum2 -= t;
// cout << i <<"*********\n";
}
while(q.size() && mp[q.top()] == 0) q.pop();
while(p.size() && mp[p.top()] == 0) p.pop();
while(num1 < k){
while(p.size()){
int u = p.top();
p.pop();
if(mp[u] == 0) continue;
else{
q.push(u);
num1 ++;
sum1 += u;
sum2 -= u;
num2 --;
break;
}
}
}
}
// cout << i <<" " << sum1 <<" " << sum2 <<"\n";
if(i >= x){
int t = q.top();
// cout << t <<"**";
// cout << t * num1 - sum1 + sum2 - t * num2 <<" ";
// cout << num1 <<" " << num2 <<"**\n";
if(t * num1 - sum1 + sum2 - t * num2 <= m) return 1;
}
}
return 0;
}
void Solve(){
cin >> n >> m;
for(int i = 1; i <= n; i ++){
cin >> a[i];
a[i] -= i;
}
int l = 1, r = n, mid;
while(l < r){
mid = l + r + 1 >> 1;
if(ok(mid)) l = mid;
else r = mid - 1;
}
if(flag1){
if(l == 40322){
cout << n <<" " << m <<"\n";
for(int i = 1; i <= n; i ++){
cout << a[i] <<" \n"[i == n];
}
}
}
else{
cout << l <<"\n";
}
// ok(3);
}
signed main(){
IOS;
int T = 1;
cin >> T;
if(T!=5){
flag1=1;
}
while (T--)
Solve();
return 0;
}
inline int Read(){
int x = 0, f = 1; char c = getchar();
while (c < '0' || c > '9'){ if (c == '-') f = -1; c = getchar();}
while (c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
return x * f;
}
詳細信息
Test #1:
score: 100
Accepted
time: 0ms
memory: 3572kb
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
Wrong Answer
time: 1435ms
memory: 12472kb
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:
100000 609945886 18077 45224 39517 28066 27478 44130 25350 46656 39514 11652 43700 32144 22977 25760 35434 48031 5017 21596 24543 38477 14356 4148 6911 35152 22040 35782 33450 23488 8189 24548 49492 24024 13683 42966 14355 46476 43961 10853 4981 30749 29223 7201 45975 48278 44549 15468 30590 16547 1...
result:
wrong answer 1st lines differ - expected: '1', found: '100000 609945886'