您的位置:首页 > 其它

poj2481-树状数组的应用

2012-08-07 16:11 253 查看


//***********************************************解决思想************************************

对于这种有两个关键字并且具备单调性的问题,使用树状数组优化的一般方法是固定一个关键字(或者区间的端点),然后查询另一个关键字前n项和的性质确定当前对象的答案。

1.此题先按s由小到大排序,如果s相同根据t由大到小排序(使得前面的影响后面的)使用树状数组查询当前大于e-1的个数,还要注意特殊处理一下完全相同的区间。

//**********************************下面这种常用****************

2.插点问段的模版是查询该数前面比他小的数的个数

用于该题则是将t先降序排列,若相同时则将s升序排列,然后查询s中比当前改该值小的数即sum(i):即比i小的数的个数,然后modify(i);

poj 2481 Cows 解法:与Stars一题类似,

题意:FJ有n头牛(编号为1~n),每一头牛都有一个测验值[S, E],如果对于牛i和牛j来说,它们的测验值满足下面的条件则证明牛i比牛j强壮:Si <= Sj and Ej <= Ei and Ei - Si > Ej - Sj。现在已知每一头牛的测验值,要求输出每头牛有几头牛比其强壮。
package 树状数组_插点问段;
//!!!!!!!!!!
//当题目中的某个性质是单调递减的时候使用树状数组的查询比i大的数时,可以使用i-sum(i-1);
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StreamTokenizer;
import java.util.Arrays;

public class poj2481two {
static int MAX=100010;
static int c[]=new int[MAX];
static int ans[]=new int[MAX];
static D []d;

static StreamTokenizer in = new StreamTokenizer(new BufferedReader(
new InputStreamReader(System.in)));
static  PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
final static  int nextInt() throws IOException {
in.nextToken();
return (int) in.nval;
}

static int lowbit(int i){
int ans=i&(-i);
return ans;
}
//插点问段,,,,,,,,,此模版用于查询其前面比他小的数的个数
static void modify(int k,int d){
while(k<=MAX){
c[k]+=d;
k+=lowbit(k);
}
}
static int sum(int n){
int result=0;
while(n>0){
result+=c
;
n-=lowbit(n);
}
return result;
}

public static void main(String[] args) throws IOException {
int num;
while((num=nextInt())!=0){
Arrays.fill(c,0);
Arrays.fill(ans, 0);
d=new D[num];
for(int i=0;i<num;i++){
d[i]=new D(nextInt()+1,nextInt()+1);//不能从零开始
d[i].index=i;

}

Arrays.sort(d,0,num);

for(int i=0;i<num;i++){
if(i>0&&d[i].s==d[i-1].s&&d[i].e==d[i-1].e){
//					modify(cow[i].s,1);
ans[d[i].index]=ans[d[i-1].index];
}
else{
ans[d[i].index]=i-sum(d[i].e-1);
}
modify(d[i].e,1);

}

for(int i=0;i<num-1;i++)
out.print(ans[i]+" ");
out.println(ans[num-1]);
}
out.flush();
out.close();

}

}
class D implements Comparable<D>{
int s;
int e;
int index;
public D(int s,int e){
this.s=s;
this.e=e;
}
@Override
public int compareTo(D o) {
// TODO Auto-generated method stub
if(this.s<o.s)
return -1;
else if(this.s==o.s){
if(this.e>o.e)
return -1;
else
return 1;
}
else
return 1;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: