传送门

文章目录

  • 题意
  • 思路:

题意

有nnn个电台,对于每个电台iii有三个参数xi,ri,fix_i,r_i,f_ixi​,ri​,fi​,分别指他们的坐标、作用半径、频率。如果两个电台频率差值在kkk以内,并且他们的作用范围都能覆盖到彼此,那么称这两个电台互相干扰,问这nnn个站台中互相干扰的站台有多少对。

$1\le n\le1e5,0\le k\le 10,1\le x_i,r_i\le 1e9,1\le f_i\le 1e4 $

思路:

首先将问题简化一下,题面无非就是求满足以下两个条件的对数:

(1)∣xi−xj∣≤min(ri,rj)(1)|x_i-x_j|\le min(r_i,r_j)(1)∣xi​−xj​∣≤min(ri​,rj​)

(2)∣fi−fj∣≤k(2)|f_i-f_j|\le k(2)∣fi​−fj​∣≤k

看起来很cdqcdqcdq,考虑怎么分三维。

首先绝对值和取minminmin肯定是要优先考虑的,并且如果我们确定了rrr的话,这个貌似就变成了个区间查询的问题,所以我们第一维按照rrr从大到小排序,这样rrr的值[l,mid]>[mid+1,r][l,mid]>[mid+1,r][l,mid]>[mid+1,r],算左区间对右区间的贡献的时候,左区间的xix_ixi​直接加入答案中,右区间貌似直接查询一下[xj−rj,xj+rj][x_j-r_j,x_j+r_j][xj​−rj​,xj​+rj​]区间内的个数即可,离散化+树状数组完全可以解决,这样我们就定下来了第三维。那么第二维就剩下fff了,我们在第三维查询区间内个数的时候,需要满足∣fi−fj∣≤k|f_i-f_j|\le k∣fi​−fj​∣≤k,也就是说树状数组存下来的需要是合法的fff,所以我们考虑整个指针代表的左区间[x,i][x,i][x,i],由于第二维fi<fjf_i<f_jfi​<fj​成立,所以对于fjf_jfj​我们需要保证fx+k>=fjf_x+k>=f_jfx​+k>=fj​最小的xxx即可,显然这个具有单调性,动态维护一下。

但是很快你就会发现不对劲,因为∣fi−fj∣≤k|f_i-f_j|\le k∣fi​−fj​∣≤k是带绝对值的!所以你只考虑左边≤fj\le f_j≤fj​是不对的,你还需要维护一个指针yyy,这个需要找到fy−k<=fjf_y-k<=f_jfy​−k<=fj​的最大的yyy位置。之后就得到了区间[x,y][x,y][x,y],现在就可以查询啦~

由于第二维保证有序,所以jjj右移的时候,x,yx,yx,y也是单调不减的,可以保证复杂度。

还有要注意,离散化的时候,离散化得到的l,rl,rl,r需要跟iii下表绑定,也就是放到结构体里面,闲的没事开了个数组存,结果cdqcdqcdq的时候改变了顺序wawawa了半天。。。

复杂度O(nlog2n)O(nlog^2n)O(nlog2n)

