• <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 閱讀(260) 評論(0)  編輯 收藏 引用
            歡迎光臨 我的白菜菜園

            <2025年8月>
            272829303112
            3456789
            10111213141516
            17181920212223
            24252627282930
            31123456

            常用鏈接

            留言簿(8)

            隨筆分類

            隨筆檔案

            文章檔案

            相冊

            acmer

            online judge

            隊友

            技術

            朋友

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            26uuu久久五月天| 亚洲精品美女久久777777| 美女写真久久影院| 亚洲午夜精品久久久久久浪潮| 久久综合偷偷噜噜噜色| 久久久久久久人妻无码中文字幕爆| 久久精品国产亚洲综合色| 久久久久人妻一区精品果冻| 久久精品国产AV一区二区三区 | 久久久久亚洲AV无码专区首JN | 一级做a爰片久久毛片看看| 欧美亚洲色综久久精品国产| 久久久久久无码国产精品中文字幕 | 婷婷五月深深久久精品| 久久久久99精品成人片三人毛片 | 久久天天躁狠狠躁夜夜不卡| 7777久久亚洲中文字幕| 亚洲精品无码久久毛片| 99久久精品无码一区二区毛片 | 性高朝久久久久久久久久| 69SEX久久精品国产麻豆| 日韩人妻无码一区二区三区久久99| 99久久99久久| 亚洲午夜久久久影院伊人| 久久亚洲欧洲国产综合| 99久久国产热无码精品免费| 久久亚洲国产精品成人AV秋霞| 国产亚州精品女人久久久久久 | 亚洲欧美日韩精品久久亚洲区 | 免费精品久久久久久中文字幕| 久久精品国产99国产精品澳门 | 久久水蜜桃亚洲av无码精品麻豆 | 天堂无码久久综合东京热| 国产成人久久精品二区三区| 国内精品久久久久影院日本| 久久九九精品99国产精品| 麻豆亚洲AV永久无码精品久久| 国产成人精品久久| 久久A级毛片免费观看| av午夜福利一片免费看久久| 久久青草国产精品一区|