zoukankan      html  css  js  c++  java
  • P3531 [POI2012]LIT-Letters

    Jennie

    很有意思

    首先贪心的对每一个a中字符匹配B中出现的第一个对应未匹配字符,这样的话就有了顺序

    然后每一次的操作是交换相邻的字符,很像某种求逆序对方式对不对

    然后这个题就是求逆序对

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<queue>
    #include<stack>
    #include<map>
    #define int long long
    using namespace std;
    int n;
    char s1[5000001],s2[5000001];
    queue<int> q[27];
    int tr[5000005];
    struct p{
       int id;
       int v;
    }po[2000005];
    int lowbit(int x){
       return x&(-x);
    }
    void add(int x,int v){
       for(int i=x;i<=n+1;i+=lowbit(i)){
       	tr[i]+=v;
       }
    }
    int qur(int x){
    //	cout<<x<<endl;
       int ans=0;
       while(x){
       	ans+=tr[x];
       	x-=lowbit(x);
       }
       return ans;
    }
    int re[1000001];
    int an;
    bool cmp(p x,p y){
       return x.v>y.v;
    }
    signed main(){
       cin>>n;
       n+=2;
       for(int i=3;i<=n;++i){
       	cin>>s1[i];
       	q[s1[i]-'A'].push(i);
       	//cout<<i<<endl;
       }
       for(int i=3;i<=n;++i){  
       	cin>>s2[i];
       	po[i].v=q[s2[i]-'A'].front();
       	po[i].id=i;
       	q[s2[i]-'A'].pop();
       }
       sort(po+3,po+n+1,cmp);
       for(int i=3;i<=n;++i){
       //	cout<<re[i]<<endl;
       	add(po[i].id,1);
       	an+=qur(po[i].id-1);
       //	cout<<x<<endl;
       }
       cout<<an;
       return 0;
    }
       
    
    
  • 相关阅读:
    常见makefile写法
    CMake入门指南
    CMAKE的使用
    Google NewSQL之Spanner
    Google Spanner (中文版)
    全球级的分布式数据库 Google Spanner原理
    idea刷新项目、清除项目缓存
    彻底理解Java的Future模式
    Elasticsearch 三种分页方式
    ElasticSearch 深度分页解决方案
  • 原文地址:https://www.cnblogs.com/For-Miku/p/15363962.html
Copyright © 2011-2022 走看看