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

传送门

文章目录

  • 题意
  • 思路:

题意

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)xixjmin(ri,rj)

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

看起来很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][xjrj,xj+rj]区间内的个数即可,离散化+树状数组完全可以解决,这样我们就定下来了第三维。那么第二维就剩下fff了,我们在第三维查询区间内个数的时候,需要满足∣fi−fj∣≤k|f_i-f_j|\le kfifjk,也就是说树状数组存下来的需要是合法的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 kfifjk是带绝对值的!所以你只考虑左边≤fj\le f_jfj是不对的,你还需要维护一个指针yyy,这个需要找到fy−k<=fjf_y-k<=f_jfyk<=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);
// }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/314557.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Educational Codeforces Round 89 (Rated for Div. 2)(A, B, C, D)

Educational Codeforces Round 89 (Rated for Div. 2) A. Shovels and Swords 思路 题意非常简单&#xff0c;就是得到最多的物品嘛&#xff0c;我们假定a,ba, ba,b中aaa是最小的一个&#xff0c;分两种情况。 如果2∗a<b2 * a < b2∗a<b&#xff0c;那么我们只需…

什么是微服务?为什么你要用微服务?

前言最近几年微服务很火&#xff0c;大家都在建设微服务&#xff0c;仿佛不谈点微服务相关的技术&#xff0c;都显得不是那么主流了。近几年见识到身边朋友的很多公司和团队都在尝试进行微服务的改变&#xff0c;但很多团队并没有实际微服务踩坑经验&#xff0c;很多团队甚至强…

P5367 【模板】康托展开

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 存个板子 // Problem: P5367 【模板】康托展开 // Contest: Luogu // URL: https://www.luogu.com.cn/problem/P5367 // Memory Limit: 64 MB // Time Limit: 1200 ms // // Powered by …

微软开源基于.NET Core的量子开发工具包 QDK

微软最近开源了量子开发工具包&#xff08;Quantum Development Kit&#xff0c;QDK&#xff09;&#xff0c;旨在使“量子计算和算法开发对开发人员来说更容易、更透明”。微软 QDK 包括 Q#编译器、量子库和量子模拟器。微软在 2017 年底的 Ignite 大会上发布了量子开发工具包…

UVA11525 Permutation 逆康托展开

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 逆康托展开板子 // Problem: UVA11525 Permutation // Contest: Luogu // URL: https://www.luogu.com.cn/problem/UVA11525 // Memory Limit: 0 MB // Time Limit: 3000 ms // // Power…

Azure 上使用 Windows Server Core 运行 ASP.NET Core 网站

点击上方蓝字关注“汪宇杰博客”导语微软智慧云 Azure 上虽然早就有 App Service 这种完全托管的 PaaS 服务可以让我们分分钟建网站。但是不自己配一下环境&#xff0c;就不能体现技术含量&#xff0c;容易被说微软的人都只会点鼠标。年轻的时候不敲命令&#xff0c;什么时候可…

Codeforces Round #285 (Div. 2) D. Misha and Permutations Summation 康托展开 + 线段树

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 首先肯定不能模n!n!n!&#xff0c;所以考虑先将a,ba,ba,b做一个逆康托展开&#xff0c;得到a′,b′a,ba′,b′数组&#xff0c;以及a′b′sumabsuma′b′sum数组&#xff0c;让后我们可以通…

「PowerBI」使用TabularEditor进行PowerBIDeskTop模型开发最佳实践

前面系列文章介绍的场景&#xff0c;设定的工具使用对象是Sqlserver和Azure 的SSAS数据模型开发&#xff0c;其实TabularEditor亦可以有限度地使用在PowerBIDeskTop的模型开发上&#xff0c;本文简单介绍下其最佳的使用场景。PowerBIDeskTop模型不同于Sqlserver的SSAS模型虽然大…

E:Modular Stability(组合数)

