Description

火星上有$n$个机器人排成一行,第$i$个机器人的位置为$x_i$,视野为$r_i​$,智商为$q_i​$。我们认为第$i$个机器人可以看到的位置是$[x_i−r_i,x_i+r_i]$。如果一对机器人相互可以看到,且它们的智商$q_i$的差距不大于$k$,那么它们会开始聊天。 为了防止它们吵起来,请计算有多少对机器人可能会聊天。

Input

第一行读入$n,k$。

后面$n$行每行$x_i,r_i,q_i$。

Output

一行答案。

Sample Input

3 2
3 6 1
7 3 10
10 5 8

Sample Output

1

Solution

当时比赛的时候$sugar$给我讲了个平衡树做法还没写出来……

不过$CDQ$做起来的确简单……

先把机器人按视野半径从大到小排序,那么后面的如果能看到前面的,那么前面的一定也能看到后面的,方便我们$CDQ$用前面的去更新后面的性质。

$CDQ$里面按智商排序。可以发现对于当前$CDQ$处理的右半边,随着右边指针右移,左边合法的智商范围是一个长度不变且单调向右的区间,所以可以用单调队列优化。

里面$sort$并不会影响复杂度……因为就算写了归并复杂度还是$nlog^2n$。

Code

 #include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define N (300009)
#define LL long long
using namespace std; struct Que{int x,r,q;}a[N];
int n,k,b_num,b[N],c[N];
LL ans; inline int read()
{
int x=,w=; char c=getchar();
while (c<'' || c>'') {if (c=='-') w=-; c=getchar();}
while (c>='' && c<='') x=x*+c-'', c=getchar();
return x*w;
} bool cmp1(Que a,Que b)
{
return a.r>b.r;
} bool cmp2(Que a,Que b)
{
return a.q<b.q;
} int getid(int x)
{
return lower_bound(b+,b+b_num+,x)-b;
} void Update(int x,int k)
{
for (; x<=b_num; x+=(x&-x)) c[x]+=k;
} int Query(int x)
{
int ans=;
for (; x; x-=(x&-x)) ans+=c[x];
return ans;
} void CDQ(int l,int r)
{
if (l==r) return;
int mid=(l+r)>>;
CDQ(l,mid); CDQ(mid+,r);
int L=l,R=l-;
for (int i=mid+; i<=r; ++i)
{
while (R+<=mid && a[R+].q<=a[i].q+k) Update(getid(a[R+].x),), ++R;
while (L<=mid && a[L].q<a[i].q-k) Update(getid(a[L].x),-), ++L;
ans+=Query(getid(a[i].x+a[i].r))-Query(getid(a[i].x-a[i].r)-);
}
for (int i=L; i<=R; ++i) Update(getid(a[i].x),-);
sort(a+l,a+r+,cmp2);
} int main()
{
n=read(); k=read();
for (int i=; i<=n; ++i)
{
int x=read(),r=read(),q=read();
b[++b_num]=x; b[++b_num]=x+r; b[++b_num]=x-r;
a[i]=(Que){x,r,q};
}
sort(b+,b+b_num+); b_num=unique(b+,b+b_num+)-b-;
sort(a+,a+n+,cmp1); CDQ(,n);
printf("%lld\n",ans);
}

