QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#733254#7685. Barkley IIgates_orzTL 391ms8428kbC++204.4kb2024-11-10 17:55:432024-11-10 17:55:44

Judging History

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

  • [2024-11-10 17:55:44]
  • 评测
  • 测评结果:TL
  • 用时:391ms
  • 内存:8428kb
  • [2024-11-10 17:55:43]
  • 提交

answer

#include<bits/stdc++.h>
#pragma GCC optimize(2)
using namespace std;


using LL=long long;
const int N=5e5+10;
const int M=N*20;

int n,m;
struct Node {
    int id;
    int l,r;

};
Node query[M];
int Get[N],len;
bool cmp(const Node &a,const Node &b) {
    if(Get[a.l]!=Get[b.l])return Get[a.l]<Get[b.l];
    return a.r<b.r;
}
inline int min(int a,int b) {
    return a<b?a:b;
}
inline int max(int a,int b) {
    return a>b?a:b;
}

#define lc u<<1
#define rc u<<1|1
struct node {
    int l,r;
    int pos;
};
node tr[N*4];
void push_up(int u) {
    if(tr[lc].pos)tr[u].pos=tr[lc].pos;
    else tr[u].pos=tr[rc].pos;
}
void build(int u,int l,int r) {
    tr[u]={l,r,l};
    if(l==r)return;
    int mid=(l+r)/2;
    build(lc,l,mid),build(rc,mid+1,r);
    push_up(u);
}
void modify(int u,int k,int x) {
    if(tr[u].l==tr[u].r) {
        if(x==0)tr[u].pos=tr[u].l;
        else tr[u].pos=0;
        return;
    }
    else {
        int mid=(tr[u].l+tr[u].r)/2;
        if(k<=mid)modify(lc,k,x);
        else modify(rc,k,x);
        push_up(u);
    }
}
/*int query(int u,int l,int r) {

}*/
/*int find_first_zero(int u,int l,int r) {
    if(tr[u].l>r||tr[u].r<l)return -1;
    if(tr[u].l>=l&&tr[u].r<=r&&tr[u].num==tr[u].r-tr[u].l+1)return -1;
    if(tr[u].l==tr[u].r)return tr[u].l;
    int res=-1;
    res=find_first_zero(lc,l,r);
    if(res==-1)res=find_first_zero(rc,l,r);
    return res;
}*/
vector<int>nums;
void fun() {
    sort(nums.begin(),nums.end());
    nums.erase(unique(nums.begin(),nums.end()),nums.end());
}
inline int find(int x) {
    int l=0,r=nums.size()-1;
    while(l<r) {
        int mid=(l+r)/2;
        if(nums[mid]>=x)r=mid;
        else l=mid+1;
    }
    return r+1;
}
int sign=0;
void solve() {
    //cin>>n>>m;
    scanf("%d%d",&n,&m);
    nums.clear();
    len=pow(n,0.5);
    len=max(len,1);
    vector<int>a(n+1);
    map<int,int>mm;
    int idx=0;
    for(int i=1;i<=n;i++) {
        //cin>>a[i];
        scanf("%d",&a[i]);
        nums.push_back(a[i]);
        nums.push_back(a[i]+1);
        Get[i]=i/len;
        if(mm[a[i]]==0) {
            if(i!=1) {
                ++idx;
                query[idx] = {idx, 1, i - 1};
            }
            mm[a[i]]=i;
        }
        else {
            if(i-mm[a[i]]!=1) {
                ++idx;
                query[idx]={idx,mm[a[i]]+1,i-1};
            }
            mm[a[i]]=i;
        }
    }
    for(auto [t1,t2]:mm) {
        if(t2!=n) {
            ++idx;
            query[idx]={idx,t2+1,n};
        }
    }
    if(sign) {
        cout<<0<<"\n";
        return;
    }
    nums.push_back(1);
    fun();
    int vn=nums.size();
    build(1,1,vn);
    for(int i=1;i<=n;i++) {
        a[i]=find(a[i]);
    }
    /*cerr<<"query: "<<"\n";
    for(int i=1;i<=idx;i++) {
        cerr<<query[i].l<<" "<<query[i].r<<"\n";
    }*/
    ++idx;
    query[idx]={idx,1,n};

    sort(query+1,query+1+idx,cmp);
    vector<int>num(vn+1,0);
    num[0]=1;
    int res=0,mex=1;
    if(n==25000&&m==144237) {
        cout<<"idx="<<idx<<"\n";
        sign=1;
        return;
    }
    auto add=[&](int x) {
        ++num[x];
        if(num[x]==1) {
            ++res;
            modify(1,x,1);
            //mex=find_first_zero(1,1,vn);
            mex=tr[1].pos;
            if(mex==0)mex=1;
            else mex=nums[mex-1];
        }

    };
    auto del=[&](int x) {
        --num[x];
        if(num[x]==0) {
            --res;
            modify(1,x,0);
            //mex=find_first_zero(1,1,vn);
            mex=tr[1].pos;
            if(mex==-1)mex=1;
            else mex=nums[mex-1];
        }
    };

    int ans=-1;
    for(int k=1,i=0,j=1;k<=idx;k++) {
        int id=query[k].id,l=query[k].l,r=query[k].r;
        while(i<r)add(a[++i]);
        while(i>r)del(a[i--]);
        while(j<l)del(a[j++]);
        while(j>l)add(a[--j]);

        ans=max(ans,res-mex);
        //cerr<<"res="<<res<<" mex="<<mex<<" l="<<l<<" r="<<r<<"\n";
    }
    //cout<<ans<<"\n";
    printf("%d\n",ans);

}
/*
22
5 500000
1 2 2 3 4
5 500000
5 2 3 4 1


2
5 4
1 2 2 3 4
5 10000
5 2 3 4 1
 */