Modular Stability 思路 (((xmoda1)moda2)……modak−1)modak(((xmodp1)modp2)……modpk−1)modpk(((x \mod a_1) \mod a_2) …… \mod a_{k - 1}) \mod a_{k} (((x \mod p_1) \mod p_2) …… \mod p_{k - 1}) \mod p_{k}(((xmoda1​)moda2​)……modak−1​)modak​(((xmodp…

E:K-periodic Garland(DP)

思路 每个点我们有两种决策&#xff0c;其值为0或1&#xff1a; 如果点我们放置0的话&#xff0c;我们有其前一位数字是零&#xff0c;或者其前一位数字是一。 如果这个点我们放置1的话&#xff0c;我们有其前面是按照每k个数字都出现一次1的排列&#xff0c;也有可能其前面…

Codeforces Round #740 (Div. 2) F. Top-Notch Insertions 线段树 / 平衡树 + 组合数学

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 考虑最终的序列是什么鸭子的&#xff0c;首先序列肯定单调不降&#xff0c;也就是a1≤a2≤a3≤...≤ana_1\le a_2\le a_3\le ...\le a_na1​≤a2​≤a3​≤...≤an​&#xff0c;显然不可…

沃尔玛招聘.NET软件工程师

做为码农, 你可能会知道BAT, 微软, google, oracle, facebook等公司, 然而你知道沃尔玛吗? 在最新公布的2019年世界500强里(http://www.fortunechina.com/fortune500/c/2019-07/22/content_339535.htm?沃尔玛领先阿里巴巴181名.百度不是世界500强沃尔玛领先T公司236名沃尔玛领…

E:Three Blocks Palindrome(hard and easy)(树状数组 ? 前缀和?)

Three Blocks Palindrome (hard version) 思路 考虑到每个数字的范围是12001 ~ 2001 200&#xff0c;于是我们可以通过枚举两侧的元素来寻找最优答案。 我们有一个贪心策略&#xff0c;两侧都以我们枚举的元素作为结尾点&#xff0c;假如我们当前枚举的数字是1&#xff0c;于…

Codeforces Round #731 (Div. 3) G. How Many Paths? dfs + 拓扑 + 思维

传送门 题意&#xff1a; 给你一张nnn个点mmm条边的图&#xff0c;让你对每个点确定一个编号&#xff0c;规则如下&#xff1a; (1)(1)(1) 对于不能到的点编号为000。 (2)(2)(2) 对于只有一条路径能到这个点的点编号为111。 (3)(3)(3) 对于有不止一条路径能到这个点的点编号为…

.NET Core 3.0深入源码理解HttpClientFactory之实战

写在前面前面两篇文章透过源码角度&#xff0c;理解了HttpClientFactory的内部实现&#xff0c;当我们在项目中使用时&#xff0c;总会涉及以下几个问题&#xff1a;HttpClient超时处理以及重试机制HttpClient熔断器模式的实现HttpClient日志记录与追踪链接下来我们将从使用角度…

F:Maximum White Subtree(树形dp)

Maximum White Subtree 思路 如果考虑其覆盖范围只会到其子树上&#xff0c;不会到其父节点上的话(假设的情况)&#xff0c;这道题就非常好写了&#xff0c;就是一个简单的自底向上传递的树形dpdpdp。所以我们还要考虑的就是连接其父节点&#xff0c;因此我们只需要再进行一个…

树莓派 + Windows IoT Core 搭建环境监控系统

前言&#xff1a;Windows IoT 是微软为嵌入式开发板设计的一种物联网操作系统&#xff0c;运行Windows UWP&#xff08;C# 开发&#xff09;&#xff0c;可以设计出丰富的交互界面&#xff0c;驱动GPIO&#xff0c;连接一些传感器做有意思的事&#xff0c;本文详细介绍如何使用…

CF1547F Array Stabilization (GCD version) st表 + 尺取/二分

传送门 题意&#xff1a; 思路&#xff1a; 容易发现&#xff0c;我们将所有aaa都除上所有aaa的gcdgcdgcd&#xff0c;实际上就是让你求一个最小的lenlenlen&#xff0c;对于所有iii&#xff0c;gcd(ai,ai1,...,ailen−1)1gcd(a_i,a_{i1},...,a_{ilen-1})1gcd(ai​,ai1​,...…

Gauss高斯消元——模板

就是线性代数的初等行变化&#xff1a; 倍加。倍乘。交换行。 #include <bits/stdc.h> #define mp make_pair #define pb push_backusing namespace std;typedef long long ll; typedef pair<int, int> pii; typedef unsigned long long ull;const double pi ac…

.net持续集成测试篇之Nunit文件断言、字符串断言及集合断言

使用前面讲过的方法基本上能够完成工作中的大部分任务了,然而有些功能实现起来还是比较麻烦的,比如说字符串相等性比较不区分大小写,字符串是否匹配某一正则规则,集合中的每一个(某一个)元素是否符合特定规则等,Nunit提供了一些特定的方法用来实现一些用普通断言比较难以实现的…