查看: 2748|回復: 11
打印 上一主題 下一主題

20140819 暑訓 資料結構與演算法

  [複製鏈接]
  • TA的每日心情
    開心
    2014-8-14 16:02
  • 簽到天數: 1 天

    [LV.1]初來乍到

    12

    主題

    138

    帖子

    863

    積分

    高級會員

    Rank: 4

    積分
    863

    台南一中資訊社新手達陣

    跳轉到指定樓層
    樓主
    發表於 2014-8-18 14:42:07 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式

    趕快加入我們來參與討論吧!

    您需要 登錄 才可以下載或查看,沒有帳號?加入我們

    x
    本帖最後由 allenwhale 於 2014-12-16 03:03 編輯

    明天的投影片,有興趣可以先看看更新投影片錯誤
    遊客,如果您要查看本帖隱藏內容請回復

    [C++] 純文本查看 復制代碼
    #include <stdio.h>
    #define max(a,b) (a>b?a:b)
    int a[100010];
    struct seg
    {
            seg *L,*R;
            int l,r;
            int mx;
    };
    seg* build(int l,int r)
    {
            seg *tr;
            if(l==r)
            {
                    tr=new seg();
                    tr->l=tr->r=l;
                    tr->mx=a[l];
                    return tr;
            }
            int mid=(l+r)>>1;
            tr->L=build(l,mid);
            tr->R=build(mid+1,r);
            tr->l=l,tr->r=r;
            tr->mx=max(tr->L->mx,tr->R->mx);
            return tr;
    }
    
    int query(seg *tr,int l,int r)
    {
            if(tr->l==l&&tr->r==r)
            {
                    return tr->mx;
            }
            int mid=(l+r)>>1;
            if(r<=mid)return query(tr->L,l,r);
            else if(l>mid)return query(tr->R,l,r);
            else return max(query(tr->L,l,mid),query(tr->R,mid+1,r));
    }
    void modify(seg *tr,int idx,int v)
    {
            if(tr->l==idx&&tr->r==idx)
            {
                    tr->mx=v;
                    a[idx]=v;
                    return ;
            }
            int mid=(l+r)>>1;
            if(idx<=mid)modify(tr->L,idx,v);
            else modify(tr->R,idx,v);
    }
    KD Tree可以參考 比投影片裡詳細
    [C++] 純文本查看 復制代碼
    #include <stdio.h>
    #include <string.h>
    #include <algorithm>
    #include <queue>
    using namespace std;
    #define MAXD10
    #define MAXN 50010
    int dim=10;
    struct Node
    {
            int v[MAXD+1];
            int num;
            Node()
            {
                    num=-1;
                    memset(v,0,sizeof(v));
            }
            bool operator < (const Node& a)const
            {
                    return num<a.num;
            }
    }s[MAXN+1],s2[MAXN+1];
    struct KD_tree
    {
            KD_tree *ltree,*rtree;
            Node node;
            KD_tree(Node _n=Node())
            {
                    ltree=rtree=NULL;
                    node=_n;
            }
    };
    int cmpd;
    bool cmp(Node a,Node b)
    {
            return a.v[cmpd]<b.v[cmpd];
    }
    KD_tree* build(int l,int r,int d)
    {
            KD_tree *tr;
            if(l==r)
            {
                    tr=new KD_tree(s[l]);
                    return tr;
            }
            if(l>r)return NULL;
            cmpd=d;
            int mid=(l+r)>>1;
            nth_element(s+l,s+mid,s+r+1,cmp);
            tr=new KD_tree(s[mid]);
            tr->ltree=build(l,mid-1,(d+1)%dim);
            tr->rtree=build(mid+1,r,(d+1)%dim);
            return tr;
    }
    typedef pair<int,Node> pdn;
    priority_queue<pdn> pq;
    int max_dis=0x3f3f3f3f;
    void query(KD_tree *tr,int m,int d,Node L)
    {
            //printf("d = %d\n",d);
            Node tn=tr->node;
            int dis=0;
            //printf("count %d\n",tn.num+1);
            for(int i=0;i<dim;i++)
            {
                    dis+=(L.v[i]-tn.v[i])*(L.v[i]-tn.v[i]);
            }
            
            if(tn.num==L.num)dis=0x3f3f3f3f;
            //printf("dis = %d\n",dis);
            if(dis<max_dis)
            {
                    pq.push(make_pair(dis,tn));
                    if((int)pq.size()>m)
                    {
                            max_dis=pq.top().first;
                            pq.pop();
                    }
            }
            //printf("max_dis = %d\n",max_dis);
            if(L.v[d]<tn.v[d])
            {
                    if(tr->ltree)
                    {
                            query(tr->ltree,m,(d+1)%dim,L);
                    }
                    if(tr->rtree)
                    {
                            if((L.v[d]-tn.v[d])*(L.v[d]-tn.v[d])<=max_dis)
                                    query(tr->rtree,m,(d+1)%dim,L);
                    }
            }
            else
            {
                    if(tr->rtree)
                    {
                            query(tr->rtree,m,(d+1)%dim,L);
                    }
                    if(tr->ltree)
                    {
                            if((L.v[d]-tn.v[d])*(L.v[d]-tn.v[d])<=max_dis)
                                    query(tr->ltree,m,(d+1)%dim,L);
                    }
            }
    }
    




    回復

    使用道具 檢舉

  • TA的每日心情
    開心
    2015-6-17 11:50
  • 簽到天數: 177 天

    [LV.7]常住居民III

    15

    主題

    315

    帖子

    1437

    積分

    金牌會員

    Rank: 6Rank: 6

    積分
    1437

    新手達陣台南一中資訊社

    頭香
    發表於 2014-8-18 16:58:30 | 只看該作者
    本帖最後由 visitorIKC 於 2014-8-18 21:30 編輯

    Thanks for the presentation.

    點評

    你為甚麼要一直編輯這段回應啊?  發表於 2014-8-18 21:51
    目標:Taiwan Oranges-Integraled 2016 (TOI'16)台灣積分橘子。
    回復 支持 反對

    使用道具 檢舉

  • TA的每日心情
    開心
    2014-9-28 12:10
  • 簽到天數: 21 天

    [LV.4]偶爾看看III

    34

    主題

    181

    帖子

    776

    積分

    高級會員

    Rank: 4

    積分
    776

    程式設計達人 - 2014新手達陣

    3#
    發表於 2014-8-18 19:45:24 | 只看該作者
                             謝謝
    林宇翔
    回復 支持 反對

    使用道具 檢舉

  • TA的每日心情
    鬱悶
    2015-2-10 21:23
  • 簽到天數: 1 天

    [LV.1]初來乍到

    12

    主題

    69

    帖子

    779

    積分

    高級會員

    Rank: 4

    積分
    779

    台南一中資訊社

    4#
    發表於 2014-8-18 20:13:43 | 只看該作者
    回。謝~
    回復

    使用道具 檢舉

  • TA的每日心情
    開心
    2014-11-18 21:47
  • 簽到天數: 9 天

    [LV.3]偶爾看看II

    1

    主題

    40

    帖子

    343

    積分

    好好學生

    Rank: 3Rank: 3

    積分
    343

    程式設計達人 - 2014新手達陣台南一中資訊社

    5#
    發表於 2014-8-18 21:05:59 | 只看該作者
    謝謝
    來預習
    回復 支持 反對

    使用道具 檢舉

  • TA的每日心情
    哭哭
    2015-1-6 14:23
  • 簽到天數: 18 天

    [LV.4]偶爾看看III

    7

    主題

    92

    帖子

    152

    積分

    高一新生

    Rank: 2

    積分
    152

    程式設計達人 - 2014新手達陣台南一中資訊社

    6#
    發表於 2014-8-19 08:40:29 | 只看該作者
    回復

    使用道具 檢舉

  • TA的每日心情
    鬱悶
    2015-5-15 22:38
  • 簽到天數: 33 天

    [LV.5]常住居民I

    75

    主題

    302

    帖子

    766

    積分

    版主

    TFcis - 105 附設監工官

    Rank: 7Rank: 7Rank: 7

    積分
    766

    台南一中資訊社程式設計達人 - 2014

    7#
    發表於 2014-8-19 10:46:39 | 只看該作者
    ^
    OwO^
    |
    <這是個人簽名欄位>
    回復

    使用道具 檢舉

  • TA的每日心情
    鬱悶
    2015-5-15 22:38
  • 簽到天數: 33 天

    [LV.5]常住居民I

    75

    主題

    302

    帖子

    766

    積分

    版主

    TFcis - 105 附設監工官

    Rank: 7Rank: 7Rank: 7

    積分
    766

    台南一中資訊社程式設計達人 - 2014

    8#
    發表於 2014-8-19 10:46:40 | 只看該作者
       ^           ^
            OwO
    <這是個人簽名欄位>
    回復 支持 反對

    使用道具 檢舉

  • TA的每日心情
    開心
    2014-10-2 12:43
  • 簽到天數: 15 天

    [LV.4]偶爾看看III

    2

    主題

    21

    帖子

    301

    積分

    好好學生

    Rank: 3Rank: 3

    積分
    301

    台南一中資訊社程式設計達人 - 2014新手達陣

    9#
    發表於 2014-8-19 15:16:15 | 只看該作者
    謝謝
    回復

    使用道具 檢舉

  • TA的每日心情
    開心
    2015-4-12 10:09
  • 簽到天數: 137 天

    [LV.7]常住居民III

    142

    主題

    686

    帖子

    3559

    積分

    邁向天堂

    蘇多門

    Rank: 8Rank: 8

    積分
    3559

    新手達陣台南一中資訊社程式設計達人 - 2014

    10#
    發表於 2014-12-15 10:41:25 | 只看該作者
    本帖最後由 domen111 於 2014-12-15 22:47 編輯

    我今天終於AC Treap啦! (感動)
    可是怎麼覺得投影片裡面的code有bug? 還是只是我的寫法不同
    1. sz預設應該是1
    2. sz=SIZE(L)+SIZE(R)+1;
    3. mn=max(num,max(MAXNUM(L),MAXNUM(R)));

    蘇多門 domen111
    My Web: https://sites.google.com/site/domenprg/
    回復 支持 反對

    使用道具 檢舉

    您需要登錄後才可以回帖 登入 | 加入我們

    本版積分規則

    快速回覆 返回頂部 返回列表