• <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>
            JulyRina's blog
            welcome to July Rina's blog
            posts - 22,comments - 1,trackbacks - 0
            題目大意:動(dòng)物王國(guó)中有三類動(dòng)物A,B,C,這三類動(dòng)物的食物鏈構(gòu)成了有趣的環(huán)形。A吃B, B吃C,C吃A。 
            現(xiàn)有N個(gè)動(dòng)物,以1-N編號(hào)。每個(gè)動(dòng)物都是A,B,C中的一種,但是我們并不知道它到底是哪一種。 
            有人用兩種說法對(duì)這N個(gè)動(dòng)物所構(gòu)成的食物鏈關(guān)系進(jìn)行描述: 
            第一種說法是"1 X Y",表示X和Y是同類。 
            第二種說法是"2 X Y",表示X吃Y。 
            此人對(duì)N個(gè)動(dòng)物,用上述兩種說法,一句接一句地說出K句話,這K句話有的是真的,有的是假的。當(dāng)一句話滿足下列三條之一時(shí),這句話就是假話,否則就是真話。 
            1) 當(dāng)前的話與前面的某些真的話沖突,就是假話; 
            2) 當(dāng)前的話中X或Y比N大,就是假話; 
            3) 當(dāng)前的話表示X吃X,就是假話。 
            你的任務(wù)是根據(jù)給定的N(1 <= N <= 50,000)和K句話(0 <= K <= 100,000),輸出假話的總數(shù)。 
            題目分析;由于N和K很大,所以必須高效的維護(hù)動(dòng)物之間的關(guān)系,并快速判斷是否殘生了矛盾,所以決定采用并查集。
            對(duì)于每只動(dòng)物i創(chuàng)建3個(gè)元素i,i+N,i+2N,并用這3*N個(gè)元素創(chuàng)建并查集。這個(gè)并查集維護(hù)如下信息:
            i+xN表示“i屬于種類x”。
            并查集里的每一個(gè)組表示組內(nèi)所有元素代表的都同時(shí)發(fā)生或不發(fā)生。
            同時(shí),在合并之前先判斷合并是否會(huì)產(chǎn)生矛盾。
            #include <cstdio>
            #include <iostream>
            using namespace std;

            const int maxn = 50050;

            int father[maxn*3], n, m, ans;

            void init() {
                for(int i=0;i<3*n;i++) father[i] = i;
            }
            int find(int x) {
                return x == father[x] ? x : father[x] = find(father[x]);
            }
            void unite(int x, int y) {
                int a = find(x) , b = find(y);
                father[a] = father[b] = father[x] = father[y] = min(a, b);
            }
            bool check(int d, int x, int y) {
                if(x >= n || y >= n || x < 0 || y < 0)
                    return false;
                if(d == 2 && x == y) 
                    return false;
                if(d == 1) {
                    if(find(x) == find(y+n) || find(x) == find(y+2*n))
                        return false;
                    unite(x, y);
                    unite(x+n, y+n);
                    unite(x+2*n, y+2*n);
                    return true;
                } else {
                    if(find(x) == find(y) || find(x) == find(y+2*n))
                        return false;
                    unite(x, y+n);
                    unite(x+n, y+2*n);
                    unite(x+2*n, y);
                    return true;
                }
            }
            int main() {
                scanf("%d%d" , &n, &m);
                init();
                ans = 0;
                for(int i=0;i<m;i++) {
                    int d, x, y;
                    scanf("%d%d%d", &d, &x, &y);
                    x --; y --;
                    if(check(d, x, y) == false)
                        ans ++;
                }
                printf("%d\n", ans);
                return 0;
            }
            posted on 2015-02-11 17:33 JulyRina 閱讀(287) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 解題報(bào)告
            久久久久99精品成人片三人毛片| 久久九色综合九色99伊人| 国产精品无码久久四虎| 久久九九久精品国产免费直播| 国产人久久人人人人爽| 手机看片久久高清国产日韩| 国产精品久久永久免费| 亚洲AV日韩精品久久久久久| 国产精品九九久久免费视频 | 99久久99这里只有免费费精品| 久久久免费精品re6| 亚洲精品国精品久久99热| 91精品国产综合久久婷婷| 久久男人AV资源网站| 久久久久夜夜夜精品国产| 久久精品无码专区免费青青| 国产精品免费久久久久影院| 亚洲国产精品一区二区久久hs| 久久亚洲国产精品123区| 7777久久亚洲中文字幕| 99久久综合国产精品免费| 国产精品成人久久久| 91精品国产高清久久久久久国产嫩草| 国产精品福利一区二区久久| 久久人人爽人人爽人人片av麻烦| 精品蜜臀久久久久99网站| 久久AV无码精品人妻糸列| 精品久久人人做人人爽综合| 久久无码一区二区三区少妇| 91视频国产91久久久| 色婷婷久久综合中文久久蜜桃av | 国产午夜福利精品久久| 久久国产精品77777| 久久亚洲精精品中文字幕| 99久久国产精品免费一区二区 | 国产三级久久久精品麻豆三级 | 久久人妻少妇嫩草AV蜜桃| 久久99精品久久久久久水蜜桃| 久久精品国内一区二区三区| 久久91精品综合国产首页| 99热都是精品久久久久久|