当前位置: 首页 > news >正文

【数学】Pair of Topics—CF1324D

Pair of Topics—CF1324D

思路

很明显,需要对 a i + a j > b i + b j a_i + a_j > b_i + b_j ai+aj>bi+bj 化简:
a i − b i > b j − a j a_i - b_i > b_j - a_j aibi>bjaj
a i − b i > − ( a j − b j ) a_i - b_i > -(a_j - b_j) aibi>(ajbj)
c i = a i − b i c_i = a_i - b_i ci=aibi,则:
c i > − c j c_i > -c_j ci>cj
c i + c j > 0 c_i + c_j > 0 ci+cj>0
所求变成:
满足 i < j i < j i<j c i + c j > 0 c_i + c_j > 0 ci+cj>0 的数量。

可以看出,如果没有 i < j i < j i<j 这个要求,那么我们可以对 c c c 排序,遍历 i i i,对于每一个 c i c_i ci 用二分求出满足 c i + c j > 0 c_i + c_j > 0 ci+cj>0 的数量,再求和即可。

其实我们恰恰可以上边的方法求出答案 r e s res res,然后再执行 r e s / = 2 res~/=~2 res /= 2 就是在约束条件 i < j i < j i<j 下的答案。
因为我们用这个方法遍历每一个 c i c_i ci 的时候,都多计算了其中 i ′ > j ′ i' > j' i>j c i ′ + c j ′ > 0 c_i' + c_j' > 0 ci+cj>0 的数量,而这样的一对 c i ′ , c j ′ c_i', c_j' ci,cj i ( 遍历过程中的 i ) = j ′ ( 当前的 j ′ ) i(遍历过程中的i) = j'(当前的j') i(遍历过程中的i)=j(当前的j) 时都是同时满足两个条件的。所以我们多计算的数量等于应该计算的数量,最终 r e s res res 除以 2 2 2 就是本题正确的答案。

例如, i = 3 , j = 2 , c i = 666 , c j = − 666 i = 3, j = 2, c_i = 666, c_j = -666 i=3,j=2,ci=666,cj=666,我们在用上百年那个方法的时候会将这种情况也计算在内。但如果将 i , j i, j i,j 对调,我们发现 i = 2 , j = 3 , c i = − 666 , c j = 666 i = 2, j = 3, c_i = -666, c_j = 666 i=2,j=3,ci=666,cj=666 是同时满足两个条件的。同理,每一个满足两个条件的 i , j i, j i,j 都会其将 i , j i, j i,j 对调后的 i , j i, j i,j 都会错误地被当做正确情况计算在内。

C o d e Code Code

#include <bits/stdc++.h>
#define int long long
#define sz(a) ((int)a.size())
#define all(a) a.begin(), a.end()
using namespace std;
using PII = pair<int, int>;
using i128 = __int128;
const int N = 2e5 + 10;int n;
int c[N];void solve(int Case) {cin >> n;for (int i = 1; i <= n; i ++) cin >> c[i];for (int i = 1; i <= n; i ++) {int b; cin >> b;c[i] -= b;}sort(c + 1, c + n + 1);int res = 0;for (int i = 1; i <= n; i ++) {int l = 1, r = n;while (l < r) {int mid = (l + r) / 2;if (c[i] + c[mid] > 0) {r = mid;} else {l = mid + 1;}}if (c[i] + c[l] > 0) {res += (n - l + 1) - (l <= i);}}cout << "       ";cout << res / 2 << "\n";
}signed main() {cin.tie(0)->ios::sync_with_stdio(false);int T = 1;
//	cin >> T; cin.get();int Case = 0;while (++ Case <= T) solve(Case);return 0;
}

相关文章:

  • Android各类View触摸监听器失效
  • 【GitHub】PR的学习笔记
  • bin、hex、ELF文件格式上的区别
  • Spring 常见面试题
  • 基于JavaWeb+SpringBoot+Vue摩托车商城微信小程序系统的设计和实现
  • STM32——NVIC中断优先级管理分析
  • springcloud旅游网站源码
  • 使用LLM-Tuning实现百川和清华ChatGLM的Lora微调
  • C_7练习题
  • 【计算机网络】UDP协议
  • JavaWeb篇_09——Tomcat运行过程以及Servlet继承结构
  • 用Go实现yaml文件节点动态解析
  • uni-app学习笔记(二)
  • Redis模块的高级使用方式
  • 2、灰度图
  • gitlab-ci配置详解(一)
  • interface和setter,getter
  • Sublime Text 2/3 绑定Eclipse快捷键
  • 工作手记之html2canvas使用概述
  • 软件开发学习的5大技巧,你知道吗?
  • 使用common-codec进行md5加密
  • 推荐一个React的管理后台框架
  • 一文看透浏览器架构
  • 用Visual Studio开发以太坊智能合约
  • 阿里云ACE认证学习知识点梳理
  • ​LeetCode解法汇总2583. 二叉树中的第 K 大层和
  • ​软考-高级-信息系统项目管理师教程 第四版【第23章-组织通用管理-思维导图】​
  • #快捷键# 大学四年我常用的软件快捷键大全,教你成为电脑高手!!
  • (八)五种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (三)docker:Dockerfile构建容器运行jar包
  • (转)Java socket中关闭IO流后,发生什么事?(以关闭输出流为例) .
  • (转)项目管理杂谈-我所期望的新人
  • .“空心村”成因分析及解决对策122344
  • .java 9 找不到符号_java找不到符号
  • .NET Core 将实体类转换为 SQL(ORM 映射)
  • .Net mvc总结
  • .net php 通信,flash与asp/php/asp.net通信的方法
  • .NET/C# 避免调试器不小心提前计算本应延迟计算的值
  • .NET/C# 判断某个类是否是泛型类型或泛型接口的子类型
  • .NET实现之(自动更新)
  • .NET学习教程二——.net基础定义+VS常用设置
  • /deep/和 >>>以及 ::v-deep 三者的区别
  • /etc/shadow字段详解
  • @RequestMapping 的作用是什么?
  • @RestControllerAdvice异常统一处理类失效原因
  • [2016.7 test.5] T1
  • [2019.2.28]BZOJ4033 [HAOI2015]树上染色
  • [2019.3.20]BZOJ4573 [Zjoi2016]大森林
  • [2024最新教程]地表最强AGI:Claude 3注册账号/登录账号/访问方法,小白教程包教包会
  • [30期] 我的学习方法
  • [BUG] Hadoop-3.3.4集群yarn管理页面子队列不显示任务
  • [bzoj 3534][Sdoi2014] 重建
  • [CTF]2022美团CTF WEB WP
  • [EULAR文摘] 利用蛋白组学技术开发一项蛋白评分用于预测TNFi疗效
  • [HNOI2010]BUS 公交线路