码迷,mamicode.com
首页 > 编程语言 > 详细

codeforces 652D Nested Segments 离散化+树状数组

时间:2016-03-27 19:24:53      阅读:155      评论:0      收藏:0      [点我收藏+]

标签:

题意:给你若干个区间,询问每个区间包含几个其它区间

分析:区间范围比较大,然后离散化,按右端点排序,每次更新树状数组中的区间左端点,查询区间和

注:(都是套路)

技术分享
#include<cstdio>
#include<cstring>
#include<queue>
#include<cstdlib>
#include<algorithm>
#include<vector>
#include<cmath>
using namespace std;
typedef long long LL;
const int N=2e5+5;
const int INF=0x3f3f3f3f;
int a[N<<1],n,d;
struct pair{
  int l,r,id;
  bool operator<(const pair &e)const{
     return r<e.r;
  }
}p[N];
int c[N<<1];
void change(int x){
   for(int i=x;i<=d;i+=i&(-i))
     ++c[i];
}
int query(int x){
  int ans=0;
  for(int i=x;i>0;i-=i&(-i))
    ans+=c[i];
  return ans;
}
int res[N];
int main(){ 
    scanf("%d",&n);
    int tot=0;
    for(int i=1;i<=n;++i){
       scanf("%d%d",&p[i].l,&p[i].r),p[i].id=i;
       a[++tot]=p[i].l;
       a[++tot]=p[i].r;
    }
    sort(a+1,a+1+tot);
    d=1;
    for(int i=2;i<=tot;++i)
      if(a[i]!=a[i-1])a[++d]=a[i];
    sort(p+1,p+1+n);
    for(int i=1;i<=n;++i){
      int r=lower_bound(a+1,a+1+d,p[i].r)-a;
      int l=lower_bound(a+1,a+1+d,p[i].l)-a;
      res[p[i].id]=query(r)-query(l-1);
      change(l);
    }
    for(int i=1;i<=n;++i)
     printf("%d\n",res[i]); 
    return 0;
}
View Code

 

codeforces 652D Nested Segments 离散化+树状数组

标签:

原文地址:http://www.cnblogs.com/shuguangzw/p/5326467.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!