Submission #787542

#TimeUsernameProblemLanguageResultExecution timeMemory
787542vjudge1Swap Swap Sort (CCO21_day1problem1)C++14
25 / 25
2136 ms58048 KiB
#include <bits/stdc++.h>
#define ha(x,y) (100003ll*(x)+1ll*(y))
using namespace std;
constexpr int N=1e5+7,M=1e5+7,Q=1e6+7,X=3005;
int n,m,q,B;
int p[M],a[N];
vector<int> pos[M];
int id[M];
long long ans,f[X][X];
inline long long bf(){
    static struct Fwk{
        array<int,N> s;
        static inline int l(int x){return x&(-x);}
        inline void clear(){memset(s.begin()+1,0,m*sizeof(int));}
        inline void add(int x,int v){for(;x<=m;x+=l(x))s[x]+=v;}
        inline int sum(int x){int t{0};for(;x;x^=l(x))t+=s[x];return t;}
        inline int query(int l,int r){return sum(r)-sum(l-1);}
    }tr;
    long long s{0ll};
    for(int i{1};i<=n;++i){
        s+=tr.query(a[i]+1,m);
        tr.add(a[i],1);
    }
    for(int i{1};i<=n;++i){
        tr.add(a[i],-1);
    }
    return s;
}
inline void init(){
    int idc{0};
    static int cnt[X];
    for(int i{1};i<=m;++i){
        if((int)pos[i].size()>B){
            id[i]=++idc;
        }
    }
    for(int i{1};i<=n;++i){
        if(id[a[i]]){
            for(int j{1};j<=idc;++j){
                if(j==id[a[i]]) continue;
                f[j][id[a[i]]]+=cnt[j];
            }
            ++cnt[id[a[i]]];
        }
    }
}
inline long long query(int x,int y){
    if(pos[x].empty()||pos[y].empty()) return 0LL;
    if(id[x]&&id[y]) return f[id[x]][id[y]];
    int t{0};
    long long s{0ll};
    if(pos[x].size()<pos[y].size()){
        for(int i:pos[x]){
            t=upper_bound(pos[y].begin()+t,pos[y].end(),i)-pos[y].begin();
            s+=pos[y].size()-t;
        }
    }
    else{
        for(int i:pos[y]){
            t=upper_bound(pos[x].begin()+t,pos[x].end(),i)-pos[x].begin()-1;
            s+=t+1;
        }
    }
    return s;
}
signed main(){
    scanf("%d%d%d",&n,&m,&q);
    iota(p+1,p+m+1,1);
    B=max(int(cbrtl(2.0l*n*n/q/log2(n))),n/3000+1);
    for(int i{1};i<=n;++i){
        scanf("%d",&a[i]);
        pos[a[i]].emplace_back(i);
    }
    ans=bf();
    init();
    for(int i{1};i<=q;++i){
        int x;
        scanf("%d",&x);
        ans-=query(p[x+1],p[x]);
        ans+=query(p[x],p[x+1]);
        swap(p[x],p[x+1]);
        printf("%lld\n",ans);
    }
    return 0;
}
/*
    n^2/B^2+qBlogn
    min =n^2/B^2+qBlogn/2+qBlogn/2
        =3*cbrt(q^2*n^2log^2 n/4)
    n^2/B^2=qlogn*B/2
    B^3=2*n^2/(qlogn)
*/
/*
1 4 2 1 2
1 2 3 4
1 1 2 2 4
*/

Compilation message (stderr)

Main.cpp: In function 'int main()':
Main.cpp:67:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   67 |     scanf("%d%d%d",&n,&m,&q);
      |     ~~~~~^~~~~~~~~~~~~~~~~~~
Main.cpp:71:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   71 |         scanf("%d",&a[i]);
      |         ~~~~~^~~~~~~~~~~~
Main.cpp:78:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   78 |         scanf("%d",&x);
      |         ~~~~~^~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...