学习了分块算法。
转载一发。
http://blog.csdn.net/aozil_yang/article/details/62396346
我的代码:改成longlong就能AC了。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 200010;
int n,q;
int p[maxn];
int siz,num;
vector<int>vec[maxn];
int L[maxn];
int R[maxn];
int belong[maxn];
void init()
{
siz=sqrt(n);
num=(n-1)/siz+1;
for(int i=1;i<=n;i++)
{
belong[i]=(i-1)/siz+1;
vec[belong[i]].push_back(i);
p[i]=i;
}
for(int i=1;i<=num;i++)
{
L[i]=(i-1)*siz+1;
R[i]=i*siz;
}
R[num]=n;
}
int qry(int l,int r,int x)
{
if(l>r) return 0;
if(belong[l]==belong[r])
{
int ret=0;
for(int i=l;i<=r;i++) if(p[i]<x) ret++;
return ret;
}
else
{
int ret=0;
for(int i=l;i<=R[belong[l]];i++) if(p[i]<x) ret++;
for(int i=L[belong[r]];i<=r;i++) if(p[i]<x) ret++;
for(int i=belong[l]+1;i<belong[r];i++) ret+=lower_bound(vec[i].begin(),vec[i].end(),x)-vec[i].begin();
return ret;
}
}
void upd(int a,int b)
{
vec[belong[a]].erase(lower_bound(vec[belong[a]].begin(),vec[belong[a]].end(),p[a]));
vec[belong[a]].insert(lower_bound(vec[belong[a]].begin(),vec[belong[a]].end(),p[b]),p[b]);
vec[belong[b]].erase(lower_bound(vec[belong[b]].begin(),vec[belong[b]].end(),p[b]));
vec[belong[b]].insert(lower_bound(vec[belong[b]].begin(),vec[belong[b]].end(),p[a]),p[a]);
swap(p[a],p[b]);
}
int ans;
int main()
{
int a,b;
scanf("%d %d",&n,&q);
init();
while(q--)
{
scanf("%d %d",&a,&b);
if(a==b)
{
printf("%d\n",ans);
continue;
}
if(a>b) swap(a,b);
int tp;
tp=qry(a+1,b-1,p[a]);
ans-=tp;
ans+=b-a-1-tp;
tp=qry(a+1,b-1,p[b]);
ans+=tp;
ans-=b-a-1-tp;
if(p[b]>p[a]) ans++;
else ans--;
printf("%d\n",ans);
upd(a,b);
}
return 0;
}