CodeForces-1324D-Pair-of-Topics
题意
对于两个长度为\(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的更多相关文章
- 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] ...
- 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 ...
- Codeforces Perfect Pair (JAVA)
http://codeforces.com/problemset/problem/317/A 题意:给两个数字,可以两数相加去替换其中一个数字.问要做多少次,可以让两个数字钟至少一个 >= 目标 ...
- CodeForces 359D Pair of Numbers (暴力)
题意:给定一个正整数数组,求最长的区间,使得该区间内存在一个元素,它能整除该区间的每个元素. 析:暴力每一个可能的区间,从数组的第一个元素开始考虑,向两边延伸,设延伸到的最左边的点为l, 最右边的点为 ...
- [codeforces] 359D Pair of Numbers
原题 RMQ st表棵题 要想让一个区间里的所有数都可以整除其中一个数,那么他一定是这个区间内的最小值,并且同时是这个区间的gcd.然后这个问题就转化成了RMQ问题. 维护两个st表,分别是最小值和g ...
- Codeforces 359D Pair of Numbers | 二分+ST表+gcd
题面: 给一个序列,求最长的合法区间,合法被定义为这个序列的gcd=区间最小值 输出最长合法区间个数,r-l长度 接下来输出每个合法区间的左端点 题解: 由于区间gcd满足单调性,所以我们可以二分区间 ...
- 最简易 Pair of Topics解决方法
这个题花费了我两天的时间来解决,最终找到了两个比较简单的方法 首先这个题不难看出是寻找a[i]+a[j]<0的情况,我第一开始直接用两个for循环遍历通过不了,应该是复杂度太大了 第一个方法 # ...
- CF1324D Pair of Topics 题解
原题链接 简要题意: 有两个数组 \(a_i\),\(b_i\),求有多少组 \(a_i + a_j > b_i + b_j (i \not = j)\). 显然,纯暴力过不了这道题目. 首先, ...
- CF1324D Pair of Topics
好像题解里都是树状数组(起码我翻到的是 说一种cdq分治的(这应该算是cdq分治了 用cdq比较简单,所以可以作为一个练手题 cdq分治其实是一种模糊的思想,处理\([l,r]\)区间内,有多少\(( ...
- NodeJS学习:爬虫小探
说明:本文在个人博客地址为edwardesire.com,欢迎前来品尝. 今天来学习alsotang的爬虫教程,跟着把CNode简单地爬一遍. 建立项目craelr-demo 我们首先建立一个Expr ...
随机推荐
- 2023-05-21:给定一个字符串 s 和一个整数 k 。你可以从 s 的前 k 个字母中选择一个, 并把它加到字符串的末尾。 返回 在应用上述步骤的任意数量的移动后,字典上最小的字符串。 输入:s
2023-05-21:给定一个字符串 s 和一个整数 k .你可以从 s 的前 k 个字母中选择一个, 并把它加到字符串的末尾. 返回 在应用上述步骤的任意数量的移动后,字典上最小的字符串. 输入:s ...
- ThreadLocal 的应用及原理
1. 是什么 JDK 对 ThreadLocal 类的描述为: 此类提供线程局部变量.这些变量与普通变量的不同之处在于,每个访问一个变量的线程(通过其get或set方法)都有自己的.独立初始化的变量副 ...
- 源码解析:django的CSRF认证
详解Django的CSRF认证 1.csrf原理 csrf要求发送post,put或delete请求的时候,是先以get方式发送请求,服务端响应时会分配一个随机字符串给客户端,客户端第二次发送post ...
- C++面试八股文:C++中,函数的参数应该传值还是传引用?
某日二师兄参加XXX科技公司的C++工程师开发岗位第8面: 面试官:C++中,函数的参数应该传值还是传引用? 二师兄:要看参数的用途.如果是出参,必须传引用.如果是入参,主要考虑参数类型的大小,来决定 ...
- 一张图快速了解 Istio 的 EnvoyFilter
EnvoyFilter简介 EnvoyFilter 提供了一种机制来定制 Istio Pilot 生成的 Envoy 配置.使用 EnvoyFilter 修改某些字段的值,添加特定的过滤器,甚至添加全 ...
- 【Leetcode】 two sum #1 for rust solution
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标.你可以假设每种输入只会对应一个答案.但是,数组中同一个元素不能使用两遍. 示 ...
- 批量生成,本地推理,人工智能声音克隆框架PaddleSpeech本地批量克隆实践(Python3.10)
云端炼丹固然是极好的,但不能否认的是,成本要比本地高得多,同时考虑到深度学习的训练相对于推理来说成本也更高,这主要是因为它需要大量的数据.计算资源和时间等资源,并且对超参数的调整也要求较高,更适合在云 ...
- C#语言async, await 简单介绍与实例(入门级)
本文介绍异步编程的基本思想和语法.在程序处理里,程序基本上有两种处理方式:同步和异步.对于有些新手,甚至认为"同步"是同时进行的意思,这显然是错误的. 同步的基本意思是:程序一个个 ...
- 第四章 VIVIM编辑器
1. 是什么 VI 是 Unix 操作系统和类 Unix 操作系统中最通用的文本编辑器. VIM 编辑器是从 VI 发展出来的一个性能更强大的文本编辑器. 2. 一般模式 以 vi/v ...
- PHP如何获取短网址跳转之前的网址?
现在有很多的短网址应用,点击就跳转到缩短之前的网址了,那今天我们就来看一下,PHP如何**短网址跳转之前的网址,其实也很简单,就是用php的get_headers 函数,取得Response Head ...