题意

对于两个长度为\(n\)的数组\(a[]\)和\(b[]\),找到有多少对\(i\)和\(j\)\((i<j)\),满足\(a_i+a_j>b_i+b_j\)

分析

首先发现如果\(i\)和\(j\)互换不影响不等式,因此对于\(i<j\)这个条件,仅仅是满足二元组\((i,j)\)和\((j,i)\)只算一次

所以将数组打乱顺序后也只需找到所有的二元组\((i,j)\)即可

将不等式移项得到$$a_j-b_j>b_i-a_i$$对于第\(i\)项来说,我们要找到所有的\(j\)满足上述条件

因此选择将\(a_j-b_j\)排序

定义数组\(c[]\),有\(c[i]=a[i]-b[i]\)

方法一:

对于第\(i\)项,通过二分在\([i+1,n]\)找到最小的\(j\),满足该不等式,使用\(upper\_bound\)函数即可

则对于第\(i\)项,\(j\)~\(n\)都是满足的,将答案加上\(n-j+1\),如果没找到,则\(j=n+1\)(\(upper\_bound\)已经满足)

#pragma GCC optimize(3, "Ofast", "inline")

#include <bits/stdc++.h>

#define start ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define ll long long
#define int ll
#define ls st<<1
#define rs st<<1|1
#define pii pair<int,int>
using namespace std;
const int maxn = (ll) 3e5 + 5;
const int mod = 1000000007;
const int inf = 0x3f3f3f3f; struct node {
int a, b;
} a[maxn]; int c[maxn]; signed main() {
start;
int n;
cin >> n;
for (int i = 1; i <= n; ++i)
cin >> a[i].a;
for (int i = 1; i <= n; ++i)
cin >> a[i].b, c[i] = a[i].a - a[i].b;
sort(c + 1, c + n + 1);
int ans = 0;
for (int i = 1; i <= n; ++i) {
int t = upper_bound(c + i + 1, c + n + 1, -c[i]) - c;
ans += n - t + 1;
}
cout << ans;
return 0;
}

方法二:

注意到排序后,随\(i\)递增,\(b_i-a_i\)递减,可以发现满足条件的\(j\)递减,因此可采取滑动区间的方式

将\(now\)设置为\(n+1\)

每次循环若\(now>i\&\&c[now - 1] > -c[i]\),则\(now-1\)也满足不等式,将\(now\)减一

  • \(now>i\),同方法一,\(ans+=n-now+1\)
  • \(now=i\),即\([i+1,n]\)都满足条件,又由于\(j\)是递减的,所以对于后面的\(i\),\(now<i\),所以\([i+1,n]\)也满足条件,采取数列求和直接统计答案即可
#pragma GCC optimize(3, "Ofast", "inline")

#include <bits/stdc++.h>

#define start ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define ll long long
#define int ll
#define ls st<<1
#define rs st<<1|1
#define pii pair<int,int>
using namespace std;
const int maxn = (ll) 3e5 + 5;
const int mod = 1000000007;
const int inf = 0x3f3f3f3f; struct node {
int a, b;
} a[maxn]; int c[maxn]; signed main() {
start;
int n;
cin >> n;
for (int i = 1; i <= n; ++i)
cin >> a[i].a;
for (int i = 1; i <= n; ++i)
cin >> a[i].b, c[i] = a[i].a - a[i].b;
sort(c + 1, c + n + 1);
int ans = 0;
int now = n + 1;
for (int i = 1; i <= n; ++i) {
while (now > i && c[now - 1] > -c[i])
--now;
if (now == i) {
ans += (n - i + 1) * (n - i) / 2;
break;
}
ans += n - now + 1;
}
cout << ans;
return 0;
}

