0
点赞
收藏
分享

微信扫一扫

Codeforces Round #404 (Div. 2) CF785E Anton and Permutation

源码之路 2022-05-06 阅读 21
c++
#include <iostream>  
#include <stdio.h>  
#include <string.h>   
#include <stack>  
#include <queue>   
#include <map>  
#include <set>  
#include <vector>  
#include <math.h>  
#include <bitset>  
#include <algorithm>  
#include <climits>
using namespace std;
#define ll long long
const int N=2e5+10;
int n,q,bl[N],val[N],S;
vector<int>v[N];
void change(int x,int y){
    if(bl[x]!=bl[y]){
        v[bl[x]].erase(lower_bound(v[bl[x]].begin(),v[bl[x]].end(),val[x]));
        v[bl[x]].insert(lower_bound(v[bl[x]].begin(),v[bl[x]].end(),val[y]),val[y]);
        v[bl[y]].erase(lower_bound(v[bl[y]].begin(),v[bl[y]].end(),val[y]));
        v[bl[y]].insert(lower_bound(v[bl[y]].begin(),v[bl[y]].end(),val[x]),val[x]);
    }
    swap(val[x],val[y]);
}
int query(int l,int r,int x){
	if(l>r) return 0;
    int res=0;
    for(int i=l;i<=min(r,bl[l]*S);i++) res+=(val[i]<x);
    // cout<<l<<" "<<r<<" "<<x<<" "<<res<<endl;
    if(bl[l]==bl[r]) return res;
    for(int i=(bl[r]-1)*S+1;i<=min(r,bl[r]*S);i++) res+=(val[i]<x);
    for(int i=bl[l]+1;i<=bl[r]-1;i++){res+=lower_bound(v[i].begin(),v[i].end(),x)-v[i].begin();}
    return res;
}
int main(){
    scanf("%d%d",&n,&q);
    S=sqrt(n);
    for(int i=1;i<=n;i++){bl[i]=(i-1)/S+1;val[i]=i;v[bl[i]].push_back(i);}
    ll res=0;
    while(q--){
        int l,r;scanf("%d%d",&l,&r);if(l>r) swap(l,r);
        if(l==r) printf("%lld\n",res);
        else{
            if(val[l]<val[r]) ++res;else --res;
            res+=2*(query(l+1,r-1,val[r])-query(l+1,r-1,val[l])); 
            change(l,r);
            printf("%lld\n",res);
        }
       
    }
}
举报

相关推荐

0 条评论