青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

pku 2002

2009年7月18日 星期六

題目鏈接:PKU 2002 Squares

分類:哈希

題目分析與算法原型
         其實該題和1971很像(還有3432題除了輸入的點的范圍其他的基本和這題一模一樣)區別在于這題是統計正方形個數,而那題是統計平行四邊形個數,個人感覺這題稍微復雜一些,因為正方形屬于平行四邊形,我用那題的思路,將那題的代碼改了一下,即在平行四邊形的基礎上判斷是否是正方形,結果TLE了,只能另找方法了。

 算法1:其實可以發現一點,就是如果給你一個正方形的兩個對角線點的坐標,則根據正方形的特點,一定可以算出另外的兩點的坐標,利用這一點,這道題目基本就可以hash了,具體做法是,先將讀入的n個點的坐標按照其x坐標作為關鍵值進行hash,然后像1971一樣枚舉每兩個不同的點,將他們作為某個正方形的對角線,算出兩外的兩個點,然后對于新算出的兩個點的x坐標進行hash查找,對于x相同的點,判斷y是否也相同,若相同,則繼續hash另一個點的坐標,若兩次都能找到則正方形個數加1。在哈希判斷時若找到相同的則直接退出本次查找,否則一直查找到鏈表的末尾,表示沒有以該兩點作為對角線的正方形。
       
算法2:這道題目還可以不用哈希,直接用二分來查找,同算法一,也是先枚舉每兩個點,根據公式算出另外的兩個點,不過,直接用二分來查找這兩個點是否存在,當然了,事先需要對輸入的坐標排個序,先按x坐標從小到大排序,相同的x的點以y坐標從小到大排序,二分檢測時候,先找到與當前被檢索的點的x坐標相同的所有點的下標范圍,然后再次在這個范圍里面再次二分查找是否存在與其y坐標相同的點.........
        需要注意的是這種方法,對于同一個正方形來說,因為與兩條對角線,所以會算了兩次,所以最后輸出的時候需要除以2,呵呵

Code1:

 1
#include<stdio.h>
 2#include<math.h>
 3#include<string.h>
 4#define max 1005
 5#define pianyi 20005
 6#define prime 39997
 7#define len 50000
 8int n,i,j,start,sum,count,pos[max][2];
 9double x[3],y[3];
10
11struct node
12{
13    int px,py;
14    int next;
15}
hash[len];
16
17void cal(int a,int b)
18{
19    double x0=(double)(pos[a][0]+pos[b][0])/2,y0=(double)(pos[a][1]+pos[b][1])/2;
20    if((pos[b][1]-pos[a][1])*(pos[b][0]-pos[a][0])>0)
21    {
22        x[1]=x0-fabs(pos[b][1]-pos[a][1])/2;
23        x[2]=x0+fabs(pos[b][1]-pos[a][1])/2;
24        y[1]=y0+fabs(pos[b][0]-pos[a][0])/2;
25        y[2]=y0-fabs(pos[b][0]-pos[a][0])/2;
26    }

27    else
28    {
29        x[1]=x0-fabs(pos[b][1]-pos[a][1])/2;
30        x[2]=x0+fabs(pos[b][1]-pos[a][1])/2;
31        y[1]=y0-fabs(pos[b][0]-pos[a][0])/2;
32        y[2]=y0+fabs(pos[b][0]-pos[a][0])/2;
33    }

34}

35int Hash2(int x,int y)
36{
37    int now=x%prime;
38    while(hash[now].next!=-1)
39    {
40        if(hash[hash[now].next].py==y)return 1;
41        now=hash[now].next;
42    }

43    return 0;
44}

45void Hash(int k)
46{
47    int now=k%prime;
48    while(hash[now].next!=-1)now=hash[now].next;
49    hash[start].next=-1;
50    hash[now].next=start;
51    start++;
52}

