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; } }
相关文章推荐
- poj 2481 cows 树状数组
- POJ-2481 Cows 树状数组
- POJ 2481 Cows 树状数组
- Cows - POJ 2481 树状数组
- poj 2481 树状数组
- POJ 2481 树状数组
- 树状数组水题小结 Poj 2352 + 2481 + 3067
- POJ 2481 - Cows 树状数组离线处理
- POJ 2481:Cows 树状数组
- poj 2481 树状数组
- (POJ 2481)Cows 树状数组
- poj2481~Cows~(树状数组)
- POJ 2481:Cows 树状数组
- POJ 2481 Cows 树状数组
- poj 2481 树状数组(覆盖每个区间的区间个数)
- poj 2481 Cows 树状数组
- POJ 2481 Cows 树状数组
- poj 2299 poj 2481 树状数组
- 树状数组 POJ 2481 Cows
- poj_2481,Cows,树状数组