Try Again

Codefroces 762E Radio stations

E. Radio stations
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

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.

Input

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

Output the number of bad pairs of radio stations.

Examples
Input
3 2
1 3 10
3 2 5
4 10 8
Output
1
Input
3 3
1 3 10
3 2 5
4 10 8
Output
2
Input
5 1
1 3 2
2 2 4
3 2 1
4 2 1
5 3 3
Output
2
Input
5 1
1 5 2
2 5 4
3 5 1
4 5 1
5 5 3
Output
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;
}

 

posted @ 2017-07-31 15:53  十年换你一句好久不见  阅读(207)  评论(0编辑  收藏  举报