QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#686407#7904. Rainbow SubarrayVarealTL 2ms12088kbC++173.8kb2024-10-29 12:16:082024-10-29 12:16:08

Judging History

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

  • [2024-10-29 12:16:08]
  • 评测
  • 测评结果:TL
  • 用时:2ms
  • 内存:12088kb
  • [2024-10-29 12:16:08]
  • 提交

answer

#pragma GCC optimize("Ofast")
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <map>
#include <queue>
#include <bitset>
#include <vector>
#include <stack>
#include <cmath>
#include <set>
#include <cassert>
#include <random>
#include <chrono>
#include <ctime>
#include <cstdlib>
#define pii pair<int,int> 
#define mp make_pair
#define pb emplace_back
#define debug() cout<<"qwq"<<endl
typedef long long ll;
typedef double db;
typedef long double ldb;
typedef unsigned long long ull;
const int DMAX = 500000 + 5;
const double INF = 1e9;
const int MOD = 998244353;
using namespace std;
mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count());
template<class T> inline void read(T &x){
    T f=1; x=0; char ch=getchar();
    while(ch<'0' || ch>'9'){
        if(ch=='-') f=-1; 
        ch=getchar();
    }
    while(ch<='9' && ch>='0'){ x=x*10+ch-'0';ch=getchar(); }
    x*=f;
}
struct Fenwick{
    ll tr[DMAX];
    int n;
    void init(){
        for(int i = 1; i <= n; i++) tr[i] = 0;
    }
    int lowbit(int p){
        return p & (-p);
    }
    void add(int p, int v){
        for(int i = p; i <= n; i += lowbit(i)){
            tr[i] += v;
        }
    }
    ll ask(int p){
        ll res = 0;
        for(int i = p; i ; i -= lowbit(i)){
            res += tr[i];
        }
        return res;
    }
};
Fenwick bit1, bit2;
int T;
int n;
ll k;
ll a[DMAX], b[DMAX];
ll hve[DMAX];
multiset<int> s;
bool check(int v){
    s.clear();
    bit1.n = n, bit2.n = n;
    ll tot = 0;
    for(int i = 1; i <= n; i++) hve[i] = 0;
    bit1.init(), bit2.init();
    for(int i = 1; i <= v; i++){
        s.insert(a[i]);
        tot += b[a[i]];
        hve[a[i]] ++;
        bit1.add(a[i], 1);
        bit2.add(a[i], b[a[i]]);
    }
    int x = 0, temp = (v + 1) / 2;
    for(int i = 1; i <= v; i++){
        int val = bit1.ask(a[i] - 1);
        if(val < temp && val + hve[a[i]] >= temp){
            x = a[i];
            break;
        }
    }
    for(int i = v + 1; i <= n + 1; i++){
        ll sub0 = bit2.ask(x - 1);
        int hve0 = bit1.ask(x - 1);
        int hve1 = v - hve0;
        ll sub1 = tot - sub0;
        // cout<<i - 1<<":"<<endl;
        // cout<<b[x]<<endl;
        // cout<<hve0<<" "<<sub0<<" "<<hve1<<" "<<sub1<<endl;
        ll comp = sub1 - 1ll * b[x] * hve1 + 1ll * b[x] * hve0 - sub0;
       // cout<<i - v<<" "<<comp<<" "<<b[x]<<" "<<v<<endl;
        // cout<<i - 1<<" "<<comp<<endl;
        if(comp <= k){
            return 1;
        } 
        if(i == n + 1) break;

        auto it = s.find(a[i - v]);
        hve[a[i - v]] --, tot -= b[a[i - v]];
        bit1.add(a[i - v], -1), bit2.add(a[i - v], -b[a[i - v]]);
        s.erase(it);

        s.insert(a[i]);
        hve[a[i]]++, tot += b[a[i]];
        bit1.add(a[i], 1), bit2.add(a[i], b[a[i]]);
        // if(i == n){
            // cout<<i - v<<":"<<endl;
            // for(auto v:s){
            //     cout<<b[v]<<" ";
            // }
            // cout<<endl;
        // }
        it = s.begin();
        advance(it, temp - 1);
        x = *it;
    }
    return 0;
}
void solve(){
    read(n), read(k);
    for(int i = 1; i <= n; i++){
        read(a[i]);
        a[i] -= i;
        b[i] = a[i];
    }
    sort(b + 1, b + n + 1);
    int len = unique(b + 1, b + n + 1) - b - 1;
    for(int i = 1; i <= n; i++){
        a[i] = lower_bound(b + 1, b + len + 1, a[i]) - b;
    }

    int l = 2, r = n + 1, res = 1;
    // cout<<check(3)<<endl;
    // return ;
    while(l < r){
        int mid = (l + r) >> 1;
        if(check(mid)){
            res = mid, l = mid + 1;
        }
        else r = mid;
    }
    printf("%d\n", res);
    return ;
}
int main(){
    read(T);
    while(T--){
        solve();
    }
    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 2ms
memory: 12088kb

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
Time Limit Exceeded

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: