QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#279091 | #7904. Rainbow Subarray | yolx | WA | 312ms | 6988kb | C++20 | 3.4kb | 2023-12-08 10:44:57 | 2023-12-08 10:44:58 |
Judging History
answer
//音乐是苍白的鬼魂,就像玫瑰是疯狂而必死的美:她苍白而必死
#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
#define ll long long
#define ull unsigned long long
#define fi first
#define se second
#define vec vector
#define pb push_back
#define PDD pair<double,double>
#define PLL pair<ll,ll>
#define PII pair<int,int>
#define INF 0x3f3f3f3f
#define i128 __int128
#define ld long double
#define pi 3.1415926535
//const ll mod=1e9+7;
const ll mod=998244353;
bool isprime(ll x){
if(x==1)return false;
for(ll i=2;i<=x/i;i++){
if(x%i==0)return false;
}
return true;
}
ll popcnt(ll x){
ll cnt=0;
while(x){
if(x&1)cnt++;
x>>=1;
}
return cnt;
}
ll qmi(ll a,ll b,ll p){
if(a==0)return 1;
a%=p;
ll res=1;
while(b){
if(b&1)res=res*a%p;
a=a*a%p;
b>>=1;
}
return res;
}
ll exgcd(ll a,ll b,ll &x,ll &y){
if(!b){
x=1,y=0;
return a;
}
ll d=exgcd(b,a%b,y,x);
y-=a/b*x;
return d;
}
ll lowbit(ll x){return x&-x;}
const int N=1e6+10;
ll fact[N],infact[N];
ll C(ll n,ll m) {
if (n < m || m < 0)return 0;
return fact[n] * qmi(fact[m] * fact[n - m] % mod, mod - 2, mod) % mod;
}
//ll C(ll n,ll m){
// if (n < m || m < 0)return 0;
// return fact[n]%mod*infact[m]%mod*infact[n-m]%mod;
//}
//void scan(__int128 &x)
//{
// x=0;int f=1;char ch=getchar();
// while (!isdigit(ch)){if (ch=='-')f=-1;ch=getchar();}
// while(isdigit(ch)){x=x*10+ch-48;ch=getchar();}
// x*=f;
//}
//inline void print(__int128 x) {
// if (x < 0) {
// putchar('-');
// x = -x;
// }
// if (x > 9) print(x / 10);
//}
//--------------------------------------------
ll n,k;
int a[N];
bool check(int x){
if(x==1)return 1;
ll sum1=0,sum2=0;
priority_queue<int>q1;
priority_queue<int,vec<int>,greater<int>>q2;
for(int i=1;i<=x;i++){
if(q1.empty()||q1.top()>=a[i])q1.push(a[i]),sum1+=a[i];
else q2.push(a[i]),sum2+=a[i];
if(q1.size()>q2.size()+1)sum1-=q1.top(),sum2+=q1.top(),q2.push(q1.top()),q1.pop();
if(q2.size()>q1.size())sum2-=q2.top(),sum1+=q2.top(),q1.push(q2.top()),q2.pop();
}
ll ans,t1=0,t2=0;
if(x&1){
ll mid=q1.top();
ans=sum2-sum1+mid;
}
else ans=sum2-sum1;
for(int i=x+1;i<=n;i++){
if(a[i-x]==q1.top())sum1-=a[i-x],q1.pop();
else if(a[i-x]==q2.top())sum2-=a[i-x],q2.pop();
else if(a[i-x]<q1.top())sum1-=a[i-x],t1++;
else sum2-=a[i-x],t2++;
if(q1.empty()||q1.top()>=a[i])q1.push(a[i]),sum1+=a[i];
else q2.push(a[i]),sum2+=a[i];
if(q1.size()-t1>q2.size()+1-t2)sum1-=q1.top(),sum2+=q1.top(),q2.push(q1.top()),q1.pop();
if(q2.size()-t2>q1.size()-t1)sum2-=q2.top(),sum1+=q2.top(),q1.push(q2.top()),q2.pop();
if(x&1){
ll mid=q1.top();
ans=min(ans,abs(sum2-sum1+mid));
}
else ans=min(ans,abs(sum2-sum1));
}
return ans<=k;
}
void solve(){
cin>>n>>k;
for(int i=1;i<=n;i++)cin>>a[i],a[i]-=(i-1);
int l=1,r=n;
while(l<r){
int mid=(l+r+1)>>1;
if(check(mid))l=mid;
else r=mid-1;
}
cout<<l<<endl;
}
int main() {
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
int T = 1;
cin>>T;
while (T--)solve();
return 0;
}
详细
Test #1:
score: 100
Accepted
time: 0ms
memory: 5688kb
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: 312ms
memory: 6988kb
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 2 2 4 1 2 1 4 4 8 3 7 3 3 3...
result:
wrong answer 137th lines differ - expected: '3', found: '2'