cf918div4的F题

Problem - F - Codeforces

这道题有个很简单的思路,也有一个很难的思路,这个很难的思路用到了树状数组(但是是大佬写的),而简单的思路仅仅用到了归并排序求逆序对(也是一个大佬写的),而我连简单的思路都没想到,(*/ω\*)。

先说说简单的思路吧。

简单思路

using i64 = long long;
i64 ans;
void mergesort(i64 left, i64 right, std::vector<i64>& a, std::vector<i64>& b) {if (left < right) {i64 mid = (left + right) / 2;mergesort(left, mid, a, b);mergesort(mid + 1, right, a, b);i64 i = left, j = mid + 1, ie = mid, je = right,k=0;while (i <= ie && j <= je) {if (a[i] <= a[j])b[k++] = a[i++];else {b[k++] = a[j++];//求逆序对的核心代码ans += ie - i + 1;}}while (i <= ie)b[k++] = a[i++];while (j <= je)b[k++] = a[j++];for (i64 h = left; h <= right; h++)a[h] = b[h - left];}
}
void solve() {int n;ans = 0;std::cin >> n;std::vector<i64>a(n), b(n),c(n),d(n),e(n);std::iota(d.begin(), d.end(), 0);for (int i = 0; i < n; i++)std::cin >> a[i] >> b[i];std::sort(d.begin(), d.end(),[&](int i, int j) {return a[i] < a[j];});for (int i = 0; i < n; i++)c[i] = b[d[i]];mergesort(0, n - 1, c,e);std::cout << ans << '\n';
}
int main() {int t;std::cin >> t;while (t--) {solve();}return 0;
}

只需要把起点从小到大排,终点也要跟着动,然后求终点的逆序对即可,我们要求的是一个区间全包含了多少个区间,在外面按照起点从小到大排序的时候,我们已经确保的下一个起点一定是包含于上一个起点的了,那么我们只要找到它对应的终点的左边的终点有多少个比它小的,及全包含的区间有多少个,说白了就是总的逆序对个数即可。

困难思路

这个代码是jiangly大佬写的,也许人家认为比逆序对的思路简单吧,(*/ω\*),我太菜了。

树状数组我也没完全理解,但是不妨碍我使用它


using i64 = long long;template <typename T>
struct Fenwick {int n;//a里面存的是一个区间,由大区间到小区间划分,起点都为0std::vector<T> a;//构造函数,不传参默认为0Fenwick(int n_ = 0) {init(n_);}//初始化n和数组a,assign(大小,类型{});void init(int n_) {n = n_;a.assign(n, T{});}//右端点和权值void add(int x, const T& v) {//更新父节点,for (int i = x + 1; i <= n; i += i & -i) {a[i - 1] = a[i - 1] + v;}}T sum(int x) {T ans{};for (int i = x; i > 0; i -= i & -i) {ans = ans + a[i - 1];}return ans;}T rangeSum(int l, int r) {return sum(r) - sum(l);}int select(const T& k) {int x = 0;T cur{};for (int i = 1 << std::log2(n); i; i /= 2) {if (x + i <= n && cur + a[x + i - 1] <= k) {x += i;cur = cur + a[x - 1];}}return x;}
};void solve() {int n;std::cin >> n;//起点,终点std::vector<int> a(n), b(n), v;//预留两倍n空间v.reserve(2 * n);for (int i = 0; i < n; i++) {std::cin >> a[i] >> b[i];v.push_back(a[i]);v.push_back(b[i]);}std::sort(v.begin(), v.end());//相当于建了个系,因为每个起点或者终点都是不同的,把它放在坐标系(v)对应的位置//由于其唯一性,所以使用二分查找必定找到的是对应值,for (int i = 0; i < n; i++) {//找到a[i]和b[i]混合元素中第一个>=a[i]的值的下标a[i] = std::lower_bound(v.begin(), v.end(), a[i]) - v.begin();//找到a[i]和b[i]混合元素中第一个>=b[i]的值的下标b[i] = std::lower_bound(v.begin(), v.end(), b[i]) - v.begin();}//把起点和终点重新关联起来,且起点是有序的,有序起点排名对应无序终点排名std::vector<int> f(2 * n, -1);for (int i = 0; i < n; i++) {f[a[i]] = b[i];}//创建了一个树状数组Fenwick<int> fen(2 * n);i64 ans = 0;//总共只有2*n个点,i代表的是左端点,如果你的左端点比别人的左端点大,//那么只有别人和你greeting的份。for (int i = 2 * n - 1; i >= 0; i--) {//当右端点不为空时,说明是一个有效线段,由于i的递减性,所以下一个i肯定在上一个i左边if (f[i] != -1) {ans += fen.sum(f[i]);//传入右端点和权值fen.add(f[i], 1);}}std::cout << ans << "\n";
}int main() {std::ios::sync_with_stdio(false);std::cin.tie(nullptr);int t;std::cin >> t;while (t--) {solve();}return 0;
}

题解都写在注释里面了,树状数组不会并不妨碍我们使用,我们排序完后f中存储是有序的a[i]对应的b[i].由于是从起点大的一端枚举,所以会累加到小的一端且终点大于等于该值的线段上。最好先稍微了解一下树状数组的原理。就我目前的水平如果再碰到类似的题我应该会选择简单思路来写。

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

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

相关文章

Latex + Overleaf 论文写作新手笔记

.tex 文件main.tex 文件 Latex 的文档层次结构不同文档类型的层次结构report 6 层结构实例article 5 层结构实例 Latex 语法图表插入与引用使用 figure 环境来插入图片使用 ref 命令来引用已有的图表格的插入与引用 代码块列表无序列表 itemize有序列表 enumerate 学位论文项目…

Crow:路由局部插件3 调用after_handle

紧接Crow:路由局部插件2 调用before_handle-CSDN博客 完成middleware_call_helper的调用后 把res.complete_request_handler设置为后续处理完handle后将要处理的lambda 然后调用rule->handle,之后返回到Connect::handle,参考 Crow:http请求到Rule绑定的handler_的调用链…

DQL命令查询数据(一)

本课目标 理解查询的相关概念 掌握MySQL的简单查询语句 掌握MySQL中的函数 DQL 语言 DQL&#xff08;Data Query Language 数据查询语言&#xff09;&#xff1a;用于查询数据库对象中所包含的数据 DQL语言主要的语句&#xff1a;SELECT语句 DQL语言是数据库语言中最核心…

CSS3(Flex布局详解)

Flex 基本概念&#xff1a; 在 flex 容器中默认存在两条轴&#xff0c;水平主轴(main axis) 和垂直的交叉轴(cross axis)&#xff0c;这是默认的设置&#xff0c;当然你可以通过修改使垂直方向变为主轴&#xff0c;水平方向变为交叉轴&#xff0c;这个我们后面再说。 在容器中…

vue3学习记录

vue3有选项式API&#xff08;和vue2一样保留this用法&#xff09;和组合式API&#xff08;没有了this的概念&#xff09;&#xff1b;选项式 API 是在组合式 API 的基础上实现的&#xff01; 增加了组合式api&#xff0c;利于代码逻辑的组合&#xff0c;相关联的逻辑汇集在一处…

UseContentHash选项能否在打包AssetBundle时计算可靠的Hash

1&#xff09;UseContentHash选项能否在打包AssetBundle时计算可靠的Hash 2&#xff09;如何清理Native Reserved部分的内存 3&#xff09;Addressables资源完整性校验 4&#xff09;通过Image.color和CanvasRenderer.SetColor修改UI组件颜色的区别 这是第368篇UWA技术知识分享…

C++垃圾回收机制

非托管C C 有垃圾收集&#xff0c;采用Hans-Boehm Garbage Collector的形式。也可能有其他垃圾收集库。 您可以使用使用RAII的智能指针&#xff08;如果指针允许共享访问&#xff0c;则使用引用计数&#xff09;来确定何时删除对象。一个好的智能指针库是Boost的智能指针。绝大…

问题 C: 求逆序对

题目描述 给定一个序列a1,a2,…,an&#xff0c;如果存在i<j并且ai>aj&#xff0c;那么我们称之为逆序对&#xff0c;求逆序对的数目。 注意&#xff1a;n<105&#xff0c;ai<105 输入 第一行为n,表示序列长度。 接下来的n行&#xff0c;第i1行表示序列中的第i…

【spring之条件评估器】

Spring条件评估器 1. ConditionEvaluator是干嘛的2. 先看其属性类ConditionContextImp context3. 看ConditionEvaluator 的内部方法4. AnnotationTypeMetadata 是干嘛的5. Condition 接口 1. ConditionEvaluator是干嘛的 内部的使用类,用来评估注解的 2. 先看其属性类Condition…

[Linux] 一文理解HTTPS协议:什么是HTTPS协议、HTTPS协议如何加密数据、什么是CA证书(数字证书)...

之前的文章中, 已经分析介绍过了HTTP协议. HTTP协议在网络中是以明文的形式传输的. 无论是GET还是POST方法都是不安全的. 为什么不安全呢? 因为: HTTP协议以明文的形式传输数据, 缺乏对信息的保护. 如果在网络中传输数据以明文的形式传输, 网络中的任何人都可以轻松的获取数据…

何为算法之什么是算法

前言 你相信算法吗&#xff1f;对于这个问题的答案&#xff0c;我们并不关心&#xff0c;因为无论你信不信&#xff0c;不可否认的是算法席卷了你我的生活。 通信聊天时词汇的联想输入、网络购物时商品的关联推荐和下班回家时家电的智能声控&#xff0c;其算法早己悄无声息地进…

Java学习苦旅(二十六)——反射,枚举和lamda表达式

本篇博客将讲解反射&#xff0c;枚举和lamda表达式。 文章目录 反射定义用途反射基本信息反射相关的类Class类Class类中相关的方法 反射示例反射的优缺点优点缺点 枚举背景及定义常用方法枚举优缺点优点缺点 Lambda表达式背景语法函数式接口定义基本使用 变量捕获Lambda在集合…

力扣(leetcode)第387题字符串中的第一个唯一字符(Python)

387.字符串中的第一个唯一字符 题目链接&#xff1a;387.字符串中的第一个唯一字符 给定一个字符串 s &#xff0c;找到 它的第一个不重复的字符&#xff0c;并返回它的索引 。如果不存在&#xff0c;则返回 -1 。 示例 1&#xff1a; 输入: s “leetcode” 输出: 0 示例 2:…

科学的摇篮 - 贝尔实验室

AT&T贝尔实验室&#xff08;AT&T Bell Laboratories&#xff09;是美国电信公司AT&T的研究与开发部门&#xff0c;成立于1925年。它在20世纪的许多年里一直是科学与技术创新的重要中心&#xff0c;做出了众多重大贡献&#xff0c;并为多项科技成就奠定了基础。以下…

Typescript 中创建对象的方式

1.type type MyObj {a: string;b: number;c: () > number; }; 2.interface interface MyObj {a: string;b: number;c: () > number; } 3. class class MyObj {a:string;b:number;c:()>number } // Error: Property staticProperty does not exist on type M.

Spring Boot应用启动时自动执行代码的五种方式

Spring Boot为开发者提供了多种方式在应用启动时执行自定义代码&#xff0c;这些方式包括注解、接口实现和事件监听器。在本篇博客中&#xff0c;我们将探讨一些常见的方法&#xff0c;以及如何利用它们在应用启动时执行初始化逻辑。 1. PostConstruct注解 PostConstruct注解…

嵌入式系统习题(考试相关)

文章目录 上一篇嵌入式系统概述ARM技术概述ARM指令Thumb指令集ARM程序设计 上一篇 嵌入式系统复习–基于ARM的嵌入式程序设计 嵌入式系统概述 嵌入式系统中常用的通信接口包括哪些&#xff1f; RS-232C串行通信接口&#xff0c;RS-422串行通信接口&#xff0c;RS-485串行通信…

【JAVA】Iterator 和 ListIterator 有什么区别?

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a; JAVA ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 在Java中&#xff0c;遍历集合是日常编程中常见的任务&#xff0c;而Iterator和ListIterator作为遍历集合的两个主要接口&#xff0…

application.properties 如何改成 application.yml

Convert YAML and Properties File 右键直接转换即可 Further Reading &#xff1a; idea 常用插件

【两阶段鲁棒】计及需求响应的多能互补微网两阶段鲁棒优化matlab

目录 1 主要内容 算例模型 目标函数 第一阶段 第二阶段 求解流程图 2 部分程序 3 程序结果 4 下载链接 1 主要内容 该程序参考文献《多能互补微网两阶段鲁棒优化调度研究》&#xff0c;在考虑风光不确定集的基础上提出采用计及DR响应的多能互补微网两阶段鲁棒备用调度模…