连续两次崩盘是一种什么样的体验?

最近没练题,结果就是昨天全程被木下大佬带飞。可能跟平常练的也有关系吧。毕竟平常练习的题目还是高端算法多一点。f能一眼描出记忆化,但是b和c就被卡的死死的。

我打算从今天起3 + 1练习模式,3道黄题 + 1道洛谷绿-紫,这样才能不在低级错误失分。

昨天E题我能做出来的,非常简单,就是正着编号,然后倒着扫一遍把编号重新填进去求逆序对就行,然而万恶的没做出来。今天听人讲了思路之后秒懂,哎。

#include <bits/stdc++.h>
using namespace std;
#define limit (200000 + 5)//防止溢出
#define INF 0x3f3f3f3f
#define inf 0x3f3f3f3f3f
#define lowbit(i) i&(-i)//一步两步
#define EPS 1e-6
#define FASTIO  ios::sync_with_stdio(false);cin.tie(0);
#define ff(a) printf("%d\n",a );
#define pi(a,b) pair<a,b>
#define rep(i, a, b) for(ll i = a; i <= b ; ++i)
#define per(i, a, b) for(ll i = b ; i >= a  ; --i)
#define MOD 998244353
#define traverse(u) for(int i = head[u]; ~i ; i = edge[i].next)
#define FOPEN freopen("C:\\Users\\tiany\\CLionProjects\\acm_01\\data.txt", "rt", stdin)
#define FOUT freopen("C:\\Users\\tiany\\CLionProjects\\acm_01\\dabiao.txt", "wt", stdout)
#define debug(x) cout<<x<<endl
typedef long long ll;
typedef unsigned long long ull;
inline ll read(){
    ll sign = 1, x = 0;char s = getchar();
    while(s > '9' || s < '0' ){if(s == '-')sign = -1;s = getchar();}
    while(s >= '0' && s <= '9'){x = (x << 3) + (x << 1) + s - '0';s = getchar();}
    return x * sign;
}//快读
void write(ll x){
    if(x < 0) putchar('-'),x = -x;
    if(x / 10) write(x / 10);
    putchar(x % 10 + '0');
}
int kase,n,k;
int a[limit];
char str[limit];
int temp[limit];
ll ans;
deque<int>q[30];
void mergeSort(int l , int r){
    if(l == r)return;
    int mid = l + (r - l) / 2;
    mergeSort(l , mid);
    mergeSort(mid + 1, r);
    int pa = l , pb = mid + 1, cnt = l;
    while(pa <= mid && pb <= r){
        if(a[pa] > a[pb]){
            ans += ll(mid - pa + 1);
            temp[cnt++] = a[pb++];
        }else{
            temp[cnt++] = a[pa++];
        }
    }
    while(pa <= mid){
        temp[cnt++] = a[pa++];
    }
    while(pb <= r){
        temp[cnt++] = a[pb++];
    }
    for(int i = l ; i <= r ; ++i){
        a[i] = temp[i];
    }
}
int main() {
#ifdef LOCAL
    FOPEN;
#endif
    cin>>n>>str+1;
    rep(i,1,n){
        int num = str[i] - 'a';
        q[num].push_back(i);
    }

    reverse(str + 1, str + 1 + n);
    rep(i,1,n){
        a[i] = q[str[i] - 'a'].front();
        q[str[i] - 'a'].pop_front();
    }
    mergeSort(1,n);
    write(ans);
    return 0;
}

 

posted @ 2020-10-12 16:57  tiany7  阅读(197)  评论(0)    收藏  举报