B. 线段取交

news/2024/10/6 14:50:27/文章来源:https://www.cnblogs.com/YzaCsp/p/18449050

题目

下载链接

算法

可以发现是求逆序对
时间复杂度限制在 \(O(n \log n)\)

  • 树状数组
    记录每一个值的多少
    转化为求前缀和
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int tree[500010],ranks[500010],n;
long long ans; 
struct point
{int num,val;
}a[500010];
inline bool cmp(point q,point w)
{if(q.val==w.val)return q.num<w.num;return q.val<w.val;
}
inline void insert(int p,int d)
{for(;p<=n;p+=p&-p)tree[p]+=d; 
}
inline int query(int p)
{int sum=0;for(;p;p-=p&-p)sum+=tree[p];return sum;
}
int main()
{scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d",&a[i].val),a[i].num=i;sort(a+1,a+1+n,cmp);for(int i=1;i<=n;i++)ranks[a[i].num]=i;for(int i=1;i<=n;i++){insert(ranks[i],1);ans+=i-query(ranks[i]);}printf("%lld",ans);return 0;
}

~洛谷 ctj, 意思一下~

  • 归并排序
#include <bits/stdc++.h>
using namespace std;
int n, a[5000001], b[5000001];
long long ans;
inline void msort(int l, int r)//归并排序
{int mid = (l + r) / 2;//取中间 if(l == r)//若l == r了,就代表这个子序列就只剩1个元素了,需要返回 {return;}else{msort(l, mid);//分成l和中间一段,中间 + 1和r一段(二分) msort(mid + 1, r);}int i = l;//i从l开始,到mid,因为现在排序的是l ~ r的区间且要二分合并 int j = mid + 1;//j从mid + 1开始,到r原因同上int t = l;//数组b的下标,数组b存的是l ~ r区间排完序的值 while(i <= mid && j <= r)//同上i,j的解释 {if(a[i] > a[j])//如果前面的元素比后面大(l ~ mid中的元素 > mid + 1 ~ r中的元素)(逆序对出现!!!) { ans += mid - i + 1;//由于l ~ mid和mid + 1 ~ r都是有序序列所以一旦l ~ mid中的元素 > mid + 1 ~ r中的元素而又因为第i个元素 < i + 1 ~ mid那么i + 1 ~ mid的元素都 > 第j个元素。所以+的元素个数就是i ~ mid的元素个数,及mid - i + 1(归并排序里没有这句话,求逆序对里有) b[t++] = a[j];//第j个元素比i ~ mid的元素都小,那么第j个元素是目前最小的了,就放进b数组里 ++j;//下一个元素(mid + 1 ~ r的元素小,所以加第j个元素) }else{b[t++] = a[i];//i小,存a[i] ++i;//同理 }}while(i <= mid)//把剩的元素(因为较大所以在上面没选) {b[t++] = a[i];//存进去 ++i; }while(j <= r)//同理 {b[t++] = a[j];++j;}for(register int i = l; i <= r; ++i)//把有序序列b赋值到a里 {a[i] = b[i];}return;
}
int main()
{scanf("%d", &n);for(register int i = 1; i <= n; ++i){scanf("%d", &a[i]);}msort(1, n);//一开始序列是1 ~ n printf("%lld", ans);return 0;
}

仍然 ctj

总结

常见套路

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/809041.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

信息学奥赛复赛复习13-CSP-J2021-02插入排序-排序稳定性、插入排序、sort排序、结构体、计数排序

PDF文档公众号回复关键字:202410061P7910 [CSP-J 2021] 插入排序 [题目描述] 插入排序是一种非常常见且简单的排序算法。小 Z 是一名大一的新生,今天 H 老师刚刚在上课的时候讲了插入排序算法。 假设比较两个元素的时间为 O(1),则插入排序可以以 O(n^2) 的时间复杂度完成长度…

信息学奥赛复赛复习13-CSP-J2021-02插入排序-排序稳定性、插入排序、sort排序、结构图、计数排序