CodeForces-1324D-Pair-of-Topics的更多相关文章

  1. D - Pair of Topics

    D - Pair of Topics 思路: 这个题需要一点思路,ai+aj>bi+bj可以转换成ai-bi+aj-bj>0,也就是c[i]=a[i]-b[i],只需要找c[i]+c[j] ...

  2. Codeforces Round #627 (Div. 3) D - Pair of Topics(双指针)

    题意: 有长为n的a,b两序列,问满足ai+aj>bi+bj(i<j)的i,j对数. 思路: 移项得:(ai-bi)+(aj-bj)>0,i<j即i!=j,用c序列保存所有ai ...

  3. Codeforces Perfect Pair (JAVA)

    http://codeforces.com/problemset/problem/317/A 题意:给两个数字,可以两数相加去替换其中一个数字.问要做多少次,可以让两个数字钟至少一个 >= 目标 ...

  4. CodeForces 359D Pair of Numbers (暴力)

    题意:给定一个正整数数组,求最长的区间,使得该区间内存在一个元素,它能整除该区间的每个元素. 析:暴力每一个可能的区间,从数组的第一个元素开始考虑,向两边延伸,设延伸到的最左边的点为l, 最右边的点为 ...

  5. [codeforces] 359D Pair of Numbers

    原题 RMQ st表棵题 要想让一个区间里的所有数都可以整除其中一个数,那么他一定是这个区间内的最小值,并且同时是这个区间的gcd.然后这个问题就转化成了RMQ问题. 维护两个st表,分别是最小值和g ...

  6. Codeforces 359D Pair of Numbers | 二分+ST表+gcd

    题面: 给一个序列,求最长的合法区间,合法被定义为这个序列的gcd=区间最小值 输出最长合法区间个数,r-l长度 接下来输出每个合法区间的左端点 题解: 由于区间gcd满足单调性,所以我们可以二分区间 ...

  7. 最简易 Pair of Topics解决方法

    这个题花费了我两天的时间来解决,最终找到了两个比较简单的方法 首先这个题不难看出是寻找a[i]+a[j]<0的情况,我第一开始直接用两个for循环遍历通过不了,应该是复杂度太大了 第一个方法 # ...

  8. CF1324D Pair of Topics 题解

    原题链接 简要题意: 有两个数组 \(a_i\),\(b_i\),求有多少组 \(a_i + a_j > b_i + b_j (i \not = j)\). 显然,纯暴力过不了这道题目. 首先, ...

  9. CF1324D Pair of Topics

    好像题解里都是树状数组(起码我翻到的是 说一种cdq分治的(这应该算是cdq分治了 用cdq比较简单,所以可以作为一个练手题 cdq分治其实是一种模糊的思想,处理\([l,r]\)区间内,有多少\(( ...

  10. NodeJS学习:爬虫小探

    说明:本文在个人博客地址为edwardesire.com,欢迎前来品尝. 今天来学习alsotang的爬虫教程,跟着把CNode简单地爬一遍. 建立项目craelr-demo 我们首先建立一个Expr ...

随机推荐

  1. 巧用OpenSSH进行域内权限维持

    最近在Windows服务器上安装OpenSSH,意外发现了一个很有意思的技巧,可用来做域内权限维持,废话不多说,直接上步骤. 01.利用方式 (1)在已经获得权限的Windows服务器上,使用msie ...

  2. Linux设置多个Tomcat开机自启动

    Linux设置多个Tomcat开机自启动 前言 一台服务器上有多个tomcat环境,重启服务器后,每次需要手动一个个启动服务,非常麻烦,于是可以设置tomcat开机自启动. tomcat开机自启动非常 ...

  3. 10 款 VS Code 插件神器,第 7 款超级实用!

    VS Code 是这两年非常热门的一款 IDE,它不仅有提升开发体验的界面.轻量化的编辑器,还有丰富而强大的插件,这些优秀的插件使得 VS Code 生态体系更加吸引人,让开发效率大大提升.本文来介绍 ...

  4. 项目小结:使用Docker迁移服务到离线服务器

    前言 最近遇到的这个场景,需要把之前开发的一套系统迁移到一个离线的服务器上,这个服务器有点麻烦,接入VPN后通过堡垒机才能访问,速度也很慢,遇到不少坑,本文记录一下迁移过程. 基本信息 原本这套系统也 ...

  5. NoSQL数据库系统原理:从概念到实现

    目录 1. 引言 2. 技术原理及概念 2.1 基本概念解释 2.2 技术原理介绍 2.3 相关技术比较 3. 实现步骤与流程 3.1 准备工作:环境配置与依赖安装 3.2. 核心模块实现 3.3. ...

  6. GPU技术在大规模数据集处理和大规模计算中的应用

    目录 GPU 技术在大规模数据集处理和大规模计算中的应用 随着深度学习在人工智能领域的快速发展,大规模数据处理和大规模计算的需求日益增长.GPU(图形处理器)作为现代计算机的重要部件,被广泛应用于这些 ...

  7. 牛客题解-mixup2混乱的奶牛(状压dp)

    题解-mixup2混乱的奶牛 [原题连接](1026-mixup2混乱的奶牛_2021秋季算法入门班第八章习题:动态规划2 (nowcoder.com)) 题目描述 混乱的奶牛 [Don Piele, ...

  8. Prometheus-2:blackbox_exporter黑盒监控

    黑盒监控blackbox_exporter 前边介绍有很多exporter可以直接将metrics暴露给Prometheus进行监控,这些称为"白盒监控",那些exporter无法 ...

  9. 2023-07-02:给定一个1~N的排列,每次将相邻两数相加,可以得到新的序列,长度是N-1 再对新的序列,每次将相邻两数相加,可以得到新的序列,长度是N-2 这样下去可以最终只剩一个数字 比如 :

    2023-07-02:给定一个1~N的排列,每次将相邻两数相加,可以得到新的序列,长度是N-1 再对新的序列,每次将相邻两数相加,可以得到新的序列,长度是N-2 这样下去可以最终只剩一个数字 比如 : ...

  10. 一次oracle行级锁导致的问题

    分析问题:我在plsql/developer是用的system用户连接的数据库,而在crt用  sqlplus / as  sysdba 连接数据库,是sys用户.现在在plsql/developer ...