53int main()
54{
55    while(scanf("%d",&n)!=EOF&&n)
56    {
57        start=prime+10;
58        memset(hash,-1,sizeof(hash));
59        for(i=0;i<n;i++)
60        {
61            scanf("%d%d",&pos[i][0],&pos[i][1]);
62            hash[start].px=pos[i][0];
63            hash[start].py=pos[i][1];
64            Hash(pos[i][0]+pianyi);
65        }

66        count=0;    
67        for(i=0;i<n-1;i++)
68            for(j=i+1;j<n;j++)
69            {
70                int res1,res2;
71                cal(i,j);
72                int t1=(int)x[1],t2=(int)x[2],t3=(int)y[1],t4=(int)y[2];
73                if(t1!=x[1]||t2!=x[2]||t3!=y[1]||t4!=y[2])continue;
74                res1=Hash2((int)x[1]+pianyi,(int)y[1]);
75                res2=Hash2((int)x[2]+pianyi,(int)y[2]);
76                if(res1&&res2)count++;
77            }

78            printf("%d\n",count/2);
79    }

80    return 0;
81}

82
83
  Code2:

  1
#include<stdio.h>
  2#include<stdlib.h>
  3#include<math.h>
  4#include<string.h>
  5#define max 2005
  6
  7int n,i,j,start,sum,count;
  8double x[3],y[3];
  9
 10struct node
 11{
 12    int px,py;
 13}
pos[max];
 14
 15int cmp(const void *a,const void *b)
 16{
 17    struct node *c=(node *)a;
 18    struct node *d=(node *)b;
 19    if(c->px!=d->px)return c->px-d->px;
 20    else return c->py-d->py;
 21}

 22
 23int search2(int low,int high,int y)
 24{
 25    int mid;
 26    while(low<=high&&low>=0&&high<n)
 27    {
 28        mid=(low+high)/2;
 29        if(y<pos[mid].py)high=mid-1;
 30        else if(y>pos[mid].py)low=mid+1;
 31        else return 1;
 32    }

 33    return 0;
 34}

 35
 36int search(int low,int high,int x,int y)
 37{
 38    int mid;
 39    while(low<=high&&low>=0&&high<n)
 40    {
 41        mid=(low+high)/2;
 42        if(x<pos[mid].px)high=mid-1;
 43        else if(x>pos[mid].px)low=mid+1;
 44        else
 45        {
 46            int start=mid,end=mid;
 47            while(pos[start].px==x&&start>=0)start--;
 48            while(pos[end].px==x&&end<n)end++;
 49            return search2(start+1,end-1,y);
 50        }

 51    }

 52    return 0;
 53}

 54
 55
 56
 57void cal(int a,int b)
 58{
 59    double x0=(double)(pos[a].px+pos[b].px)/2,y0=(double)(pos[a].py+pos[b].py)/2;
 60    if((pos[b].py-pos[a].py)*(pos[b].px-pos[a].px)>0)
 61    {
 62        x[1]=x0-fabs(pos[b].py-pos[a].py)/2;
 63        x[2]=x0+fabs(pos[b].py-pos[a].py)/2;
 64        y[1]=y0+fabs(pos[b].px-pos[a].px)/2;
 65        y[2]=y0-fabs(pos[b].px-pos[a].px)/2;
 66    }

 67    else
 68    {
 69        x[1]=x0-fabs(pos[b].py-pos[a].py)/2;
 70        x[2]=x0+fabs(pos[b].py-pos[a].py)/2;
 71        y[1]=y0-fabs(pos[b].px-pos[a].px)/2;
 72        y[2]=y0+fabs(pos[b].px-pos[a].px)/2;
 73    }

 74}

 75
 76int main()
 77{
 78    while(scanf("%d",&n)!=EOF&&n)
 79    {
 80        for(i=0;i<n;i++)scanf("%d%d",&pos[i].px,&pos[i].py);
 81        qsort(pos,n,sizeof(pos[0]),cmp);    
 82        count=0;    
 83        for(i=0;i<n-1;i++)
 84            for(j=i+1;j<n;j++)
 85            {
 86                int res1,res2;
 87                cal(i,j);
 88                int t1=(int)x[1],t2=(int)x[2],t3=(int)y[1],t4=(int)y[2];
 89                if(t1!=x[1]||t2!=x[2]||t3!=y[1]||t4!=y[2])continue;
 90                res1=search(0,n-1,x[1],y[1]);
 91                if(!res1)continue;
 92                res2=search(0,n-1,x[2],y[2]);
 93                if(res1&&res2)count++;
 94            }

 95            printf("%d\n",count/2);
 96    }

 97    return 0;
 98}

 99
