题意是这样,平面上有很多点,过一点的十字交叉线将平面分为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==0) break;
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