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

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)一點,就是如果給你一個正方形的兩個對角線點的坐標,則根據(jù)正方形的特點,一定可以算出另外的兩點的坐標,利用這一點,這道題目基本就可以hash了,具體做法是,先將讀入的n個點的坐標按照其x坐標作為關(guān)鍵值進行hash,然后像1971一樣枚舉每兩個不同的點,將他們作為某個正方形的對角線,算出兩外的兩個點,然后對于新算出的兩個點的x坐標進行hash查找,對于x相同的點,判斷y是否也相同,若相同,則繼續(xù)hash另一個點的坐標,若兩次都能找到則正方形個數(shù)加1。在哈希判斷時若找到相同的則直接退出本次查找,否則一直查找到鏈表的末尾,表示沒有以該兩點作為對角線的正方形。
       
算法2:這道題目還可以不用哈希,直接用二分來查找,同算法一,也是先枚舉每兩個點,根據(jù)公式算出另外的兩個點,不過,直接用二分來查找這兩個點是否存在,當然了,事先需要對輸入的坐標排個序,先按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函數(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>
            欧美一区二区| 伊人久久大香线蕉综合热线| 午夜精品一区二区三区电影天堂| 亚洲欧洲一区| 亚洲国产mv| 亚洲精品国产系列| 一区二区欧美日韩视频| 亚洲小视频在线| 性18欧美另类| 老鸭窝91久久精品色噜噜导演| 久久综合五月天婷婷伊人| 欧美 日韩 国产一区二区在线视频| 麻豆乱码国产一区二区三区| 欧美剧在线免费观看网站| 国产精品户外野外| 国一区二区在线观看| 亚洲欧洲午夜| 亚洲欧美在线高清| 欧美成人资源| 亚洲免费中文字幕| 欧美**字幕| 国产欧美亚洲视频| 亚洲麻豆视频| 久久亚洲精选| 一区二区动漫| 久久精品动漫| 欧美日韩在线不卡一区| 国语对白精品一区二区| 亚洲永久在线| 欧美国产先锋| 欧美在线免费播放| 欧美日韩在线播放三区| 亚洲国产电影| 欧美综合77777色婷婷| 亚洲国产欧美一区| 亚洲欧美另类久久久精品2019| 蜜臀a∨国产成人精品| 国产精品人成在线观看免费| 亚洲美洲欧洲综合国产一区| 久久久综合网站| 亚洲在线视频免费观看| 欧美日韩日本视频| 在线观看日韩国产| 欧美在线网址| 亚洲自拍偷拍色片视频| 欧美片在线观看| 亚洲国产日韩综合一区| 久久久夜色精品亚洲| 亚洲女同在线| 国产精品免费小视频| 欧美亚洲不卡| 亚洲精品网址在线观看| 久久一日本道色综合久久| 国产精品亚洲激情| 亚洲午夜羞羞片| 亚洲精品久久久久久久久久久| 久久久五月婷婷| 国产亚洲一区在线播放| 欧美伊人久久久久久久久影院| 一本一本久久a久久精品综合妖精| 欧美丰满少妇xxxbbb| 亚洲黄色在线看| 欧美国产成人在线| 久久午夜电影| 亚洲第一精品夜夜躁人人爽| 久久久夜夜夜| 久久久久久亚洲精品中文字幕| 国产一区视频观看| 久久视频精品在线| 久久女同互慰一区二区三区| 有码中文亚洲精品| 亚洲欧洲精品一区二区| 欧美激情导航| 亚洲综合电影| 欧美一区二区私人影院日本 | 久久全国免费视频| 影音先锋另类| 亚洲国产精品一区二区www| 欧美大片在线看免费观看| 亚洲精品网站在线播放gif| 亚洲理伦电影| 国产一区视频在线看| 亚洲福利视频免费观看| 欧美日韩精品一区二区| 欧美在线电影| 毛片基地黄久久久久久天堂| 一本大道久久精品懂色aⅴ| 国产精品99久久久久久人| 国产情侣久久| 亚洲福利国产精品| 国产精品久久久久久久久免费樱桃 | 国产麻豆91精品| 麻豆精品一区二区综合av| 欧美电影在线播放| 欧美亚洲一区在线| 欧美激情精品久久久久| 欧美在线免费观看| 久久亚洲视频| 亚洲欧美成人| 久久影院亚洲| 校园春色综合网| 欧美成人一区二区三区在线观看| 亚洲女ⅴideoshd黑人| 久久综合图片| 欧美一区免费| 欧美激情在线有限公司| 久久久久9999亚洲精品| 中日韩美女免费视频网址在线观看 | 亚洲永久网站| 免播放器亚洲| 欧美一区二区高清在线观看| 欧美成人a视频| 久久久亚洲高清| 国产精品萝li| 宅男在线国产精品| 亚洲乱码国产乱码精品精| 久久精品二区亚洲w码| 欧美一级黄色网| 国产精品av免费在线观看| 亚洲国产日韩欧美一区二区三区| 国产视频一区二区在线观看| 一区二区三区日韩在线观看| 日韩视频免费观看高清完整版| 久久青草欧美一区二区三区| 久久精品综合一区| 国产视频久久网| 亚洲欧美久久| 欧美一区二区三区在线看| 午夜精品一区二区在线观看| 一色屋精品视频在线看| 欧美视频免费看| 久久久水蜜桃| 亚洲欧美日韩国产中文在线| 亚洲免费av电影| 欧美.com| 蜜臀久久99精品久久久画质超高清| 亚洲性夜色噜噜噜7777| 亚洲精品中文字幕在线| 亚洲视频综合| 久久久精品国产免费观看同学| 午夜精品美女自拍福到在线| 欧美精品日韩精品| 亚洲精品精选| 一本大道久久a久久精品综合 | 91久久久久久| 亚洲区一区二区三区| 欧美成人精品1314www| 亚洲国产成人不卡| 在线中文字幕一区| 国产精品sm| 亚洲欧美亚洲| 免费久久99精品国产| 亚洲国产成人精品久久| 欧美国产日本韩| 一区二区三区四区五区精品视频| 亚洲永久精品国产| 狠狠久久综合婷婷不卡| 蜜桃精品一区二区三区| 亚洲日本va午夜在线电影| 亚洲免费在线| 激情成人中文字幕| 欧美激情一二三区| 欧美精品一区二区三区在线播放| 亚洲小说欧美另类婷婷| 国产精品女主播| 久久国产精品色婷婷| 亚洲国产欧美一区二区三区久久| 中国成人黄色视屏| 好看的日韩av电影| 欧美精品一区二区三区一线天视频 | 欧美性做爰猛烈叫床潮| 午夜精品久久久久影视| 欧美1区3d| 亚洲欧美国产高清| 91久久精品国产| 国产欧美亚洲一区| 亚洲国产精品欧美一二99| 午夜精品久久久久久久久 | 影音先锋久久久| 亚洲欧美日本国产专区一区| 欧美成人黑人xx视频免费观看| 夜夜精品视频| 欧美激情网站在线观看| 亚洲国产合集| 亚洲福利专区| 久久久久91| 亚洲激情专区| 国产精品色午夜在线观看| 久久一区免费| 午夜影院日韩| 日韩小视频在线观看| 欧美成人午夜激情视频| 久久国产精品久久久久久久久久 | 亚洲你懂的在线视频| 亚洲区欧美区| 欧美成人免费全部观看天天性色| 欧美在线观看一区二区| 亚洲一区视频| 亚洲天堂成人在线观看| 亚洲精一区二区三区|