D. Nested Segments

来源:互联网 发布:私募公募 知乎 编辑:程序博客网 时间:2024/05/29 16:56

线段树或者树状数组的裸题
按一个端点排序之后,离散化一下,没什么坑

#include <algorithm>#include <iostream>#include <cstring>#include <cstdio>#include <map>#define FOR(i,a,b) for(int i=a;i<=b;i++)#define ROF(i,a,b) for(int i=a;i>=b;i--)#define mem(i,a) memset(i,a,sizeof(i))#define rson mid+1,r,rt<<1|1#define lson l,mid,rt<<1#define ll long long#define LL long longusing namespace std;const double eps = 0.0000001;const int maxn = 2e5+7;const int mod = 1e9+7;template <typename T>inline void read(T &_x_){    _x_=0;bool f=false;char ch=getchar();    while (ch<'0'||ch>'9') {if (ch=='-') f=!f;ch=getchar();}    while ('0'<=ch&&ch<='9') {_x_=_x_*10+ch-'0';ch=getchar();}    if(f) _x_=-_x_;}struct node{    int x,y;    int pos;}p[maxn];bool cmp(node a,node b){    return a.x<b.x;}int ans[maxn],sum[maxn*2],pos,n,a[maxn*2],cnt=0;void update(int x){    while(x<=pos){        sum[x]++;        x+=x&(-x);    }}int query(int x){    int  cut = 0;    while(x > 0){        cut += sum[x];        x -= x & (-x);    }    return cut;}int main(){    read(n);    FOR(i,1,n){        read(p[i].x),read(p[i].y),p[i].pos=i;        a[cnt++] = p[i].x;        a[cnt++] = p[i].y;    }    sort(p+1,p+1+n,cmp);    sort(a,a+cnt);    pos = unique(a,a+cnt)-a;    ROF(i,n,1){        int my = lower_bound(a,a+pos,p[i].y)-a;        ans[p[i].pos] = query(my);        update(my);    }    FOR(i,1,n) printf("%d\n",ans[i]);    return 0;}
阅读全文
0 0
原创粉丝点击