CF1045G:AI robots(CDQ分治)的更多相关文章

  1. Codeforces 1045G AI robots [CDQ分治]

    洛谷 Codeforces 简单的CDQ分治题. 由于对话要求互相看见,无法简单地用树套树切掉,考虑CDQ分治. 按视野从大到小排序,这样只要右边能看见左边就可以保证互相看见. 发现\(K\)固定,那 ...

  2. CF1045G AI robots

    CF1045G AI robots 题目大意就不说了 这道题可以用CDQ分治做 但是,如何选择CDQ分治的维度一直是CDQ分治的难点所在 这道题我们有三种选择 1.让智商高的数智商低的 2.让看的近的 ...

  3. CF1045G AI robots(动态开点线段树)

    题意 火星上有$N$个机器人排成一行,第$i$个机器人的位置为$x_{i}$,视野为$r_{i}$,智商为$q_{i}$.我们认为第$i$个机器人可以看到的位置是$[x_{i}-r_{i},x_{i} ...

  4. 初识CDQ分治

    [BZOJ 1176:单点修改,查询子矩阵和]: 1176: [Balkan2007]Mokia Time Limit: 30 Sec  Memory Limit: 162 MBSubmit: 200 ...

  5. HDU5322 Hope(DP + CDQ分治 + NTT)

    题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5322 Description Hope is a good thing, which can ...

  6. bzoj 1492 [NOI2007]货币兑换Cash(斜率dp+cdq分治)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1492   [题意] 有AB两种货币,每天可以可以付IPi元,买到A券和B券,且A:B= ...

  7. SPOJ LIS2 Another Longest Increasing Subsequence Problem 三维偏序最长链 CDQ分治

    Another Longest Increasing Subsequence Problem Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://a ...

  8. bzoj 3263 陌上花开(cdq分治,BIT)

      [题意] 求满足Ai<=Aj,Bi<=Bj,Ci<=Cj的数对的数目. [思路] cdq分治 借网上一句话:第一维排序,第二维cdq分治,第三维树状数组维护. 首先合并三维都是相 ...

  9. bzoj 3295: [Cqoi2011]动态逆序对(树套树 or CDQ分治)

    Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的任务是在每次删除一个元素之前统计 ...

随机推荐

  1. windows下mongodb基础玩法系列二CURD附加一

    windows下mongodb基础玩法系列 windows下mongodb基础玩法系列一介绍与安装 windows下mongodb基础玩法系列二CURD操作(创建.更新.读取和删除) windows下 ...

  2. Java设计模式学习记录-解释器模式

    前言 这次介绍另一个行为模式,解释器模式,都说解释器模式用的少,其实只是我们在日常的开发中用的少,但是一些开源框架中还是能见到它的影子,例如:spring的spEL表达式在解析时就用到了解释器模式,以 ...

  3. python——文件读写

    open()函数用法: file-object = open(file_name, access_mode = ' ', buffering = -1) filename可以是相对路径或绝对路径,ac ...

  4. Spring之Bean的配置方式

    在博客中为了演示容器Bean实例化时暴露出的几个接口,将UserBean配置在XML中,其实常见的Bean的配置有3种.1.基于xml配置Bean 2.使用注解定义Bean 3.基于java类提供Be ...

  5. [转]使用docker-compose 大杀器来部署服务 上

    本文转自:https://www.cnblogs.com/neptunemoon/p/6512121.html 使用docker-compose 大杀器来部署服务 上 我们都听过或者用过 docker ...

  6. [转]Angular 2 / 4 / 5 not working in IE11

    本文转自:https://stackoverflow.com/questions/35140718/angular-2-4-5-not-working-in-ie11/47777695#4777769 ...

  7. Hash Table (youtube)

    here is a link for youtube about hash table which is super good https://www.youtube.com/watch?v=h2d9 ...

  8. blfs(systemv版本)学习笔记-安装、配置和使用wpa_supplicant无线网络连接工具

    我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! wireless项目地址:http://www.linuxfromscratch.org/blfs/view/8.3/basic ...

  9. Android中使用progurad混淆代码

    第一步,取消project.properties中关于progurad的注释,开启progurad,默认的配置文件会被加载进来. proguard.config=${sdk.dir}/tools/pr ...

  10. localStorage,sessionStorage的使用

    最近因为项目上需要使用到客户端存储,所以稍微研究了一下,以下说说自己的理解和使用经验 1.调用方法相同 各自都包含以下几种操作: //根据key获取对应的值; window.sessionStorag ...