• <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

            其實很不好意思的說,這道題我的方法肯定不大好,非常的慢,需400多ms
            但是再怎么說也是好不容易寫出來的
            這道題的轉換方法很巧妙
            要不是上網搜出來的,我肯定不敢相信這是用并查集做
            主要是把區間化為單個數的想法來做
            這一點的處理我是用cube stacking同樣的想法來做的
            還有一點,離散化,這是基本上資料對這題的所要求的一點,這一點我不大懂
            這一題確實有個很大的特點,10億的數據,只有5000個操作
            離散化,還是要慢慢體會的
            這是我的代碼,很長,很繁瑣
            而且思路不是很清楚
            因為邊改邊想著做出來的

             1#include<iostream>
             2#include<string>
             3#include<map>
             4using namespace std;
             5typedef struct{
             6    int parent;
             7    //int rank;
             8    int on;//決定從根到該結點的1的個數是奇還是偶,奇則為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中,但是也有不同的情況,可能二者在同一個集合中
            41                                        //可能二者也不在同一個集合中,如果在的話就好辦了,直接驗證
            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}
            這是另外個代碼,還沒看懂
             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 閱讀(256) 評論(0)  編輯 收藏 引用
            歡迎光臨 我的白菜菜園

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

            常用鏈接

            留言簿(8)

            隨筆分類

            隨筆檔案

            文章檔案

            相冊

            acmer

            online judge

            隊友

            技術

            朋友

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            亚洲国产精品一区二区久久hs | 久久婷婷午色综合夜啪| 国内精品伊人久久久久av一坑 | 99精品国产99久久久久久97| 久久免费99精品国产自在现线| 国产亚洲美女精品久久久久狼| 日韩AV无码久久一区二区| 国产aⅴ激情无码久久| 99久久无色码中文字幕人妻| 日韩欧美亚洲综合久久| 狠狠色婷婷久久综合频道日韩| 久久久www免费人成精品| 久久久久久精品成人免费图片| 亚洲AV无码久久| 无码超乳爆乳中文字幕久久 | 久久亚洲2019中文字幕| 中文字幕精品久久久久人妻| 精品久久久久成人码免费动漫| 亚洲中文久久精品无码ww16| 久久久久人妻一区精品性色av| 国产一久久香蕉国产线看观看| 久久国产视屏| 久久99热这里只有精品66| 国内精品伊人久久久久av一坑| 日本免费一区二区久久人人澡| 人妻无码久久精品| 亚洲级αV无码毛片久久精品| 久久福利青草精品资源站免费 | 欧美粉嫩小泬久久久久久久| 一本久久a久久精品vr综合| 嫩草影院久久99| 综合久久国产九一剧情麻豆| 久久久久久a亚洲欧洲aⅴ| 99久久做夜夜爱天天做精品| 久久久噜噜噜久久熟女AA片| 精品久久久久久无码中文字幕| 无码AV波多野结衣久久| 久久久久久久久久免免费精品| 久久久久AV综合网成人| 亚洲国产成人精品无码久久久久久综合| 精品久久久无码21p发布|