1 2 3 4

CodeForces - 1430E String Reversal

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;
} 

  

posted @ 2020-10-31 11:53  Lesning  阅读(80)  评论(0编辑  收藏  举报