QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#278907#7904. Rainbow SubarrayyolxWA 1052ms10200kbC++204.2kb2023-12-07 22:37:132023-12-07 22:37:13

Judging History

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

  • [2024-06-09 00:00:26]
  • hack成功,自动添加数据
  • (/hack/652)
  • [2023-12-07 22:37:13]
  • 评测
  • 测评结果:WA
  • 用时:1052ms
  • 内存:10200kb
  • [2023-12-07 22:37:13]
  • 提交

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);
//}
//--------------------------------------------
int n,k,a[N];
bool check(int x){
    if(x==1)return 1;
    ll ans=1e18;
    ll sum1=0,sum2=0;
    multiset<int>st;
    st.insert(a[1]);
    sum1+=a[1];
    auto l=st.begin();
    auto r=st.begin();
    for(int i=2;i<=x;i++){
        st.insert(a[i]);
        if(st.size()%2==0){
            if(a[i]<*l)sum1+=(a[i]-*l),sum2+=*l,l--;
            else sum2+=a[i],r++;
        }
        else{
            if(a[i]<*l)sum1+=a[i],r--;
            else if(a[i]>=*l&&a[i]<*r)sum1+=a[i],l++,r--;
            else sum1+=*r,sum2+=(a[i]-*r),l++;
        }
    }
    if(st.size()&1){
        int mid=*l;
        ans=min(ans,mid*(n/2+1)-sum1+sum2-mid*(n/2));
    }
    else{
        int mid1=(*l+*r)/2;
        int mid2=mid1+1;
        ans=min(ans,mid1*(n/2)-sum1+sum2-mid1*(n/2));
        ans=min(ans,mid2*(n/2)-sum1+sum2-mid2*(n/2));
    }
    for(int i=x+1;i<=n;i++){
        st.insert(a[i]);
        if(st.size()%2==0){
            if(a[i]<*l)sum1+=(a[i]-*l),sum2+=*l,l--;
            else sum2+=a[i],r++;
        }
        else{
            if(a[i]<*l)sum1+=a[i],r--;
            else if(a[i]>=*l&&a[i]<*r)sum1+=a[i],l++,r--;
            else sum1+=*r,sum2+=(a[i]-*r),l++;
        }
        int t=a[i-x];
        auto pos=st.lower_bound(t);
        if(pos==l){
            if(st.size()&1)sum1-=*l,l--,r++;
            else sum1-=*l,l++;
        }
        else if(pos==r)sum2-=*r,r--;
        else{
            int l1=*l,r1=*r;
            st.erase(pos);
            if(st.size()%2==0){
                if(t<l1)sum1-=t,r++;
                else sum1-=l1,sum2+=(l1-t),l--;
            }
            else{
                if(t<l1)sum1+=(r1-t),sum2-=r1,l++;
                else sum2-=t,r--;
            }
        }
        if(st.size()&1){
            int mid=*l;
            ans=min(ans,mid*(n/2+1)-sum1+sum2-mid*(n/2));
        }
        else{
            int mid1=(*l+*r)/2;
            int mid2=mid1+1;
            ans=min(ans,mid1*(n/2)-sum1+sum2-mid1*(n/2));
            ans=min(ans,mid2*(n/2)-sum1+sum2-mid2*(n/2));
        }
    }
    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: 1ms
memory: 5476kb

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: 1052ms
memory: 10200kb

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
2
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
7
3
5
6
7
1
7
5
3
1
7
5
5
3
2
3
6
2
3
10
1
5
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
9
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
3
4
1
2
1
5
4
8
3
7
3
3
2...

result:

wrong answer 3rd lines differ - expected: '3', found: '2'