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

pku 2002

2009年7月18日 星期六

題目鏈接:PKU 2002 Squares

分類:哈希

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

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


只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


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

導(dǎo)航

統(tǒng)計

常用鏈接

留言簿(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>
            韩曰欧美视频免费观看| 欧美色欧美亚洲另类七区| 99re8这里有精品热视频免费| 久久av二区| 亚洲视频欧洲视频| 亚洲精品黄色| 在线看不卡av| 国产三级欧美三级| 欧美性色综合| 欧美激情bt| 免费在线欧美视频| 久久精品一区| 欧美在线视屏| 午夜欧美大片免费观看| 在线一区免费观看| 亚洲精品欧美在线| 亚洲国产欧美在线人成| 六月婷婷久久| 久久久久国产免费免费| 欧美有码视频| 欧美一区二区三区四区夜夜大片| 亚洲一区二区三区午夜| 在线综合亚洲欧美在线视频| 日韩午夜在线| 亚洲精品综合久久中文字幕| 亚洲国产第一页| 亚洲第一久久影院| 亚洲高清资源| 91久久精品国产| 91久久久久久| 亚洲欧洲一级| 99热精品在线| 一级日韩一区在线观看| 一本色道综合亚洲| 亚洲视频欧美在线| 亚洲免费婷婷| 欧美在线观看视频一区二区| 久久超碰97中文字幕| 欧美一区影院| 久久婷婷国产麻豆91天堂| 久久久噜噜噜久久中文字免| 理论片一区二区在线| 美女主播视频一区| 欧美激情精品久久久| 亚洲精品国产精品国自产观看| 91久久精品一区二区三区| 亚洲精品在线电影| 中文精品一区二区三区| 亚洲欧美日韩另类| 久久精品国产免费观看| 美女主播一区| 欧美日韩视频在线一区二区观看视频 | 99国产精品99久久久久久| 日韩手机在线导航| 亚洲一区二区日本| 欧美在线观看一区| 免费成人av| 欧美四级电影网站| 国产日产欧美精品| 亚洲高清不卡在线观看| 夜夜嗨av一区二区三区网页| 午夜精品999| 久久婷婷国产综合国色天香| 亚洲福利视频三区| 亚洲伊人久久综合| 久久综合成人精品亚洲另类欧美| 欧美日韩1区2区| 国产麻豆精品久久一二三| 一区在线播放视频| 在线午夜精品自拍| 久久人人爽人人爽| 亚洲日本久久| 亚洲综合大片69999| 免费短视频成人日韩| 欧美网站在线观看| 精品av久久707| 亚洲一区二区三区高清不卡| 久久嫩草精品久久久精品| 亚洲激情视频网| 亚洲欧美日韩国产成人精品影院| 久久亚洲春色中文字幕久久久| 欧美日韩国产精品自在自线| 国产婷婷色一区二区三区在线| 亚洲精品美女在线| 久久久久成人精品| 一区二区三区高清视频在线观看 | 136国产福利精品导航| 亚洲香蕉成视频在线观看| 美女国产一区| 亚洲在线1234| 欧美精品一区二区三区久久久竹菊| 国产欧美精品va在线观看| 日韩网站在线观看| 久久最新视频| 亚洲欧美在线磁力| 欧美日本韩国一区| 亚洲国产日韩在线| 久久精品主播| 亚洲一区二区在线播放| 欧美黑人国产人伦爽爽爽| 国内一区二区在线视频观看| 亚洲午夜久久久久久久久电影院| 亚洲成色最大综合在线| 欧美一区二区高清| 国产精品每日更新| 一区二区三区成人精品| 欧美国产大片| 久久影视精品| 好看的日韩视频| 欧美一区亚洲一区| 亚洲午夜久久久久久尤物| 欧美精品电影在线| 亚洲精品你懂的| 欧美韩日亚洲| 久久精品人人做人人综合| 国产乱理伦片在线观看夜一区| 亚洲视频在线观看视频| 亚洲精品视频在线| 欧美风情在线观看| 亚洲精品视频在线播放| 欧美黄色免费| 免费一级欧美片在线播放| 亚洲国产二区| 男人的天堂亚洲| 久久天天躁夜夜躁狠狠躁2022 | 亚洲亚洲精品在线观看 | 蜜桃精品一区二区三区| 欧美一级电影久久| 国产自产2019最新不卡| 久久国产视频网| 欧美在线观看日本一区| 国内成+人亚洲| 久久视频一区二区| 久久久久在线观看| 亚洲国产精品久久久久秋霞不卡| 农村妇女精品| 免费视频一区| 日韩一级片网址| 99精品久久免费看蜜臀剧情介绍| 欧美日韩国产首页| 亚洲自拍偷拍福利| 午夜视频在线观看一区二区三区| 国产亚洲精品久久飘花| 噜噜噜躁狠狠躁狠狠精品视频| 久久久福利视频| 亚洲精品美女在线| 99亚洲一区二区| 国产精品揄拍一区二区| 久久精选视频| 毛片基地黄久久久久久天堂| 亚洲精品欧美日韩| aa亚洲婷婷| 国产亚洲一区二区三区| 欧美国产日韩精品| 欧美日韩久久久久久| 亚洲欧美韩国| 久久九九99| 日韩亚洲国产欧美| 亚洲中字黄色| 亚洲高清免费在线| 一区二区三区欧美在线| 国产一区二区成人久久免费影院| 欧美成人精品影院| 欧美日韩亚洲系列| 久久久五月婷婷| 欧美理论在线| 久久久精品tv| 欧美日韩精品免费在线观看视频| 午夜国产精品视频免费体验区| 午夜在线a亚洲v天堂网2018| 亚洲激情在线激情| 亚洲视频一区二区在线观看| 极品少妇一区二区| 一区二区欧美视频| 精品动漫3d一区二区三区免费| 亚洲精品乱码久久久久久日本蜜臀 | 欧美成人按摩| 欧美一区在线直播| 欧美高清在线观看| 久久精品一本| 欧美少妇一区| 麻豆久久久9性大片| 欧美视频三区在线播放| 欧美成人69| 国产人成一区二区三区影院| 亚洲二区在线观看| 国产亚洲日本欧美韩国| 亚洲裸体俱乐部裸体舞表演av| 黑丝一区二区三区| 亚洲视频精选| 日韩一级欧洲| 久久手机精品视频| 久久精品99国产精品酒店日本| 欧美日韩国产综合视频在线| 久久久天天操| 国产精品一区二区欧美| 亚洲毛片在线免费观看| 一区福利视频| 性欧美办公室18xxxxhd| 亚洲女女女同性video|