【Codeforces 652 D Nested Segments】+ 树状数组 + 离散化

来源:互联网 发布:中控科门禁软件下载 编辑:程序博客网 时间:2024/05/18 20:07

D. Nested Segments
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

You are given n segments on a line. There are no ends of some segments that coincide. For each segment find the number of segments it contains.
Input

The first line contains a single integer n (1 ≤ n ≤ 2·105) — the number of segments on a line.

Each of the next n lines contains two integers li and ri ( - 109 ≤ li < ri ≤ 109) — the coordinates of the left and the right ends of the i-th segment. It is guaranteed that there are no ends of some segments that coincide.
Output

Print n lines. The j-th of them should contain the only integer aj — the number of segments contained in the j-th segment.
Examples
Input

4
1 8
2 3
4 7
5 6

Output

3
0
1
0

Input

3
3 4
1 5
2 6

Output

0
1
1

D. Nested Segments
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

You are given n segments on a line. There are no ends of some segments that coincide. For each segment find the number of segments it contains.
Input

The first line contains a single integer n (1 ≤ n ≤ 2·105) — the number of segments on a line.

Each of the next n lines contains two integers li and ri ( - 109 ≤ li < ri ≤ 109) — the coordinates of the left and the right ends of the i-th segment. It is guaranteed that there are no ends of some segments that coincide.
Output

Print n lines. The j-th of them should contain the only integer aj — the number of segments contained in the j-th segment.
Examples
Input

4
1 8
2 3
4 7
5 6

Output

3
0
1
0

Input

3
3 4
1 5
2 6

Output

0
1
1

树状数组 + 离散化 原来 + 起来这么好用~ amzaing~

AC代码:

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int MAXN = 2e5 + 10;struct node{    int x,y,id;}st[MAXN];int sum[MAXN],N,ans[MAXN];bool cmp(node a,node b){return a.y < b.y;}bool cmp1(node a,node b){    if(a.x != b.x) return a.x > b.x;    else return a.y < b.y;}void up(int a){   while(a <= N){    sum[a]++;    a += a & (-a);   }}int qu(int a){    int  cut = 0;    while(a > 0){        cut += sum[a];        a -= a & (-a);    }    return cut;}int main(){    while(scanf("%d",&N) != EOF){        memset(sum,0,sizeof(sum));        for(int i = 1 ; i <= N; i++){            scanf("%d %d",&st[i].x,&st[i].y);            st[i].id = i;        }        sort(st + 1 ,st + 1 + N,cmp);        for(int i = 1 ; i <= N; i++)            st[i].y = i; // 离散右端点,便于的运用树状数组求解        sort(st + 1,st + 1 + N,cmp1);        for(int i = 1 ; i <= N; i++){            ans[st[i].id] = qu(st[i].y); // 查询            up(st[i].y); // 求和        }        for(int i = 1 ; i <= N; i++)            printf("%d\n",ans[i]);    }    return 0;}
0 0
原创粉丝点击