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

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 閱讀(659) 評論(1)  編輯 收藏 引用

評論

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

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


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


<2009年7月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

導航

統計

常用鏈接

留言簿(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>
            久久国产高清| 欧美在线高清| 亚洲国产精品第一区二区| 宅男噜噜噜66一区二区 | 欧美xxxx在线观看| 欧美在线免费视频| 欧美三区在线| 亚洲人永久免费| 国内精品久久久久国产盗摄免费观看完整版| 亚洲精品一区久久久久久 | 国产日韩欧美成人| 一本久道久久综合婷婷鲸鱼| 亚洲人成人99网站| 蜜桃精品久久久久久久免费影院| 久久网站免费| 狠狠色丁香婷综合久久| 欧美亚洲网站| 久久超碰97中文字幕| 国产精品美女黄网| 在线视频欧美一区| 亚洲影院在线观看| 欧美三级电影一区| 日韩视频久久| 亚洲视频在线观看免费| 国产精品theporn| 99在线精品观看| 亚洲香蕉在线观看| 欧美三区美女| 亚洲一区二区免费| 久久国产精品99国产精| 国产亚洲欧美色| 久久高清国产| 欧美成人午夜77777| 亚洲欧洲精品一区二区三区波多野1战4| 久久婷婷激情| 亚洲国产精品电影在线观看| 亚洲精品一二三| 欧美日韩1区2区| 亚洲网站在线观看| 久久久国产精品一区二区三区| 国产一区二区日韩精品| 开心色5月久久精品| 亚洲国产精品综合| 亚洲欧美999| 极品少妇一区二区三区| 欧美激情亚洲一区| 亚洲天堂黄色| 另类av一区二区| 99热在这里有精品免费| 欧美性猛交xxxx乱大交退制版| 亚洲欧美日韩直播| 欧美成人免费观看| 亚洲香蕉网站| 在线观看视频一区| 欧美手机在线| 久久精品30| 亚洲最新视频在线| 老牛影视一区二区三区| 一区二区三区欧美在线| 国产啪精品视频| 欧美 日韩 国产精品免费观看| 亚洲高清毛片| 欧美日在线观看| 久久九九免费视频| 亚洲精品一线二线三线无人区| 午夜视频在线观看一区| 亚洲第一页中文字幕| 欧美午夜女人视频在线| 久久久久久有精品国产| 一区二区三区www| 欧美成人精品不卡视频在线观看| 中文av字幕一区| 伊人夜夜躁av伊人久久| 国产精品久久久久9999| 欧美大胆人体视频| 久久国产福利| 亚洲一区二区三区影院| 91久久精品一区二区别| 麻豆精品视频| 欧美一区二区三区四区在线观看| 亚洲伦理中文字幕| 在线播放一区| 国产欧美精品日韩| 国产精品久久国产三级国电话系列 | 亚洲成人在线网站| 国产精品资源| 欧美日韩一区在线观看视频| 免费欧美在线| 久久综合色播五月| 欧美一区二区在线看| 亚洲私人影院在线观看| 亚洲免费观看高清完整版在线观看熊 | 在线不卡免费欧美| 国产一区二区三区日韩欧美| 国产精品成人va在线观看| 欧美激情四色 | 宅男66日本亚洲欧美视频| 影音先锋亚洲一区| 国产在线欧美| 国产亚洲成av人在线观看导航| 国产精品白丝av嫩草影院| 欧美激情一区二区三级高清视频 | 国产精品一香蕉国产线看观看| 欧美日韩午夜剧场| 欧美极品欧美精品欧美视频| 美女日韩欧美| 美女主播精品视频一二三四| 久久久久综合| 久久亚洲一区二区三区四区| 久久久久久久精| 久久综合精品国产一区二区三区| 久久久99国产精品免费| 久久国产免费| 久久久久久久国产| 免费黄网站欧美| 欧美第一黄色网| 欧美精品系列| 国产精品久久久一区二区| 国产精品伦子伦免费视频| 国产日韩欧美一区| 黄色精品免费| 亚洲国产成人精品女人久久久| 亚洲欧洲日本在线| 一区二区三区不卡视频在线观看 | 欧美与黑人午夜性猛交久久久| 欧美亚洲专区| 久久夜色精品国产亚洲aⅴ | 久久久久久尹人网香蕉| 久久夜色精品国产| 欧美电影免费观看高清| 欧美日韩免费观看一区=区三区| 国产精品成人观看视频国产奇米| 国产欧美精品一区二区色综合| 伊人久久亚洲美女图片| 亚洲激情在线观看视频免费| 中文久久精品| 久久久精品久久久久| 欧美成人黑人xx视频免费观看| 日韩午夜精品视频| 午夜久久资源| 欧美a级理论片| 国产精品免费电影| 在线看一区二区| 亚洲永久视频| 欧美r片在线| 亚洲性xxxx| 免费毛片一区二区三区久久久| 欧美日韩免费视频| 红桃视频国产一区| 亚洲一区二区在| 奶水喷射视频一区| 亚洲一区二区伦理| 欧美成年人在线观看| 国产精品天天摸av网| 91久久线看在观草草青青| 亚洲欧美自拍偷拍| 亚洲国产一成人久久精品| 西西人体一区二区| 欧美日韩精品一区二区| 激情婷婷欧美| 香蕉久久久久久久av网站| 91久久久久久久久| 久久久久久婷| 国产三级欧美三级日产三级99| 亚洲精品一区在线观看香蕉| 久久精品亚洲一区二区三区浴池| 亚洲精品日本| 免费在线亚洲欧美| 精品动漫3d一区二区三区| 亚洲永久免费| 99国内精品| 欧美精品一区二区三区一线天视频| 国产亚洲免费的视频看| 亚洲一区二区日本| 亚洲欧洲另类国产综合| 久久久久免费视频| 国产亚洲精久久久久久| 亚洲综合视频一区| 亚洲精品久久久久久久久久久久久| 久久婷婷亚洲| 伊人春色精品| 蜜桃伊人久久| 久久精品毛片| 狠狠色综合网| 久久天堂av综合合色| 午夜精品999| 国产欧美一二三区| 午夜久久一区| 亚洲一区网站| 国产精品无码专区在线观看| 亚洲在线一区二区| 亚洲一区二区少妇| 国产噜噜噜噜噜久久久久久久久| 亚洲伊人第一页| 亚洲男女毛片无遮挡| 国产日韩av一区二区| 久久精品论坛| 久久免费视频网站| 亚洲国内自拍| 亚洲人成人一区二区三区|