// Problem: E. Radio stations
// Contest: Codeforces - Educational Codeforces Round 17
// URL: https://codeforces.com/problemset/problem/762/E
// Memory Limit: 256 MB
// Time Limit: 2000 ms
//
// Powered by CP Editor (https://cpeditor.org)//#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,avx,avx2,popcnt,tune=native")
//#pragma GCC optimize(2)
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<map>
#include<cmath>
#include<cctype>
#include<vector>
#include<set>
#include<queue>
#include<algorithm>
#include<sstream>
#include<ctime>
#include<cstdlib>
#include<random>
#include<cassert>
#define X first
#define Y second
#define L (u<<1)
#define R (u<<1|1)
#define pb push_back
#define mk make_pair
#define Mid ((tr[u].l+tr[u].r)>>1)
#define Len(u) (tr[u].r-tr[u].l+1)
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define db puts("---")
#define lowbit(x) (x&(-x))
using namespace std;//void rd_cre() { freopen("d://dp//data.txt","w",stdout); srand(time(NULL)); }
//void rd_ac() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//AC.txt","w",stdout); }
//void rd_wa() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//WA.txt","w",stdout); }typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;const int N=1000010,mod=1e9+7,INF=0x3f3f3f3f;
const double eps=1e-6;int n,k;
PII p[N];
int tr[N],se;
LL ans;
struct Node {int x,y,z,l,r;bool operator < (const Node &W) const {return mk(-x,mk(y,z))<mk(-W.x,mk(W.y,W.z));}
}q[N],a[N];
vector<int>v;int find(int x) {return lower_bound(v.begin(),v.end(),x)-v.begin()+1;
}void add(int x,int c) {for(int i=x;i<=se;i+=lowbit(i)) tr[i]+=c;
}int sum(int x) {int ans=0;for(int i=x;i;i-=lowbit(i)) ans+=tr[i];return ans;
}bool cmp(Node a,Node b) {return a.y<b.y;
}void cdq(int l,int r) {if(l>=r) return;int mid=(l+r)>>1;cdq(l,mid); cdq(mid+1,r);int ls=l,rs=l;for(int i=mid+1;i<=r;i++) {while(ls<=mid&&q[ls].y+k<q[i].y) add(q[ls].z,-1),ls++;while(rs<=mid&&q[rs].y-k<=q[i].y) add(q[rs].z,1),rs++;ans+=sum(q[i].r)-sum(q[i].l-1);}while(ls<rs) add(q[ls].z,-1),ls++;int i=l,j=mid+1,cnt=0;while(i<=mid&&j<=r) {if(q[i].y<=q[j].y) a[++cnt]=q[i++];else a[++cnt]=q[j++];}while(i<=mid) a[++cnt]=q[i++];while(j<=r) a[++cnt]=q[j++];for(int i=1;i<=cnt;i++) q[l+i-1]=a[i];
}int main()
{//  ios::sync_with_stdio(false);
//  cin.tie(0);scanf("%d%d",&n,&k);for(int i=1;i<=n;i++) {int x,y,z; scanf("%d%d%d",&x,&y,&z);q[i]={y,z,x};v.pb(x-y); v.pb(x+y); v.pb(x);}sort(v.begin(),v.end()); v.erase(unique(v.begin(),v.end()),v.end());se=v.size();sort(q+1,q+1+n);for(int i=2;i<=n;i++) if(q[i].x==q[i-1].x&&q[i].y==q[i-1].y&&q[i].z==q[i-1].z) while(1);for(int i=1;i<=n;i++) {q[i].l=find(q[i].z-q[i].x),q[i].r=find(q[i].z+q[i].x);q[i].z=find(q[i].z);}cdq(1,n);cout<<ans<<endl;return 0;
}
/*
k=1
r  f  x
x  y  z
10 8  4
3  10 1
2  5  31 2 0**
1 3 1**
4 5 1**
1 5 3**
*/// #include <bits/stdc++.h>
// using namespace std;
// typedef long long ll;
// #define rep(i, a, b) for(int i=(a), i##up=(b); i<=i##up; ++i)
// #define repf(i, a) for(int i=1, i##up=(a); i<=i##up; ++i)
// #define rrep(i, a, b) for(int i=(a), i##dn=(b); i>=i##dn; --i)
// #define repe(e, u) for(int e=head[u]; e; e=nxt[e])
//
// int read() {// int t=0, f=1; char c;// while(!isdigit(c=getchar())) f=c^45;// while(isdigit(c)) t=(t<<1)+(t<<3)+(c^48), c=getchar();// return f? t: -t;
// }
//
// const int N=1e5+10, inf=1e9;
//
// int n, k;
// ll ans;
//
// struct BIT {// #define lb(x) ((x)&-(x))// static const int X=3e5;// int c[X+10], tik[X+10], tim;// inline void modify(int x, int v=1) {// for(; x<=X; x+=lb(x)) if(tik[x]==tim) c[x]+=v; else tik[x]=tim, c[x]=v;// }// inline int query(int x, int v=0) {// for(; x; x^=lb(x)) if(tik[x]==tim) v+=c[x]; else tik[x]=tim, c[x]=0;// return v;// }// inline void clear() { tim++; }
// }tre;
//
// int px[N*3], siz;
// inline int find(int x) {// return lower_bound(px+1, px+1+siz, x)-px;
// }
// struct state {// int x, r, f, le, ri;// state() {}// state(int a, int b, int c): x(a), r(b), f(c) {}// inline void get() {// x=read(), r=read(), f=read();// le=x-r, ri=x+r;// px[++siz]=x, px[++siz]=le, px[++siz]=ri;// }// inline void reset() {// x=find(x), le=find(le), ri=find(ri);// }
// }st[N];
// bool cmpr(state a, state b) {// if(a.r==b.r) return a.f<b.f||a.f==b.f&&a.x<b.x;// return a.r>b.r;
// }
// bool cmpf(state a, state b) {// return a.f<b.f;
// }
//
// void sol(int le, int ri) {// if(le==ri) return;// int mid=le+ri>>1;// sol(le, mid), sol(mid+1, ri), tre.clear();// sort(st+le, st+mid+1, cmpf), sort(st+mid+1, st+ri+1, cmpf);// int pi_dn=le, pi_up=le, pj=mid+1;// while(pj<=ri) {// while(st[pj].f-st[pi_dn].f>k&&pi_dn<=mid) tre.modify(st[pi_dn++].x, -1);// while(st[pi_up].f-st[pj].f<=k&&pi_up<=mid) tre.modify(st[pi_up++].x);// ans+=tre.query(st[pj].ri)-tre.query(st[pj].le-1), pj++;// }
// }
//
// int main() {// n=read(), k=read();// repf(i, n) st[i].get();// sort(px+1, px+1+siz), siz=unique(px+1, px+1+siz)-px-1;// repf(i, n) st[i].reset();// sort(st+1, st+1+n, cmpr);// sol(1, n);// printf("%lld", ans);
// }

