pku3168 Barn Expansion 排序+区间重叠判断

MS好久不写blog了,现在好忙,又是GRE,又是考研,又是ACM。。蛋疼
言归正传
题意:
给出一些长方形,不重叠,但可以擦边或擦角。问有多少个长方形是完全不和别的长方形沾边的

给力条件:不重叠

方法:经典的排序+区间合并

代码:
 1 # include <cstdio>
 2 # include <cstring>
 3 # include <cstdlib>
 4 # define max(a,b) ((a)>(b)?(a):(b))
 5 using namespace std;
 6 struct line
 7 {
 8    int s,e,p,id;
 9 }tmp[60000];
10 int cmp(const void *a,const void *b)
11 {
12     line *aa=(line *)a,*bb=(line *)b;
13     if(aa->p!=bb->p) return aa->p-bb->p;
14     else return aa->s-bb->s;
15 }
16 int data[30000][4],n;
17 bool used[30000];
18 void solve()
19 {
20     int end=tmp[0].e,last=0;
21     for(int i=1;i<2*n;i++)
22       if(tmp[i].p==tmp[i-1].p&&tmp[i].s<=end)
23          end=max(end,tmp[i].e);
24       else
25       {
26          if(last!=i-1)
27           for(int j=last;j<i;j++)
28             used[tmp[j].id]=false;
29           end=tmp[i].e;
30           last=i;
31       }
32      if(last!=2*n-1)
33      for(int j=last;j<2*n;j++)
34         used[tmp[j].id]=false;
35 }
36 int main()
37 {
38     scanf("%d",&n);
39     memset(used,true,sizeof(used));
40     for(int i=0;i<n;i++)
41       scanf("%d%d%d%d",&data[i][0],&data[i][1],&data[i][2],&data[i][3]);
42     for(int i=0;i<n;i++)
43     {
44        tmp[2*i].s=data[i][0];
45        tmp[2*i].e=data[i][2];
46        tmp[2*i].p=data[i][1];
47        tmp[2*i].id=i;
48        tmp[2*i+1]=tmp[2*i];
49        tmp[2*i+1].p=data[i][3];
50     }
51     qsort(tmp,2*n,sizeof(line),cmp);
52    /* printf("\n");
53     for(int i=0;i<2*n;i++)
54       printf("%d %d %d %d\n",tmp[i].id,tmp[i].p,tmp[i].s,tmp[i].e);
55     printf("\n");*/
56     solve();
57     for(int i=0;i<n;i++)
58     {
59        tmp[2*i].s=data[i][1];
60        tmp[2*i].e=data[i][3];
61        tmp[2*i].p=data[i][0];
62        tmp[2*i].id=i;
63        tmp[2*i+1]=tmp[2*i];
64        tmp[2*i+1].p=data[i][2];
65     }
66     qsort(tmp,2*n,sizeof(line),cmp);
67    /* for(int i=0;i<2*n;i++)
68       printf("%d %d %d %d\n",tmp[i].id,tmp[i].p,tmp[i].s,tmp[i].e);
69     printf("\n");*/
70     solve();
71     int c=0;
72     for(int i=0;i<n;i++)
73       c+=used[i];
74     printf("%d\n",c);
75     //system("pause");
76     return 0;
77 }
78 

posted on 2011-03-02 02:10 yzhw 阅读(231) 评论(0)  编辑 收藏 引用 所属分类: data struct


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


<2011年1月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
303112345

导航

统计

公告

统计系统

留言簿(1)

随笔分类(227)

文章分类(2)

OJ

最新随笔

搜索

积分与排名

最新评论

阅读排行榜