CodeForces - 1430E - String Reversal (贪心 + 树状数组求逆序数)

简介: 笔记

String Reversal


题意

对于一个字符串 每次可以交换相邻的两个字符 问 最少经过多少次操作后能将原来的字符串倒序


思路

对于样例 aaaza 倒序后应该是 azaaa 从最后一个字符开始看 需要有一个a 移到最后面,因为源字符串中有多个a 显然 把下标最大的a 移到最后花费的操作次数最小


操作前下标12345 操作后下标14235 逆序数恰好为 2 所以大胆假设 不用求证(不是) 本题即为按照上面规得到新的下标然后求逆序数即可 逆序数用树状数组维护


代码

   #include<bits/stdc++.h>
#define INF 0x3f3f3f3f3f3f3f3f
#define mod 1000000007
#define endl '\n'
using namespace std;
typedef  long long LL;
inline LL gcd(LL a, LL b) { return b ? gcd(b, a % b) : a; }
inline LL lowbit(LL x) {return x & -x;}
const int N = 200010;
LL n;
string s;
vector<int>v[30];
int temp[30]; //记录每个字母使用到了第几个
LL tr[4 * N];
LL query(LL x) {
  LL res = 0;
  for (int i = x; i ; i -= lowbit(i))res += tr[i];
  return res;
}
void modify(LL x, LL c) {
  for (int i = x; i <= n; i += lowbit(i))tr[i] += c;
}
void solve() {
  cin >> n;
  cin >> s;
  for (int i = n - 1; i >= 0; --i) {
    v[s[i] - 'a'].push_back(i + 1); //存每个字母出现的位置 大的优先
  }
  reverse(s.begin(), s.end());
  LL res = 0;
  for (int i = n - 1; i >= 0; --i) {
    LL x = query(v[s[i] - 'a'][temp[s[i] - 'a']]);
    res += x;
    //cout << "! " << v[s[i] - 'a'][temp[s[i] - 'a']] << endl;
    //cout << "x == " << x << endl;
    modify(v[s[i] - 'a'][temp[s[i] - 'a']], 1);
    temp[s[i] - 'a']++;
  }
  cout << res << endl;
}
int main() {
  //int t; cin >> t;
  //while(t--)
    solve();
  return 0;
}


目录
相关文章
|
存储 算法 NoSQL
TinyKv介绍
TinyKv介绍
501 1
|
算法 程序员 C语言
C/C++原子操作与atomic CAS底层实现原理
假定有两个操作A 和B,如果从执行A 的线程来看,当另一个线程执行B 时,要么将B 全部执行完,要么完全不执行B,那么A 和B 对彼此来说是原子的。
968 1
C/C++原子操作与atomic CAS底层实现原理
|
7月前
|
供应链 NoSQL Java
用Redisson写一个库存扣减的方法
通过本文的介绍,我们详细讲解了如何使用Redisson实现一个简单的库存扣减功能。通过使用分布式锁,可以确保库存扣减操作的原子性和高效性。希望本文能帮助您更好地理解和应用Redisson,构建高效、可靠的库存管理系统。
251 15
|
算法
【LeetCode刷题】滑动窗口解决问题:串联所有单词的子串(困难)、最小覆盖子串(困难)
【LeetCode刷题】滑动窗口解决问题:串联所有单词的子串(困难)、最小覆盖子串(困难)
107 1
|
存储 安全 算法
【C++ 包装器类 std::atomic 】全面入门指南:深入理解并掌握C++ std::atomic 原子操作 的实用技巧与应用
【C++ 包装器类 std::atomic 】全面入门指南:深入理解并掌握C++ std::atomic 原子操作 的实用技巧与应用
1199 1
|
JavaScript 小程序 Java
果蔬经营平台|基于SSM+vue的果蔬经营平台系统的设计与实现(源码+数据库+文档)
果蔬经营平台|基于SSM+vue的果蔬经营平台系统的设计与实现(源码+数据库+文档)
156 0
|
消息中间件 缓存 NoSQL
高并发缓存队列防止溢出解决方案
高并发缓存队列防止溢出解决方案
401 0
|
NoSQL 安全 API
redis6.0源码分析:简单动态字符串sds
redis6.0源码分析:简单动态字符串sds
101 0
redis6.0源码分析:简单动态字符串sds
|
前端开发 Go API
Day07:GORM快速入门04 查找| 青训营
Day07:GORM快速入门04 查找| 青训营
265Echarts - GL 矢量场图(Flow on the cartesian)
265Echarts - GL 矢量场图(Flow on the cartesian)
145 0