https://codeforces.com/problemset/problem/1430/E
CF的E题每次都有新发现
这题其实是逆序对,树状数组求逆序对,没事了
以后见到反转次数,先想逆序对
#include<iostream>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
const int maxn = 2e5+11;
int list[maxn*10];
queue<int>que[30];
int lowbit(int x){
return x&(-x);
}
int add(int x){
while(x < maxn){
list[x]++;
x += lowbit(x);
}
return 0;
}
int get(int x){
int ans = 0;
while(x > 0){
ans += list[x];
x -= lowbit(x);
}
return ans;
}
string sn,cn;
int ans[maxn];
int main(){
int n;
cin>>n;
cin>>sn;
cn = sn;
reverse(cn.begin(),cn.end());
for(int i=0;i<sn.size();i++){
int t = sn[i] - 'a';
que[t].push(i);
}
for(int i=0;i<n;i++){
int t = cn[i] - 'a';
ans[i] = que[t].front() + 1;
que[t].pop();
}
long long cns = 0;
for(int i=n-1;i>=0;i--){
cns += get(ans[i]);
add(ans[i]);
}
cout<<cns<<endl;
return 0;
}