• <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>
            我叫張小黑
            張小黑的掙扎生活
            posts - 66,  comments - 109,  trackbacks - 0

            其實(shí)很不好意思的說,這道題我的方法肯定不大好,非常的慢,需400多ms
            但是再怎么說也是好不容易寫出來的
            這道題的轉(zhuǎn)換方法很巧妙
            要不是上網(wǎng)搜出來的,我肯定不敢相信這是用并查集做
            主要是把區(qū)間化為單個(gè)數(shù)的想法來做
            這一點(diǎn)的處理我是用cube stacking同樣的想法來做的
            還有一點(diǎn),離散化,這是基本上資料對這題的所要求的一點(diǎn),這一點(diǎn)我不大懂
            這一題確實(shí)有個(gè)很大的特點(diǎn),10億的數(shù)據(jù),只有5000個(gè)操作
            離散化,還是要慢慢體會的
            這是我的代碼,很長,很繁瑣
            而且思路不是很清楚
            因?yàn)檫吀倪呄胫龀鰜淼?/p>

             1#include<iostream>
             2#include<string>
             3#include<map>
             4using namespace std;
             5typedef struct{
             6    int parent;
             7    //int rank;
             8    int on;//決定從根到該結(jié)點(diǎn)的1的個(gè)數(shù)是奇還是偶,奇則為1,偶為0
             9}NODE;
            10typedef map<int,NODE> Mate;
            11typedef Mate::value_type value_type;
            12Mate Map;
            13int find_set(int x)
            14{
            15    int t=Map[x].parent;
            16    if(Map[x].parent!=x){
            17        Map[x].parent=find_set(Map[x].parent);
            18        Map[x].on=(Map[x].on+Map[t].on)%2;
            19    }
            20    return Map[x].parent;
            21}
            22void union_set(int x,int y,int c)
            23{
            24    Map[y].parent=x;
            25    Map[y].on=c;
            26}
            27int main()
            28{
            29    NODE *t;
            30    Mate::iterator xt,yt;
            31    int i,n,qus,x,y,ct,xp,yp,k;//xp表示x-1的祖先,yp表示y的祖先
            32    string condi;
            33    scanf("%d%d",&n,&qus);
            34    for(i=1;i<=qus;i++){
            35        cin>>x>>y>>condi;
            36        if(condi=="even")ct=0;
            37        else if(condi=="odd")ct=1;
            38        xt=Map.find(x-1);
            39        yt=Map.find(y);
            40        if(xt!=Map.end()&&yt!=Map.end()){//x-1,y都存在于Map中,但是也有不同的情況,可能二者在同一個(gè)集合中
            41                                        //可能二者也不在同一個(gè)集合中,如果在的話就好辦了,直接驗(yàn)證
            42                                        //如果不則要合并
            43            xp=find_set(x-1);//find 一次 就更新了x-1到根的路徑上的on值
            44            yp=find_set(y);//同上
            45            if(xp==yp){
            46                if((Map[y].on+Map[x-1].on)%2!=ct){
            47                printf("%d\n",i-1);
            48                break;}}
            49            k=(Map[x-1].on+ct+Map[y].on)%2;
            50            if(xp<yp)union_set(xp,yp,k);
            51            else union_set(yp,xp,k);
            52        }
            53        else if(xt!=Map.end()&&yt==Map.end()){//x-1在Map中,而y不在
            54            t=(NODE*)malloc(sizeof(NODE));
            55            Map.insert(value_type(y,*t));
            56            union_set(x-1,y,ct);
            57        }
            58        else if(xt==Map.end()&&yt!=Map.end()){//x-1不在Map中,而y在
            59            yp=find_set(y);
            60            t=(NODE*)malloc(sizeof(NODE));
            61            Map.insert(value_type(x-1,*t));
            62            union_set(yp,x-1,(ct+Map[y].on)%2);
            63        }
            64        else if(xt==Map.end()&&yt==Map.end()){//x-1和y都不在Map中
            65            t=(NODE*)malloc(sizeof(NODE));
            66            t->on=0;
            67            t->parent=x-1;
            68            Map.insert(value_type(x-1,*t));
            69            t=(NODE*)malloc(sizeof(NODE));
            70            Map.insert(value_type(y,*t));
            71            union_set(x-1,y,ct);
            72        }
            73    }
            74    if(i>qus)printf("%d\n",i-1);
            75    return 0;
            76}
            這是另外個(gè)代碼,還沒看懂
             1#include <stdio.h>
             2#include <map>
             3using namespace std;
             4
             5#define N 5001
             6int        x[N],    y[N], parent[N+N];
             7bool    odd[N],    parity[N+N];
             8
             9void swap( int &a, int &b) {
            10    int tmp=a; a=b; b=tmp;
            11}
            12
            13map<int,int> mmp;
            14
            15void unionab( int a, int b, bool e) {
            16    parent[a]=b;
            17    parity[a]=e;
            18}
            19
            20int findx( int x, bool &e) {
            21    int r=x;
            22    bool res=parity[x];
            23    while( parent[r]!=r) {
            24        r=parent[r];
            25        res ^=parity[r];
            26    }
            27    e=res;
            28    return r;
            29}
            30
            31bool check( int id) {
            32    int a=x[id], b=y[id];
            33    bool e=odd[id], ea, eb;
            34    int ra=findx(a, ea), rb=findx(b, eb);
            35    if( ra==rb) {
            36        if( ea^eb!=e)
            37            return false;
            38    }
            39    else 
            40        unionab( ra, rb, ea^eb^e);
            41    return true;
            42}
            43
            44int main() {
            45    int n, i, tmp, a,b, idx;
            46    char s[7];
            47    scanf("%d%d"&tmp, &n);
            48    for( i=1,idx=1; i<=n; i++) {
            49        scanf("%d%d%s"&a,&b,s);
            50        if(a>b) swap(a,b);
            51        --a;
            52        if(a<0) {    
            53            printf("1\n");
            54            return 0;
            55        }
            56        if( !mmp.count(a))    mmp[a]=idx++;
            57        if( !mmp.count(b))    mmp[b]=idx++;
            58        x[i]=mmp[a];    y[i]=mmp[b];
            59        odd[i]=(s[0]=='o');
            60    }
            61    for( i=1; i<=idx; i++) {
            62        parent[i]=i;  parity[i]=false;
            63    }
            64    for( i=1; i<=n; i++) {
            65        if( !check(i) )
            66            break;
            67    }
            68    printf("%d\n", i-1);
            69    return 0;
            70}
            71
            http://acm.pku.edu.cn/JudgeOnline/problem?id=1733
            posted on 2008-01-27 22:26 zoyi 閱讀(257) 評論(0)  編輯 收藏 引用

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


            歡迎光臨 我的白菜菜園

            <2008年1月>
            303112345
            6789101112
            13141516171819
            20212223242526
            272829303112
            3456789

            常用鏈接

            留言簿(8)

            隨筆分類

            隨筆檔案

            文章檔案

            相冊

            acmer

            online judge

            隊(duì)友

            技術(shù)

            朋友

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            精品国产青草久久久久福利| 色综合久久天天综线观看| 久久无码AV中文出轨人妻| 亚洲色欲久久久综合网| 国产精品久久久久影视不卡| 99久久精品无码一区二区毛片| 麻豆久久久9性大片| 国产精品久久久久久久久免费| 久久97久久97精品免视看| 久久精品国产亚洲AV忘忧草18| 久久精品无码专区免费东京热| 国产午夜福利精品久久| 久久毛片一区二区| 99久久精品免费看国产| 久久精品蜜芽亚洲国产AV| 人妻少妇精品久久| 久久久久久亚洲AV无码专区| 色婷婷久久久SWAG精品| 久久91精品国产91久久户| 热99RE久久精品这里都是精品免费| 青青草国产精品久久| 亚洲AV无码一区东京热久久| 久久久久99精品成人片牛牛影视| 成人免费网站久久久| 伊人久久大香线蕉av不卡| 久久亚洲中文字幕精品一区四| 国产精品久久久久国产A级| 99久久这里只精品国产免费| 国内精品久久久久久久coent| 91精品国产91久久综合| 久久亚洲AV成人出白浆无码国产| 久久久精品久久久久久 | 精品熟女少妇AV免费久久 | 中文字幕久久亚洲一区| 丁香五月综合久久激情| 久久精品www| 99国内精品久久久久久久| 国产精品99久久精品| 久久午夜电影网| 99热精品久久只有精品| 久久99久久无码毛片一区二区|