PDF文档公众号回复关键字:202410061P7910 [CSP-J 2021] 插入排序 [题目描述] 插入排序是一种非常常见且简单的排序算法。小 Z 是一名大一的新生,今天 H 老师刚刚在上课的时候讲了插入排序算法。 假设比较两个元素的时间为 O(1),则插入排序可以以 O(n^2) 的时间复杂度完成长度…

vue3 watch方法---监视基本类型数据

watch 监听定义的数据发生改变的时候执行什么函数 watch 方法有两个参数 watch(sum,箭头函数) 这个箭头函数里面有两个参数(newValue,oldValue)=> {},如下代码<template><!-- watch;监视数据变化 vue3 可以监视一下四种数据类型:ref定义的数据reactive 定义的…

2024-2025-1 20241421 《计算机基础与程序设计》第二周学习总结

这个作业属于哪个课程 2024-2025-1-计算机基础与程序设计这个作业要求在哪里 https://www.cnblogs.com/rocedu/p/9577842.html#WEEK02这个作业的目标 数字化、信息安全、自学教材计算机科学概论(第七版)第1章并完成云班课测试、 《C语言程序设计》第1章并完成云班课测试作业正…

学期(2024-2025-1) 学号20241425 《计算机基础与程序设计》第2周学习总结

学期(2024-2025-1) 学号20241425 《计算机基础与程序设计》第2周学习总结 作业信息这个作业属于哪个课程 <班级的链接>(2024-2025-1-计算机基础与程序设计)这个作业要求在哪里 <作业要求的链接>([2024-2025-1计算机基础与程序设计第二周作业]https://www.cnblo…

foobar2000 v2.1.6 汉化版

foobar2000 v2.1.6 汉化版 -----------------------【软件截图】---------------------- -----------------------【软件介绍】---------------------- foobar2000 是一个 Windows 平台下的高级音频播放器.包含完全支持 unicode 及支持播放增益的高级标签功能. 特色: * 支持的…

面相快速入门教程3面部与年龄

3 面部与年龄0 开始探索自己容貌的最简单方法之一,就是学会观察自己人生旅程的路线图--基于此时此刻的自己,每一个十年,甚至每一段岁月都是怎样的。 每个主要特征大约代表你人生中的一个十年。一个大的、强烈的或特别美丽的特征被认为意味着这些年总体上将是积极的。此外,这…

【VMware VCF】使用 SFTP 服务器备份 VCF 核心组件的配置文件。

可以定期对 VMware Cloud Foundation 环境中的相关核心组件(如 SDDC Manager、NSX Manager 以及 vCenter Server 等)创建配置备份,以防止当意外故障或数据丢失时,能够进行恢复。默认情况下,NSX Manager 组件的备份将创建并存储在 SDDC Manager 设备中内置的 SFTP 服务器上…

搭建Redis“主-从-从”模式集群并使用 RedisTemplate 实现读写分离

一、理论相关 我们知道,Redis具有高可靠性,其含义包括:数据尽量少丢失 - AOF 和 RDB 服务尽量少中断 - 增加副本冗余量,将一份数据同时保存在多个实例上,即主从库模式Redis主从库模式 - 保证数据副本的一致(读写分离):读操作:主库、从库都可以接收 写操作:首先到主库…

折腾笔记[2]-跨平台打包tauri程序

在macOS(arm64)平台打包tauri程序到Windows(amd64)平台. Packaging a Tauri application for the Windows (amd64) platform from macOS (arm64).摘要 在macOS(arm64)平台打包tauri程序到Windows(amd64)平台. Abstract Packaging a Tauri application for the Windows (amd64) …

博客格式-Markdown学习

标题 (#+空格+标题名字 一级标题) (##+空格+标题名字 二级标题) (###+空格+标题名字 三级标题) 字体 加粗 斜体 加粗斜体 划线 引用名人名言分割线图片超链接 百度 表格姓名 年龄 性别骆同学 15 男代码 int main(){cout<<"helloworld"return 0; }a,n=lis…