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

说一种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. Mac 系统root

    没错,你没看错,就是root mac系统安装件的时候,你有没有遇到过这种情况 总之,就是安装不上软件,肿么办? 网上解觉办法是: 进入系统偏好设置,设置为允许任何人,可是进去后这样: 别着急,打开命令 ...

  2. javascript入门 之 bind()

    <!DOCTYPE html> <HTML> <HEAD> <meta http-equiv="content-type" content ...

  3. 15分钟从零开始搭建支持10w+用户的生产环境(一)

    前言 这是一个基于中小型企业或团队的架构设计. 不考虑大厂.有充分的理由相信,大厂有绝对的实力来搭建一个相当复杂的环境. 中小型企业或团队是个什么样子? 开发团队人员配置不全,部分人员身兼开发过程上下 ...

  4. search(4)- elastic4s-ElasticDsl

    上次分析了一下elastic4s的运算框架.本来计划接着开始实质的函数调用示范,不过看过了Elastic4s的所有使用说明文档后感觉还是走的快了一点.主要原因是elasticsearch在7.0后有了 ...

  5. 再探CI,Github调戏Action手记——自动构建并发布到另一仓库

    前言 接上文初探CI,Github调戏Action手记--自动构建并发布 在学习了Action的基本操作之后 接着我们来探索Action其他可能的功能 众所周知 只有用得到的技术学习的才会最快 我也是 ...

  6. web中拖拽排序与java后台交互实现

    一.业务需求 1,在后台的管理界面通过排序功能直接进入排序界面 2,在排序界面能够人工的手动拖动需要排序的标题,完成对应的排序之后提交 3,在app或者是前端就有对应的排序实现了 二.页面展示 将整体 ...

  7. 吾八哥学k8s(二):golang服务部署到kubernetes

    本篇主要讲解如何将golang的服务部署到kubernetes集群里,附带相关的golang的demo和yml文件内容.纯新手入门方式,生产服务需要完整的CI/CD流程来支持. golang服务代码 ...

  8. Netty 中的异步编程 Future 和 Promise

    Netty 中大量 I/O 操作都是异步执行,本篇博文来聊聊 Netty 中的异步编程. Java Future 提供的异步模型 JDK 5 引入了 Future 模式.Future 接口是 Java ...

  9. Python程序设计实验报告一:熟悉IDLE和在线编程平台

    安徽工程大学 Python程序设计 实验报告 班级   物流191   姓名  崔攀  学号3190505136 成绩_____           日期     2020.3.8     指导老师  ...

  10. Oracle使用fy_recover_data恢复truncate删除的数据

    (一)truncate操作概述 在生产中,truncate是使用的多的命令,在使用不当的情况下,往往会造成表的数据全部丢失,恢复较为困难.对于truncate恢复,常见的有以下几种方法可以进行恢复: ...