• <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
            題目大意:動物王國中有三類動物A,B,C,這三類動物的食物鏈構成了有趣的環形。A吃B, B吃C,C吃A。 
            現有N個動物,以1-N編號。每個動物都是A,B,C中的一種,但是我們并不知道它到底是哪一種。 
            有人用兩種說法對這N個動物所構成的食物鏈關系進行描述: 
            第一種說法是"1 X Y",表示X和Y是同類。 
            第二種說法是"2 X Y",表示X吃Y。 
            此人對N個動物,用上述兩種說法,一句接一句地說出K句話,這K句話有的是真的,有的是假的。當一句話滿足下列三條之一時,這句話就是假話,否則就是真話。 
            1) 當前的話與前面的某些真的話沖突,就是假話; 
            2) 當前的話中X或Y比N大,就是假話; 
            3) 當前的話表示X吃X,就是假話。 
            你的任務是根據給定的N(1 <= N <= 50,000)和K句話(0 <= K <= 100,000),輸出假話的總數。 
            題目分析;由于N和K很大,所以必須高效的維護動物之間的關系,并快速判斷是否殘生了矛盾,所以決定采用并查集。
            對于每只動物i創建3個元素i,i+N,i+2N,并用這3*N個元素創建并查集。這個并查集維護如下信息:
            i+xN表示“i屬于種類x”。
            并查集里的每一個組表示組內所有元素代表的都同時發生或不發生。
            同時,在合并之前先判斷合并是否會產生矛盾。
            #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 閱讀(310) 評論(0)  編輯 收藏 引用 所屬分類: 解題報告
            欧美黑人激情性久久| 久久精品国产精品青草| 亚洲?V乱码久久精品蜜桃| 国内精品久久久久影院老司| 色欲综合久久中文字幕网| 久久青青草原综合伊人| 久久久久久亚洲精品影院| 久久九九青青国产精品| 亚洲国产成人精品91久久久| MM131亚洲国产美女久久| 国产精品成人精品久久久| 久久国产劲爆AV内射—百度| 99精品久久久久久久婷婷| 久久精品国产亚洲AV影院| 国产—久久香蕉国产线看观看| 久久精品国产亚洲AV影院| 伊人丁香狠狠色综合久久| 国产精品久久新婚兰兰| 精品久久久久久久久久久久久久久| 看久久久久久a级毛片| 色狠狠久久综合网| 四虎影视久久久免费观看| 国产精品va久久久久久久| 精品久久久久久| 1000部精品久久久久久久久| 精品人妻伦九区久久AAA片69| 99久久精品免费国产大片| 亚洲香蕉网久久综合影视 | AAA级久久久精品无码区| 亚洲成色www久久网站夜月| 思思久久99热只有频精品66| 亚洲国产成人久久综合野外| 91精品国产色综久久| 品成人欧美大片久久国产欧美| 久久精品国产亚洲综合色 | 精品久久久久久无码中文字幕| 精品乱码久久久久久久| 91久久精品91久久性色| 久久人人爽人人爽人人AV| 三上悠亚久久精品| 99久久婷婷国产综合亚洲|