//POJ 2481 Cows 线段树
/*
题意:给n条线段(S,E),问每条线段中包含几条线段
线段i包含线段j的定义是Si <= Sj and Ej <= Ei and Ei - Si > Ej - Sj
思路:
将线段转化为点,这样问题就转化为问某点的左上方有多少个点
就和POJ 2352 Stars相似了
由于问的是左上方,所以点的排序应先按照y从大到小,再按x从小到大排
照样按x轴建树,同样要注意这里的x从0开始,要处理下
一个要注意的是这里的线段有可能是相同的,也就是说有重点,
这样线段树查询的时候会把那点算进去,而同样的点不满足包含的第二个定义Ei - Si > Ej - Sj
所以要特殊处理这样的数据。
PS:如果数据太大要离散化处理,这里10W还可以接受,加了个离散化之后时间反而更多了..
数据:
input:
4
1 3
1 3
1 4
1 4
output:
2 2 0 0
*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define N 100005
#define lson rt<<1,l,mid
#define rson rt<<1|1,mid+1,r
int n;
int sum[N<<2],ans[N];
struct node{
int x;
int y;
int id;
}s[N];
int cmp(const void *a,const void *b){
if((*(node *)b).y != (*(node *)a).y)
return (*(node *)b).y - (*(node *)a).y;
return (*(node *)a).x - (*(node *)b).x ;
}
void Pushup(int rt){
sum[rt] = sum[rt<<1] + sum[rt<<1|1];
}
void Update(int rt,int l,int r,int x){
if(l == r){
++sum[rt];
return ;
}
int mid = (l + r) >> 1;
if(x <= mid) Update(lson,x);
else Update(rson,x);
Pushup(rt);
}
int Query(int rt, int l, int r, int L, int R){
if(L <= l && R >= r){
return sum[rt];
}
int mid = (l + r) >> 1;
int res = 0;
if(L <= mid) res += Query(lson,L,R);
if(R > mid) res += Query(rson,L,R);
return res;
}
int main(){
int i,j;
while(scanf("%d",&n),n){
for(i = 0; i < n; ++i){
scanf("%d %d",&s[i].x,&s[i].y);
++s[i].x;
s[i].id = i;
}
qsort(s,n,sizeof(s[0]),cmp);
memset(sum,0,sizeof(sum));
for(i = 0; i < n; ++i){
int x = s[i].x;
if(i && s[i].x == s[i-1].x && s[i].y == s[i-1].y)
ans[s[i].id] = ans[s[i-1].id];
else
ans[s[i].id] = Query(1,1,100001,1,x);
Update(1,1,100001,x);
}
for(i = 0; i < n; ++i)
printf("%d%c",ans[i],i==n-1?'\n':' ');
}
return 0;
}
分享到:
相关推荐
NULL 博文链接:https://128kj.iteye.com/blog/1744222
poj2823,使用线段树进行查询区域间最大最小值,线段树初步
POJ2528-Mayor's posters 【区间映射压缩(离散化)+线段树】 解题报告+AC代码 http://hi.csdn.net/!s/83XZJU ========> 我的所有POJ解题报告链接: http://blog.csdn.net/lyy289065406/article/details/6642573
问题:求平面上多个矩形的总面积。 算法:线段树(经典的线段树题目)
这是一道很不错的题目,即可以用线段树做也可以用树状数组,可谓经典。不过当然了线段树是比较难搞,而树状数组是极其简洁的,构造很简单,下面就分别来介绍一下两种方法...
poj 2763 程序 线段树 LCA 2000MS AC
NULL 博文链接:https://128kj.iteye.com/blog/1739733
NULL 博文链接:https://128kj.iteye.com/blog/1739064
poj 2430 Lazy Cows.md
NULL 博文链接:https://128kj.iteye.com/blog/1740501
POJ3468,线段树处理,注意longlongint
线段树、树状数组算法入门 加 poj解题报告 pdf文档
NULL 博文链接:https://128kj.iteye.com/blog/1746750
POJ题解 个人写法 线段树每个人都不一样
POJ2186-Popular Cows 【Tarjan+极大强连通分量+缩点】 解题报告+AC代码 http://hi.csdn.net/!s/BGDH68 附:我所有的POJ解题报告链接 . http://blog.csdn.net/lyy289065406/article/details/6642573
NULL 博文链接:https://200830740306.iteye.com/blog/603493
大量线段树题目 zoj 1610 线段覆盖 poj 2777 线段覆盖 poj 2528 需要离散化,建树不同,需要处理不同->注意这组数据 3 1 10 1 3 6 10 the ans is 3. hdu 1754 求区间最大值 hdu 1166 求区间和 hdu 1698 成段更新 ...
POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类
poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题...
大家都用树状数组,但是有人只会用线段树呢? 而且我可以轻易改出一道不能用树状数组的题 在线段树一次次TLE后,有一个ID发帖抱怨 “下次写一个汇编版非递归线段树,再超时?” 可是大家都知道,超时的代码已经2k了...