Codefroces 762E Radio stations
In the lattice points of the coordinate line there are n radio stations, the i-th of which is described by three integers:
- xi — the coordinate of the i-th station on the line,
- ri — the broadcasting range of the i-th station,
- fi — the broadcasting frequency of the i-th station.
We will say that two radio stations with numbers i and j reach each other, if the broadcasting range of each of them is more or equal to the distance between them. In other words min(ri, rj) ≥ |xi - xj|.
Let's call a pair of radio stations (i, j) bad if i < j, stations i and j reach each other and they are close in frequency, that is, |fi - fj| ≤ k.
Find the number of bad pairs of radio stations.
The first line contains two integers n and k (1 ≤ n ≤ 105, 0 ≤ k ≤ 10) — the number of radio stations and the maximum difference in the frequencies for the pair of stations that reach each other to be considered bad.
In the next n lines follow the descriptions of radio stations. Each line contains three integers xi, ri and fi (1 ≤ xi, ri ≤ 109, 1 ≤ fi ≤ 104) — the coordinate of the i-th radio station, it's broadcasting range and it's broadcasting frequency. No two radio stations will share a coordinate.
Output the number of bad pairs of radio stations.
3 2
1 3 10
3 2 5
4 10 8
1
3 3
1 3 10
3 2 5
4 10 8
2
5 1
1 3 2
2 2 4
3 2 1
4 2 1
5 3 3
2
5 1
1 5 2
2 5 4
3 5 1
4 5 1
5 5 3
5
线段树搜索
#include <iostream> #include <algorithm> #include <cstring> #include <cstdio> #include <vector> #include <queue> #include <cstdlib> #include <iomanip> #include <cmath> #include <ctime> #include <map> #include <set> using namespace std; #define lowbit(x) (x&(-x)) #define max(x,y) (x>y?x:y) #define min(x,y) (x<y?x:y) #define MAX 100000000000000000 #define MOD 1000000007 #define pi acos(-1.0) #define ei exp(1) #define PI 3.141592653589793238462 #define ios() ios::sync_with_stdio(false) #define INF 0x3f3f3f3f3f #define mem(a) (memset(a,0,sizeof(a))) typedef long long ll; const int maxn=100010; const int maxm=maxn*30; const int maxf=10010; inline int read() { int k=0;char ch=getchar(); while(ch<'0' || ch>'9') ch=getchar(); while(ch>='0' && ch<='9') k=k*10+ch-'0',ch=getchar(); return k; } int ls[maxm],rs[maxm],v[maxm],root[maxf],n,m,rank[maxn],tot; ll ans; struct Node { int x,r,f; friend bool operator<(const Node &a,const Node &b) { return a.x<b.x; } }node[maxn]; bool cmp(int x,int y) { return node[x].x+node[x].r<node[y].x+node[y].r; } inline void modify(int &x,int l,int r,int pos,int val) { if(!x) x=++tot; v[x]+=val; if(l==r) return ; int mid=l+r>>1; if(pos<=mid) modify(ls[x],l,mid,pos,val); else modify(rs[x],mid+1,r,pos,val); } inline int query(int x,int l,int r,int pos) { if(!x) return 0; if(l>=pos) return v[x]; int mid=l+r>>1; if(pos<=mid) return query(ls[x],l,mid,pos)+v[rs[x]]; return query(rs[x],mid+1,r,pos); } int main() { n=read(),m=read(); for(int i=1;i<=n;i++) node[i].x=read(),node[i].r=read(),node[i].f=read(),rank[i]=i; sort(node+1,node+n+1); sort(rank+1,rank+n+1,cmp); for(int i=1;i<=n;i++) { printf(" %d",rank[i]); } for(int i=1,j=1;i<=n;i++) { while(j<=n && node[rank[j]].x+node[rank[j]].r<node[i].x) modify(root[node[rank[j]].f],1,MOD,node[rank[j]].x,-1),j++; for(int k=max(1,node[i].f-m);k<=min(10000,node[i].f+m);k++) ans+=query(root[k],1,MOD,max(node[i].x-node[i].r,1)); modify(root[node[i].f],1,MOD,node[i].x,1); } printf("\n%I64d\n",ans); return 0; }