pku 2464 扫描线+离散化+树状数组(线段树、平衡树)

题意是这样,平面上有很多点,过一点的十字交叉线将平面分为4个部分,求某条扫描线的使得左下平面和右上平面中的点的最小值最大。
这道题比较有意思,用2个树结构进行维护,左边的树为空,右边的树包含所有点,按照点的x、y坐标排序,一个扫面线过去,左边的树增加点,右边的树删除点,进行动态统计~。至于树结构什么都可以,直接套set估计也能过,由于我在做线段树、树状数组专题,就用树状数组来实现吧,不过需要离散化,55
贴代码
  1 import java.io.*;
  2 import java.util.*;
  3 public class Main {
  4 
  5     /**
  6      * @param args
  7      */
  8     static int arr1[]=new int[200005],arr2[]=new int[200005],n,c;
  9     static class node implements Comparable<node>
 10     {
 11         int x,y;
 12         public int compareTo(node pos)
 13         {
 14             if(x!=pos.x)
 15                  return x-pos.x;
 16             else
 17                  return y-pos.y;
 18         }
 19     }
 20     static void add(int pos,int val,int arr[])
 21     {
 22         for(;pos<=n;pos+=pos&(-pos))
 23               arr[pos]+=val;
 24     }
 25     static int sum(int pos,int arr[])
 26     {
 27         int res=0;
 28         for(;pos>0;pos-=pos&(-pos))
 29             res+=arr[pos];
 30         return res;
 31     }
 32     static TreeMap<Integer,Integer> refer=new TreeMap<Integer,Integer>();
 33     static node data[]=new node[200005];
 34     static ArrayList<Integer> tres=new ArrayList<Integer>(),res=new ArrayList<Integer>();
 35     public static void main(String[] args) throws IOException{
 36         StreamTokenizer in=new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
 37         for(int i=0;i<=200000;i++)
 38             data[i]=new node();
 39         while(true)
 40         {
 41             in.nextToken();
 42             n=(int)in.nval;
 43             if(n==0break;
 44             refer.clear();
 45             for(int i=0;i<n;i++)
 46             {
 47                 in.nextToken();
 48                 data[i].x=(int)in.nval;
 49                 in.nextToken();
 50                 data[i].y=(int)in.nval;
 51                 refer.put(data[i].y, 0);
 52             }
 53             Set<Integer> tmp=refer.keySet();
 54             c=1;
 55             Arrays.fill(arr1, 0);
 56             Arrays.fill(arr2, 0);
 57             Arrays.sort(data, 0, n);
 58             for(Integer p:tmp)
 59                refer.put(p, c++);
 60             c--;
 61             for(int i=0;i<n;i++)
 62             {
 63                 data[i].y=refer.get(data[i].y);
 64                 add(data[i].y,1,arr2);
 65             }
 66             tres.clear();
 67             res.clear();
 68             int value=0,minvalue=Integer.MAX_VALUE;
 69             int lastx=data[0].x,begin=0;
 70             for(int i=0;i<n;i++)
 71             {
 72                 if(data[i].x!=lastx)
 73                 {
 74                     for(int j=begin;j<i;j++)
 75                     {
 76                         add(data[j].y,-1,arr2);
 77                     }
 78                     for(int j=begin;j<i;j++)
 79                     {
 80                         minvalue=Math.min(minvalue, sum(data[j].y-1,arr1)+sum(c,arr2)-sum(data[j].y,arr2));
 81                         tres.add(sum(c,arr1)-sum(data[j].y,arr1)+sum(data[j].y-1,arr2));
 82                     }
 83                     for(int j=begin;j<i;j++)
 84                     {
 85                         add(data[j].y,1,arr1);
 86                     }
 87                     if(minvalue>value)
 88                     {
 89                         value=minvalue;
 90                         res.clear();
 91                         res.addAll(tres);
 92                     }
 93                     else if(minvalue==value)
 94                         res.addAll(tres);
 95                     tres.clear();
 96                     begin=i;
 97                     lastx=data[i].x;
 98                     minvalue=Integer.MAX_VALUE;
 99                 }
100             }
101             if(res.isEmpty()) res.add(0);
102             System.out.print("Stan: "+value+"; Ollie: ");
103             Collections.sort(res);
104             System.out.print(res.get(0));
105             for(int i=1;i<res.size();i++)
106                 if(!res.get(i).equals(res.get(i-1)))
107                     System.out.print(" "+res.get(i));
108             System.out.println(";");
109             
110         }
111 
112     }
113 
114 }
115 


posted on 2010-10-28 01:26 yzhw 阅读(324) 评论(0)  编辑 收藏 引用 所属分类: data struct


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2011年3月>
272812345
6789101112
13141516171819
20212223242526
272829303112
3456789

导航

统计

公告

统计系统

留言簿(1)

随笔分类(227)

文章分类(2)

OJ

最新随笔

搜索

积分与排名

最新评论

阅读排行榜