100

posted on 2009-07-18 23:45 蝸牛也Coding 閱讀(658) 評論(1)  編輯 收藏 引用

評論

# re: pku 2002 2009-08-20 20:48 ning

2分法的那個bsearch函數不能用么?  回復  更多評論   


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


<2010年8月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
2930311234

導航

統計

常用鏈接

留言簿(8)

隨筆檔案(78)

搜索

積分與排名

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            999亚洲国产精| 欧美色欧美亚洲另类七区| 久久精品国产精品亚洲综合| 性欧美暴力猛交69hd| 午夜精品久久久久久久蜜桃app | 久久精品亚洲热| 欧美在线在线| 欧美18av| 国产精品萝li| 亚洲第一在线综合网站| 亚洲韩国一区二区三区| 9久re热视频在线精品| 亚洲自拍偷拍色片视频| 久久国产精品久久w女人spa| 美玉足脚交一区二区三区图片| 欧美激情在线狂野欧美精品| 一区二区三区高清在线| 久久九九久精品国产免费直播 | 欧美午夜精品一区二区三区| 欧美激情一区二区三区在线视频| 欧美日本成人| 国产女主播一区| 亚洲精品国产精品久久清纯直播| 亚洲一区二区三区成人在线视频精品| 午夜影视日本亚洲欧洲精品| 欧美高清在线视频| 亚洲一区二区三区在线播放| 久久日韩粉嫩一区二区三区| 欧美日韩一区国产| 国产在线播精品第三| 亚洲另类视频| 美日韩精品免费观看视频| 亚洲天堂av在线免费观看| 欧美成人69| 在线播放豆国产99亚洲| 性欧美大战久久久久久久久| 亚洲国产高清一区二区三区| 亚洲香蕉视频| 欧美日韩亚洲综合一区| 亚洲激情精品| 男人插女人欧美| 欧美一区1区三区3区公司| 欧美日韩国产综合网| 亚洲国产欧美一区| 麻豆精品91| 欧美一级理论片| 国产精品久久久久久妇女6080| 亚洲精品美女免费| 欧美a级一区二区| 久久高清福利视频| 国产区精品视频| 性做久久久久久免费观看欧美| 夜夜爽夜夜爽精品视频| 欧美日本亚洲韩国国产| 亚洲精品一区在线观看| 亚洲国产精品久久91精品| 欧美成人精品三级在线观看| 亚洲国产日韩欧美在线99| 欧美sm视频| 欧美freesex交免费视频| 亚洲国产二区| 亚洲福利视频一区| 欧美精品日韩www.p站| 99热在这里有精品免费| 亚洲美女尤物影院| 国产精品福利影院| 久久aⅴ国产紧身牛仔裤| 亚洲欧美日韩系列| 韩日精品视频一区| 欧美激情按摩| 欧美天堂亚洲电影院在线观看| 亚洲欧美电影院| 一区二区三区视频在线观看| 国产精品少妇自拍| 久久久综合网站| 六月丁香综合| 中文精品99久久国产香蕉| 亚洲国产综合在线| 亚洲精品一区二区在线观看| 亚洲国产一区二区三区高清| 欧美激情精品久久久久久蜜臀| 99v久久综合狠狠综合久久| 亚洲日本成人网| 国产精品女主播在线观看| 久久久久久久久蜜桃| 美女主播一区| 亚洲自拍偷拍视频| 久久久久综合网| 国产精品99久久久久久白浆小说 | 欧美xx视频| 亚洲一区激情| 久久精品国产99| 在线一区二区三区做爰视频网站 | 欧美日韩免费精品| 久久精品欧洲| 欧美精品97| 久久婷婷久久| 欧美性做爰毛片| 欧美国产国产综合| 国产三级欧美三级日产三级99| 欧美激情在线狂野欧美精品| 国产热re99久久6国产精品| 亚洲激情婷婷| 国产无一区二区| 亚洲精品欧美极品| 精品盗摄一区二区三区| 亚洲一区二区欧美日韩| 最近中文字幕日韩精品| 欧美亚洲综合另类| 亚洲一区二区毛片| 欧美mv日韩mv亚洲| 久久夜色精品国产欧美乱| 国产精品av一区二区| 亚洲第一成人在线| 精品电影在线观看| 欧美一区二区视频在线观看| 亚洲调教视频在线观看| 欧美高清影院| 欧美福利精品| 亚洲电影专区| 久久久之久亚州精品露出| 欧美在线一二三区| 国产精品v欧美精品∨日韩| 亚洲黄色免费| 亚洲黄色毛片| 美女日韩欧美| 欧美波霸影院| 亚洲国产1区| 老色鬼精品视频在线观看播放| 久久精品国产一区二区三区| 国产精品丝袜久久久久久app| 一本色道**综合亚洲精品蜜桃冫| 99在线热播精品免费99热| 欧美精品一区二区视频| 亚洲国产精品电影在线观看| 亚洲国产精品福利| 免费观看国产成人| 亚洲国产黄色| 欧美一区二区三区喷汁尤物| 激情五月综合色婷婷一区二区| 久久精品国产成人| 国产美女精品一区二区三区| 一本一本a久久| 亚洲尤物在线视频观看| 国产精品久久久久免费a∨| 亚洲一区二区成人在线观看| 午夜久久影院| 国产曰批免费观看久久久| 久久综合九九| 亚洲精品1区2区| 亚洲一区二区精品在线观看| 国产乱码精品一区二区三区av| 亚洲欧美日韩另类| 猛男gaygay欧美视频| 亚洲伦理在线观看| 国产精品久久一区二区三区| 性做久久久久久久久| 欧美二区不卡| 亚洲欧美日产图| 红桃视频成人| 欧美另类videos死尸| 亚洲一区二区在| 久久综合九色| 一本色道综合亚洲| 国产一区二区三区精品欧美日韩一区二区三区 | 最近中文字幕mv在线一区二区三区四区| 奶水喷射视频一区| 99国内精品久久| 久久久精品国产免大香伊 | 国产女主播视频一区二区| 久久久久久91香蕉国产| 最新中文字幕亚洲| 亚洲午夜羞羞片| 激情欧美丁香| 欧美性一二三区| 麻豆精品精品国产自在97香蕉| 一本一本久久| 欧美高清在线一区| 午夜日本精品| 亚洲精品你懂的| 国产一区日韩欧美| 欧美日韩国产色视频| 欧美一区二区成人| 99视频精品全部免费在线| 麻豆精品精华液| 欧美亚洲综合网| 一区二区三区四区蜜桃| 伊人成年综合电影网| 国产精品一区免费观看| 欧美激情一区二区三区四区| 久久久久久久久蜜桃| 亚洲天堂激情| 亚洲精品九九| 欧美激情一区二区三区高清视频| 久久精品亚洲一区二区三区浴池| 国产精品99久久久久久久久久久久| 黄色成人在线免费| 国产性猛交xxxx免费看久久| 欧美性猛交xxxx免费看久久久| 久久久久成人精品免费播放动漫|