Educational Codeforces Round 17 E. Radio stations cdq分治 + 树状数组相关推荐

  1. BZOJ - 2244 拦截导弹 (dp,CDQ分治+树状数组优化)

    BZOJ - 2244 拦截导弹 (dp,CDQ分治+树状数组优化) 1 #include<algorithm> 2 #include<iostream> 3 #include ...

  2. P4093-[HEOI2016/TJOI2016]序列【CDQ分治,树状数组】

    正题 题目链接:https://www.luogu.com.cn/problem/P4093 题目大意 nnn个数字,每次有一个数字可能和原序列不同,但最多只有一个不同. 求所有情况下都满足的最长不降 ...

  3. [cdq分治][树状数组] Bzoj P3262 陌上花开

    Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),用三个整数表示. 现在要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量. 定义一朵花A比另一朵花B要美 ...

  4. [cdq分治][树状数组] Jzoj P4419 hole

    Description GFS打算去郊外建所别墅,享受生活,于是他耗费巨资买下了一块风水宝地,但令他震惊的是,一群DSJ对GFS的富贵生活深恶痛绝,决定打洞以搞破坏. 现在我们简化一下这个问题,在这片 ...

  5. hdu_5324_Boring Class(cdq分治+树状数组)

    题目链接:hdu_5324_Boring Class 题意: 给出n个二维点对,求LIS长度和编号字典序最小的LIS(x非增,y非减) 题解: dp[i]=max(dp[j]) (i>j,l[i ...

  6. BZOJ 1176: [Balkan2007]Mokia( CDQ分治 + 树状数组 )

    考虑cdq分治, 对于[l, r)递归[l, m), [m, r); 然后计算[l, m)的操作对[m, r)中询问的影响就可以了. 具体就是差分答案+排序+离散化然后树状数组维护.操作数为M的话时间 ...

  7. CDQ分治 + 树状数组 ---- C. Goodbye Souvenir(三维偏序+思维)

    题目链接 题目大意: 给定长度为nnn的数组, 定义数字XXX在[l,r][l,r][l,r]内的值为数字XXX在[l,r][l,r][l,r]内最后一次出现位置的下标减去第一次出现位置的下标 给定m ...

  8. P3157-[CQOI2011]动态逆序对【CDQ分治,树状数组】

    正题 题目链接:https://www.luogu.com.cn/problem/P3157 题目大意 一个长度为nnn序列,每次删除一个数,求删除前的逆序对数量. 解题思路 时光倒流之后,我们变为每 ...

  9. P3810-[模板]三维偏序(陌上花开)【CDQ分治,树状数组】

    正题 题目链接:https://www.luogu.com.cn/problem/P3810 题目大意 nnn个三元组(a,b,c)(a,b,c)(a,b,c),f(i)=∑i=1n,j≠i[aj≤a ...

最新文章

  1. 输入20本书的书名,作者,出版社,出版日期,单价,按书名排序输出
  2. [开源] C语言项目实战 - 虚拟鼠标 - VirtualMouse
  3. 还在担心工作被AI取代?不如掌握这门硬实力,抢占职场发展机遇
  4. Wide ResNet ResNeXt DenseNet DPNet [9] NASNet [10] SENet [11] Capsules [12
  5. JS作用域和作用域链
  6. DL之GAN:生成对抗网络GAN的简介、应用、经典案例之详细攻略
  7. 3GPP:MME:TS24.301;TS24.008 -- 3GPP LTE协议文档与开源代码
  8. php主页显示商品预览图代码,在ECSHOP留言板页面显示商品缩略图方法
  9. 13.企业应用架构模式 --- 对象-关系元数据映射模式
  10. html canvas 简单体验
  11. 统计用区划和城乡划分代码,在线爬取代码
  12. 腾讯敏感词汇大全_腾讯数平精准推荐 | OCR技术之识别篇
  13. 2019.03.07【APIO2018】【洛谷P4630】【BZOJ5463】铁人两项(圆方树)(树形DP)
  14. librosa 音频处理库
  15. 网站变更服务器要重新备案吗,网站更换服务器要重新备案吗
  16. Enhancing Social Recommendation with Adversarial Graph Convolutional Networks个人笔记
  17. 计算机冯诺伊曼体系结构和哈佛体系结构区别和处理器性能评判标准
  18. Spring框架——applicationContext.xml配置文件头部xmlns
  19. 基于android的生日小助手,毕业答辩-基于Android的生日管家App的设计与实现
  20. win10硬盘启动从IDE改成ahci后无法启动系统的解决方式

热门文章

  1. java 获取接口的注解_java反射注解妙用-获取所有接口说明
  2. mysql之主从复制 简书_MySQL主从复制(传统)
  3. fpga map测试_一种基于SELECTMAP的可配置且高速的FPGA配置电路及实现方法与流程
  4. html三列布局源码,HTML三列布局 - 黄柳淞的个人页面 - OSCHINA - 中文开源技术交流社区...
  5. Win10下安装wireshark不能正常使用,cmd管理员身份调用net start npf命令显示无法启动该服务
  6. 女孩子狠起来可以多可怕?
  7. 量子计算机是程序员的未来,研究者:量子计算机一旦成功问世,时间也许会失去存在的意义...
  8. java编写算术平均数,[求助]基础-怎样编一个计算算术平均数的程序(急啊)
  9. java spring 单例模式,spring中的单例模式
  10. qtabwidget设置tab高度_VC|富文本编辑框CRichEditCtrl的字体与段落设置