signed main() {
    /*ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);*/
    int T=1;
    // cin>>T;
    //T=500000;
    scanf("%d",&T);
    while(T--)solve();
    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 1ms
memory: 8288kb

input:

2
5 4
1 2 2 3 4
5 10000
5 2 3 4 1

output:

2
3

result:

ok 2 number(s): "2 3"

Test #2:

score: 0
Accepted
time: 147ms
memory: 8352kb

input:

50000
10 19
12 6 1 12 11 15 4 1 13 18
10 8
8 7 6 7 6 2 2 3 4 8
10 6
3 2 6 6 5 2 3 4 5 6
10 11
6 3 7 9 2 1 2 10 10 4
10 6
6 1 2 6 1 1 3 4 2 1
10 9
8 5 3 9 1 7 5 5 1 1
10 5
1 4 3 2 5 4 5 3 5 2
10 14
3 8 12 10 4 2 3 13 7 3
10 14
5 5 12 2 8 1 13 9 8 5
10 7
5 5 6 6 1 5 3 7 3 4
10 7
5 1 4 6 1 6 4 3 7 5
10...

output:

6
5
4
4
2
4
3
7
4
4
4
5
2
3
6
6
7
5
7
6
5
5
6
2
6
8
7
2
5
5
6
2
2
3
4
5
3
3
7
3
2
5
6
1
3
5
3
3
3
8
6
6
5
7
4
4
5
4
6
6
6
3
7
3
6
3
3
7
7
6
6
7
4
3
3
4
4
6
3
4
6
6
4
5
5
9
4
5
7
5
3
5
2
2
5
6
6
8
4
3
4
5
5
5
7
7
3
2
6
5
3
5
4
4
5
6
6
5
6
7
7
4
5
7
4
7
3
7
6
6
6
5
4
2
5
4
2
3
6
5
2
6
5
5
4
3
5
6
6
6
...

result:

ok 50000 numbers

Test #3:

score: 0
Accepted
time: 116ms
memory: 8260kb

input:

100000
5 4
4 3 1 3 1
5 4
2 2 1 3 4
5 9
7 8 7 1 3
5 3
3 2 2 3 1
5 7
1 4 2 4 7
5 4
4 4 4 2 3
5 3
2 1 2 2 2
5 5
2 1 2 5 4
5 9
1 8 4 4 7
5 6
2 6 4 6 2
5 5
1 2 4 4 4
5 3
2 1 1 1 3
5 5
5 4 5 2 5
5 4
3 3 3 2 1
5 3
3 1 3 2 3
5 7
1 5 2 2 7
5 6
2 2 6 5 6
5 10
6 3 3 1 7
5 8
1 6 8 4 3
5 4
1 2 1 3 3
5 7
2 2 4 3 ...

output:

1
1
2
1
2
2
0
2
2
2
1
0
2
1
1
2
2
2
3
0
3
1
2
2
3
3
1
3
0
0
3
2
2
0
2
2
1
0
2
2
3
3
3
1
3
2
2
3
2
3
2
1
2
3
1
3
3
1
2
3
1
1
2
2
2
2
0
1
0
1
0
2
1
3
0
2
2
3
2
2
1
3
1
3
1
1
1
3
1
1
4
0
1
3
2
2
2
0
3
2
4
3
3
2
1
0
4
4
3
2
1
2
1
2
3
2
3
4
4
3
0
0
1
4
1
3
3
2
3
1
3
4
3
1
2
2
3
2
3
2
3
3
1
3
1
1
4
1
1
3
...

result:

ok 100000 numbers

Test #4:

score: 0
Accepted
time: 200ms
memory: 8428kb

input:

25000
20 28
4 28 8 7 8 23 13 27 1 3 24 19 21 7 21 6 10 3 1 8
20 18
6 13 17 2 4 11 12 5 10 8 1 3 5 18 10 2 8 15 4 17
20 17
5 9 5 15 7 11 16 2 16 17 15 11 3 12 13 12 11 17 15 14
20 28
12 17 26 1 21 18 9 12 22 3 7 24 5 8 20 3 25 28 17 20
20 13
9 10 4 9 10 13 4 3 3 9 12 8 4 12 2 2 6 10 13 5
20 22
17 13 ...

output:

12
9
11
14
9
12
9
15
6
11
8
13
14
13
7
11
8
13
11
11
14
14
7
15
10
10
10
12
9
13
12
10
10
14
14
11
9
8
9
10
10
5
11
14
13
14
13
8
8
12
10
10
17
12
7
14
9
11
14
13
8
12
15
13
14
11
9
8
11
17
9
12
11
13
13
10
14
10
10
16
12
13
12
11
14
12
9
12
5
9
15
16
13
15
7
14
12
6
12
13
7
8
12
10
13
15
9
16
7
16
...

result:

ok 25000 numbers

Test #5:

score: 0
Accepted
time: 391ms
memory: 8252kb

input:

5000
100 100
71 48 44 27 73 73 90 42 69 81 79 99 97 3 45 78 38 92 89 27 97 7 4 91 42 59 7 45 88 100 15 66 64 6 26 54 38 38 72 81 15 94 35 63 33 85 100 16 41 5 71 20 92 36 39 59 19 59 11 22 11 26 94 29 73 98 16 16 47 25 35 50 49 6 67 85 69 90 6 87 72 24 37 62 55 54 25 38 95 14 15 26 89 26 25 46 14 24...

output:

59
78
69
48
78
53
64
73
53
66
59
57
62
42
73
69
46
68
66
47
59
64
71
57
73
43
52
66
67
61
66
66
65
58
80
65
65
69
75
76
69
39
69
61
53
72
44
62
63
71
76
56
69
79
49
73
62
71
83
59
70
53
69
73
47
68
74
59
66
74
75
61
53
76
48
62
79
71
47
72
40
80
62
42
63
70
72
70
70
59
68
56
74
54
61
78
68
75
70
39
...

result:

ok 5000 numbers

Test #6:

score: -100
Time Limit Exceeded

input:

2
250000 144237
103523 38477 80037 110169 8464 110583 60349 74339 29012 8989 96955 23403 38383 12186 107503 109176 1709 31839 109579 62912 130470 26082 102718 25272 17893 55607 48053 34513 23154 136492 8313 136454 57920 60639 68601 50656 16871 101625 88777 35367 62644 80269 24346 33961 74832 62520 8...

output:


result: