题目地址:https://www.luogu.org/problem/P1774

题意:


求将一个序列变成下降的序列,所需要的最少交换次数(转化成求逆序对问题+离散化+long long)

ac代码:


树状数组法:

#include<bits/stdc++.h>
using namespace std;
const int maxn = 500015;
#define lowbit(x) ((x)&(-x))
int n;
long long c[maxn], a[maxn], b[maxn];
long long res;
void update(int x, int v)
{for(int i = x; i <= n; i += lowbit(i))c[i] += v;
}
long long getsum(int x)
{long long ans = 0;for(int i = x; i > 0; i -= lowbit(i))ans += c[i];return ans;
}
int main()
{//freopen("/Users/zhangkanqi/Desktop/11.txt","r",stdin);scanf("%d", &n);for(int i = 1; i <= n; i++){scanf("%lld", &a[i]);b[i] = a[i];}sort(a+1, a+1+n);int num = unique(a+1, a+1+n) - (a+1);for(int i = n; i >= 1; i--) //倒序处理,寻找后面比它小的数的个数,因为getsum是求的1-x的和{int no = lower_bound(a+1, a+1+num, b[i]) - a;res += getsum(no - 1); //在它后边比它小的update(no, 1);}printf("%lld\n", res);return 0;
}

权值线段树法:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 500010;
long long  a[maxn], b[maxn], cnt[4*maxn];
long long res;
void update(int id )
{cnt[id] = cnt[id << 1] + cnt[id << 1 | 1];
}
void build(int l, int r, int id, int no)
{if(l == r){cnt[id]++;return ;}int mid = (l + r) >> 1;if(no <= mid) build(l, mid, id << 1, no);// 单点else build(mid + 1, r, id << 1 | 1, no);update(id);
}
long long query(int l, int r, int id, int k) //查询目前为止第k小到最大的数有多少个
{if(l == r){//printf("l:%d-r:%d  sum: %lld\n", l, r, cnt[id]);return cnt[id]; //第l小的数目前为止出现了cnt[id]次}int mid = (l + r) >> 1;long long sum = 0;if(k <= mid)  sum += query(l, mid, id << 1, k) + cnt[id << 1 | 1]; //目标是要找到l == r =kelse sum += query(mid + 1, r, id << 1 | 1, k);//!k - cnt[id << 1]// printf("l:%d-r:%d  sum: %lld\n", l, r, sum);return  sum;
}
int main()
{//freopen("/Users/zhangkanqi/Desktop/11.txt","r",stdin);int n;scanf("%d", &n);for(int i = 1; i <= n; i++){scanf("%lld", &a[i]);b[i] = a[i];}sort(a+1, a+1+n);int num = unique(a+1, a+1+n) - (a+1);for(int i = 1; i <= n; i++){int no = lower_bound(a+1, a+1+num, b[i]) - a;// printf("b[i]:%d no:%d \n ", b[i], no);long long  que = query(1, num+1, 1, no+1); //找到第no+1小到第num+1小的数出现了多少次,即比no大的数出现了多少次//printf("que:%lld\n", que);res += que;build(1, num+1, 1, no);}printf("%lld\n", res);return 0;
}

【洛谷P1774】最接近神的人_NOI导刊2010提高(02)(模版题---求逆序对数目+离散化---树状数组/权值线段树)相关推荐

  1. 洛谷 P1774 最接近神的人_NOI导刊2010提高(02)

    题目描述 破解了符文之语,小FF开启了通往地下的道路.当他走到最底层时,发现正前方有一扇巨石门,门上雕刻着一幅古代人进行某种活动的图案.而石门上方用古代文写着"神的殿堂".小FF猜 ...

  2. luogu P1774 最接近神的人_NOI导刊2010提高(02)

    题目描述 破解了符文之语,小FF开启了通往地下的道路.当他走到最底层时,发现正前方有一扇巨石门,门上雕刻着一幅古代人进行某种活动的图案.而石门上方用古代文写着"神的殿堂".小FF猜 ...

  3. 最接近神的人_NOI导刊2010提高(02)【洛谷P1774】

    题目描述 破解了符文之语,小FF开启了通往地下的道路.当他走到最底层时,发现正前方有一扇巨石门,门上雕刻着一幅古代人进行某种活动的图案.而石门上方用古代文写着"神的殿堂".小FF猜 ...

  4. 洛谷 P1796 汤姆斯的天堂梦_NOI导刊2010提高(05)

    P1796 汤姆斯的天堂梦_NOI导刊2010提高(05) 题目描述 汤姆斯生活在一个等级为0的星球上.那里的环境极其恶劣,每天12小时的工作和成堆的垃圾让人忍无可忍.他向往着等级为N的星球上天堂般的 ...

  5. 洛谷P1807 最长路_NOI导刊2010提高(07) 求有向无环图的 最长路 图论

    洛谷P1807 最长路_NOI导刊2010提高(07) 图论 求有向无环图的 最长路 首先阐明一点 最长路dijkstra 是不能做 (当然我是不会做的,不过我貌似看到过网上的dalao有用dijst ...

  6. 洛谷 P1774 最接近神的人(权值线段树+离散化)

    根据贪心,每次都要交换两个逆序对,所以这个题目就是求逆序对的个数 利用权值线段树来动态加点,每次询问找区间内 [id+1,n] 的所有数的个数,由于取值线段树本身具有顺序,所以可以将区间查询变为单点查 ...

  7. 洛谷—— P1775 古代人的难题_NOI导刊2010提高(02)

    P1775 古代人的难题_NOI导刊2010提高(02) 题目描述 门打开了,里面果然是个很大的厅堂.但可惜厅堂内除了中央的一张羊皮纸和一支精致的石笔,周围几具骷髅外什么也没有.难道这就是王室的遗产? ...

  8. 洛古 P1774 最接近神的人

    置顶题解 P1908 [逆序对] - zhylj 的博客 - 洛谷博客​​​​​​ 链接里有过程图,但题解里的题大小顺序和本题是相反的,但问题不大 题目描述 破解了符文之语,小FF开启了通往地下的道路 ...

  9. 洛谷 1774 最接近神的人

    [题解] 其实就是求逆序对.直接上树状数组就好了. 1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring ...

  10. 汤姆斯的天堂梦_NOI导刊2010提高(05)【洛谷P1796】

    题目描述 汤姆斯生活在一个等级为0的星球上.那里的环境极其恶劣,每天12小时的工作和成堆的垃圾让人忍无可忍.他向往着等级为N的星球上天堂般的生活. 有一些航班将人从低等级的星球送上高一级的星球,有时需 ...

最新文章

  1. 2018-3-25论文(Whale Optimizer Algorithm)+(Gery Wolf Optimizer)笔记二---Introduction 对比
  2. telegraf监控mysql数据库_部署Telegraf+Influxdb+Grafana 架构来监控 MySQL
  3. Shell脚本的学习笔记一:变量
  4. Leetcode--164. 最大间距
  5. aspose 转pdf表格大小乱了_自己写了一个小工具类:pdf转word,没有页数和大小限制,保真!...
  6. 如果你身边有这样的人,赶紧让他说点什么,然后反过来买彩票
  7. Oracle数据库常用sql语句
  8. axios 中文文档
  9. Python chain
  10. 江苏农村商业银行计算机类笔试考什么时候,2020江苏农商行笔试考试内容是什么?...
  11. APP内跳转QQ和陌生人聊天实现客服功能
  12. performing vcs refresh卡住不动解决方法
  13. 拉格朗日乘子法、对偶、KTT
  14. 【Windows】Windows10家庭版永久关闭自动更新
  15. 论文分享:基于深度强化学习的无人机三维导航
  16. pmp中ram和raci的区别_还有10天了,如何快速通过PMP考试?
  17. PXC高可用集群总结
  18. jdbc.properties 系统找不到指定路径问题
  19. \t\t开心学国学(转载)
  20. Java虚拟机内存的堆区(heap),栈区(stack)和静态区(static/method)

热门文章

  1. Git部署Git使用Git子模块
  2. 使用axis的工具类 wsdl2java生成java代码,利用CXF wsdl2java生成java代码以及施用Apache Axis 1.4 wsdl2java生成java代码...
  3. js监听scrolltop_js中scrollTop()方法和scroll()方法用法示例
  4. java9之后,String为何从char类型数组转成byte类型数组
  5. 中班音乐活动 机器人_幼儿园大班音乐活动教案:《机器人》
  6. dbeaver 修改数据_GitHub 上 5 款超好用的数据库 GUI 带你玩转 MongoDB、Redis、SQL 数据库...
  7. 矩阵连乘备忘录算法java_矩阵连乘(备忘录方法:自顶向下递归)
  8. php 接摄像头数据_详解一个交换机能带动多少个网络监控摄像头?
  9. 【转】C#操作sqlServer数据库
  10. sed,awk,grep教程