zoukankan      html  css  js  c++  java
  • luogu P1774 最接近神的人_NOI导刊2010提高(02)|树状数组求逆序对

    题目描述

    破解了符文之语,小FF开启了通往地下的道路。当他走到最底层时,发现正前方有一扇巨石门,门上雕刻着一幅古代人进行某种活动的图案。而石门上方用古代文写着“神的殿堂”。小FF猜想里面应该就有王室的遗产了。但现在的问题是如何打开这扇门……

    仔细研究后,他发现门上的图案大概是说:古代人认为只有智者才是最容易接近神明的。而最聪明的人往往通过一种仪式选拔出来。仪式大概是指,即将隐退的智者为他的候选人写下一串无序的数字,并让他们进行一种操作,即交换序列中相邻的两个元素。而用最少的交换次数使原序列变成不下降序列的人即是下一任智者。

    小FF发现门上同样有着n个数字。于是他认为打开这扇门的秘诀就是找到让这个序列变成不下降序列所需要的最小次数。但小FF不会……只好又找到了你,并答应事成之后与你三七分……

    输入格式

    第一行为一个整数n,表示序列长度

    第二行为n个整数,表示序列中每个元素。

    输出格式

    一个整数ans,即最少操作次数。

    说明/提示

    对于30%的数据1≤n≤10^4。

    对于100%的数据1≤n≤5*10^5;

    -maxlongint≤A[i]≤maxlongint。


    找逆序对啊,树状数组乱搞一下就是了

    #include<queue>
    #include<cstdio>
    #include<vector>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    const int N=5e5+10;
    #define int long long
    using namespace std;
    int c[N],n,a[N],b[N];
    inline void add(int x,int y){
    	for(;x<=n;x+=x&(-x))c[x]+=y;
    }
    inline int sum(int x){
    	int ans=0;
    	for(;x;x-=x&(-x))ans+=c[x];
    	return ans;
    }
    signed main(){
    	cin>>n;
    	for(int i=1;i<=n;i++){
    		scanf("%lld",&a[i]);
    		b[i]=a[i];
    	}
    	sort(b+1,b+1+n);
    	int len=unique(b+1,b+1+n)-b-1;
    	for(int i=1;i<=n;i++)
    	a[i]=lower_bound(b+1,b+1+len,a[i])-b;
    	int ans=0;
    	for(int i=n;i>=1;i--){
    		ans+=sum(a[i]-1);
    		add(a[i],1);
    	}
    	cout<<ans<<endl;
    }
    
  • 相关阅读:
    IDEA、Eclipse快捷键对比
    linux常见命令
    拷贝本地文件到远程服务器的批处理脚本
    关系型数据库的超键、候选键、主键
    JAVA运算符总结
    JAVA原码反码补码
    JPA查询语句(转载)
    Spring Data JPA初使用(转载)
    android学习————项目导入常见错误整理(转载)
    Spring 系列: Spring 框架简介
  • 原文地址:https://www.cnblogs.com/naruto-mzx/p/11754127.html
Copyright © 2011-2022 走看看