zoukankan      html  css  js  c++  java
  • 【bzoj2789】 Letters 树状数组

    又是一道树状数组求逆序对的题目。

    这一题我们可以将第二个串中的每一个字母,与第一个串中的字母做两两匹配,令第二个串第i个字母的值id[i]为该字母与第一个串中的字母匹配到的位置。

    然后考虑到所求答案为最小的移动次数,那么这个最小的移动次数显然为序列id的逆序对个数。

    树状数组求一求就没了。

    我一看时间只剩15min了本来想看下能否打完的,没想到3min打完了。。。。

     1 #include<bits/stdc++.h>
     2 #define M 2000005
     3 #define L long long
     4 #define lowbit(x) (x)&(-x)
     5 using namespace std;
     6 
     7 char c[M]={0};
     8 int n,a[M]={0};
     9 void add(int x,int k){for(;x<=n;x+=lowbit(x)) a[x]+=k;}
    10 int sum(int x){int k=0;for(;x;x-=lowbit(x)) k+=a[x]; return k;} 
    11 priority_queue<int> q[26];
    12 int main(){
    13     scanf("%d",&n);
    14     scanf("%s",c+1);
    15     for(int i=1;i<=n;i++)
    16     q[c[i]-'A'].push(-i);
    17     scanf("%s",c+1);
    18     L ans=0;
    19     for(int i=1;i<=n;i++){
    20         int id=-q[c[i]-'A'].top(); q[c[i]-'A'].pop();
    21         ans+=sum(n)-sum(id);
    22         add(id,1);
    23     }
    24     cout<<ans<<endl;
    25 }

     

  • 相关阅读:
    java生成验证码
    SpringBoot定时任务
    事务管理
    Windows 2008 Server R2双网卡负载均衡
    HP Proliant DL580 gen9 阵列卡P440AR 高速缓存 被禁用
    Kali Debian 修改时区
    First Py From Py
    C++头文件#include<bits/stdc++.h>
    排序算法
    运算符优先级
  • 原文地址:https://www.cnblogs.com/xiefengze1/p/9902244.html
Copyright © 2011-2022 走看看