好像题解里都是树状数组(起码我翻到的是

说一种cdq分治的(这应该算是cdq分治了

用cdq比较简单,所以可以作为一个练手题

cdq分治其实是一种模糊的思想,处理\([l,r]\)区间内,有多少\((i,j)\)满足某种条件

这里假设\(i<j\),我们取一个\(mid=\frac{i+j}{2}\)

  • \(i<j\leq mid\),问题转换到区间\([l,mid]\)上解决
  • \(mid<i<j\), 问题转换到区间\([mid+1,r]\)上解决
  • \(i\leq mid <j\),注意这里才是真正干活的地方,前面两种情况都是甩锅给更小的区间

然后具体看下这个题

条件是\(a_i+a_j>b_i+b_j(i<j)\)

可以转化为\(a_i-b_i>b_j-a_j(i<j)\),其实就是把和\(i,j\)有关的项分别放在不等号两边

考虑\(i\leq mid<j\)的情况,则\(i<j\)这个条件已经没用了

开两个数组\(x,y\),分别存\(a_i-b_i(l\leq i\leq mid)\)和\(b_j-a_j(mid<j\leq r)\)的值

然后给它们排个序

从小到大考虑x中元素,有几个y中元素比它小

具体实现用一个cnt变量,表示对于当前的x中的元素,有几个比它小的y中元素,然后每次\(ans=ans+cnt\),,然后用两个指针分别指向x和y中当前的值就行了

每次对区间排序的复杂度是\(O(r-l+1)\)的,每个区间被排序\(\log n\)次(每次把一个区间分成它的一半,因此最多递归\(\log n\)层,每层)

画张丑陋的图理解一下



所以总时间复杂度\(O(n \log^2 n)\)

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<iomanip>
#include<cstring>
#define reg register
#define EN std::puts("")
#define LL long long
inline int read(){
int x=0,y=1;
char c=std::getchar();
while(c<'0'||c>'9'){if(c=='-') y=0;c=std::getchar();}
while(c>='0'&&c<='9'){x=x*10+(c^48);c=std::getchar();}
return y?x:-x;
}
int n;
int a[200006],b[200006];
int x[200006],y[200006];
LL work(int l,int r){
if(l==r) return 0;
int mid=(l+r)>>1;
x[0]=y[0]=0;
for(reg int i=l;i<=mid;i++) x[++x[0]]=a[i]-b[i];
for(reg int i=mid+1;i<=r;i++) y[++y[0]]=b[i]-a[i];
std::sort(x+1,x+1+x[0]);std::sort(y+1,y+1+y[0]);
reg int posl=1,posr=1,cnt=0;
reg LL ans=0;
for(;posl<=x[0];posl++){
for(;posr<=y[0]&&y[posr]<x[posl];posr++) cnt++;
ans+=cnt;
}
return ans+work(l,mid)+work(mid+1,r);
}
int main(){
n=read();
for(reg int i=1;i<=n;i++) a[i]=read();
for(reg int i=1;i<=n;i++) b[i]=read();
std::printf("%lld",work(1,n));
return 0;
}

CF1324D Pair of Topics的更多相关文章

  1. CF1324D Pair of Topics 题解

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

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

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

  3. 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 ...

  4. NodeJS学习:爬虫小探

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

  5. NodeJS制作爬虫全过程

    这篇文章主要介绍了NodeJS制作爬虫的全过程,包括项目建立,目标网站分析.使用superagent获取源数据.使用cheerio解析.使用eventproxy来并发抓取每个主题的内容等方面,有需要的 ...

  6. c++ pair 使用

    1. 包含头文件: #include <utility> 2. pair 的操作: pair<T1,T2> p; pair<T1,T2> p(v1,v2); pai ...

  7. 论Pair的重要性

    这些天我在用React和D3做图表,从已经实现的图表里复制了一些坐标轴的代码,发现坐标轴上的n个点里,只有第一个点下面能渲染出文字提示,其余点下面都无法渲染出文字. 和组里的FL一起百思不得其解好几天 ...

  8. 2016 ACM/ICPC Asia Regional Dalian Online 1010 Weak Pair dfs序+分块

    Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total Submissio ...

  9. pair的使用

    #include<iostream> #include<cmath> #include<cstdio> #include<algorithm> #inc ...

随机推荐

  1. 汇编刷题:在M单元和N单元分别存有一个8位无符号数36H和95H,要求比较并输出 M大于N 或者 M小于N

    DATA SEGMENT     M DB 36H     N DB 95H     RESAULT1 DB 'M>N$'     RESAULT2 DB 'M<N$' DATA ENDS ...

  2. javascript入门 之 zTree(十一 托拽事件(一))

    <!DOCTYPE html> <HTML> <HEAD> <TITLE> ZTREE DEMO - drag & drop</TITLE ...

  3. PAT 链表倒序的算法优化

    之前的答案错误问题已经解决了,现在还有运行超时的问题,先贴上之前的代码 1 #include <iostream> 2 #include <string.h> 3 using ...

  4. Python+Tornado开发微信公众号

    本文已同步到专业技术网站 www.sufaith.com, 该网站专注于前后端开发技术与经验分享, 包含Web开发.Nodejs.Python.Linux.IT资讯等板块. 本教程针对的是已掌握Pyt ...

  5. Linux c++ vim环境搭建系列(2)——Ubuntu18.04.4编译安装llvm clang

    2. 源码编译安装llvm clang 参考网址: https://llvhttps

  6. 记录d3.js 力导向图的平移缩放,类似地图导航点击某一项移动到当前位置

    项目中有用到d3.js用于图结构的查询, 需求如下: 右上角有个模糊搜索功能,查询出来的结果用列表展示 点击列表的某一列,要求画布移动到当前选中的节点的位置,基于画布正中间 搜索出来的结果列表展示用的 ...

  7. 数据结构之栈—强大的四则复杂运算计算器(超过windows自带的科学计算器)【中缀转后缀表达式】

    比windows自带计算器还强的四则复杂运算计算器! 实测随机打出两组复杂算式:-7.5 * 6 / ( -2 + ( -6.5 -  -5.22 ) )与7.5+-3*8/(7+2) windows ...

  8. 带权值的图 BFS

    用bfs遍历最图求最短路径时通常借用优先队列即优先考虑最大的或者最小的权值 方法1 优先队列:(内置函数,优先考虑较小的权值) #include<iostream> #include< ...

  9. 极验反爬虫防护分析之slide验证方式下图片的处理及滑动轨迹的生成思路

    本文要分享的内容是去年为了抢鞋而分析 极验(GeeTest)反爬虫防护的笔记,由于篇幅较长(为了多混点CB)我会按照我的分析顺序,分成如下四个主题与大家分享: 极验反爬虫防护分析之交互流程分析 极验反 ...

  10. Java 基础讲解

    Hello,老同学们,又见面啦,新同学们,你们好哦! 在看完本人的<数据结构与算法>专栏的博文的老同学,恭喜你们在学习本专栏时,你们将会发现好多知识点都讲解过,都易于理解,那么,没看过的同 ...