Submission #1297425

#TimeUsernameProblemLanguageResultExecution timeMemory
1297425danglayloi1Bubble Sort 2 (JOI18_bubblesort2)C++20
100 / 100
1457 ms157816 KiB
#include <bits/stdc++.h>
#define ii pair<int, int>
#define fi first
#define se second
#define inf 0x3f3f3f3f
using namespace std;
using ll = long long;
const ll mod=1e9+7;
const int nx=1e6+5;
set<int> pos[nx];
int nod[nx<<2], la[nx<<2], pre[nx];
void build(int id, int l, int r)
{
    la[id]=0;
    if(l==r) return void(nod[id]=*pos[l].rbegin()-pre[l]);
    int mid=(l+r)>>1;
    build(id<<1, l, mid);
    build(id<<1|1, mid+1, r);
    nod[id]=max(nod[id<<1], nod[id<<1|1]);
}
void down(int id)
{
    if(!la[id]) return;
    for(int j = id*2; j <= id*2+1; j++)
        la[j]+=la[id], nod[j]+=la[id];
    la[id]=0;
}
void update(int id, int l, int r, int u, int v, int val)
{
    if(l>v || r<u) return;
    if(l>=u && r<=v)
    {
        nod[id]+=val;
        la[id]+=val;
        return;
    }
    int mid=(l+r)>>1;
    down(id);
    update(id<<1, l, mid, u, v, val);
    update(id<<1|1, mid+1, r, u, v, val);
    nod[id]=max(nod[id<<1], nod[id<<1|1]);
}
int get(int id, int l, int r, int u, int v)
{
    if(l>v || r<u) return -inf;
    if(l>=u && r<=v) return nod[id];
    int mid=(l+r)>>1;
    down(id);
    return max(get(id<<1, l, mid, u, v), get(id<<1|1, mid+1, r, u, v));
}
vector<int> countScans(vector<int> a, vector<int> X, vector<int> V)
{
    vector<int> rar;
    rar.clear();
    int n=a.size();
    for(int i = 0; i < n; i++)
        rar.emplace_back(a[i]);
    int q=X.size();
    for(int i = 0; i < q; i++)
        rar.emplace_back(V[i]);
    sort(rar.begin(), rar.end());
    rar.erase(unique(rar.begin(), rar.end()), rar.end());
    int m=rar.size();
    pre[0]=0;
    for(int i = 1; i <= m; i++)
        pos[i].emplace(-inf), pre[i]=0;
    for(int i = 0; i < n; i++)
    {
        a[i]=upper_bound(rar.begin(), rar.end(), a[i])-rar.begin();
        pos[a[i]].emplace(i);
        pre[a[i]]++;
    }
    for(int i = 1; i <= m; i++)
        pre[i]+=pre[i-1];
    build(1, 1, m);
    vector<int> res;
    res.clear();
    // for(int j = 1; j <= m; j++)
    //         cout<<get(1, 1, m, j, j)<<' ';
    //     cout<<'\n';
    for(int i = 0; i < q; i++)
    {
        int old=*pos[a[X[i]]].rbegin();
        pos[a[X[i]]].erase(pos[a[X[i]]].find(X[i]));
        int nw=*pos[a[X[i]]].rbegin();
        update(1, 1, m, a[X[i]], a[X[i]], nw-old);
        update(1, 1, m, a[X[i]], m, 1);
        int val=upper_bound(rar.begin(), rar.end(), V[i])-rar.begin();
        old=*pos[val].rbegin();
        pos[val].emplace(X[i]);
        nw=*pos[val].rbegin();
        update(1, 1, m, val, val, nw-old);
        update(1, 1, m, val, m, -1);
        a[X[i]]=val;
        res.emplace_back(nod[1]+1);
        // for(int j = 1; j <= m; j++)
        //     cout<<get(1, 1, m, j, j)<<' ';
        // cout<<'\n';
    }
    return res;
}
// signed main()
// {
//     ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
//     freopen("inputf.in", "r", stdin);
//     freopen("outputf.out", "w", stdout);
//     int n, q;
//     cin>>n>>q;
//     vector<int> a, x, v;
//     a.clear(), x.clear(), v.clear();
//     for(int i = 0; i < n; i++)
//     {
//         int p;
//         cin>>p;
//         a.emplace_back(p);
//     }
//     for(int i = 0; i < q; i++)
//     {
//         int l, r;
//         cin>>l>>r;
//         x.emplace_back(l);
//         v.emplace_back(r);
//     }
//     vector<int> res=countScans(a, x, v);
//     for(int x:res) cout<<x<<'\n';
// }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...