树状数组求逆序对-洛谷P3531 [POI2012]LIT-Letters

来源:互联网 发布:mac 拷贝照片到u盘 编辑:程序博客网 时间:2024/05/17 02:11

https://daniu.luogu.org/problem/show?pid=3531
我们把A串标个号;
然后在B串里按A串的标号求一下逆序对就好了;
对于重复的字母;
A串里直接靠前的标号小
B串也一样;
这样显然正确;

#include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cstring>#define Ll long longusing namespace std;struct cs{    Ll nxt;}a[1000005];Ll f[1000005];Ll head[100],ll,now[100];Ll n,ans,k,kk;char c;Ll out(Ll k){    Ll ans=0;    for(Ll i=k;i>=1;i-=i&-i)ans+=f[i];    return ans;}Ll add(Ll k){    for(Ll i=k;i<=n;i+=i&-i)f[i]++;}int main(){    ios::sync_with_stdio(false);    cin>>n;    for(Ll i=1;i<=n;i++){        cin>>c;        k=c;        if(now[k]==0)head[k]=i;else a[now[k]].nxt=i;        now[k]=i;    }    for(Ll i=1;i<=n;i++){        cin>>c;        kk=c;        k=head[kk];        head[kk]=a[head[kk]].nxt;        k=n-k+1;        ans+=out(k);        add(k);    }    cout<<ans;}
1 0