• <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年9月>
            31123456
            78910111213
            14151617181920
            21222324252627
            2829301234
            567891011

            常用鏈接

            留言簿(8)

            隨筆分類

            隨筆檔案

            文章檔案

            相冊

            acmer

            online judge

            隊友

            技術

            朋友

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            久久丝袜精品中文字幕| 人人狠狠综合久久亚洲婷婷| 久久久久久青草大香综合精品| 久久99国产精品二区不卡| 国产99久久久国产精品~~牛| 无码超乳爆乳中文字幕久久 | 97精品国产97久久久久久免费 | 99久久伊人精品综合观看| 91精品免费久久久久久久久| 香蕉久久永久视频| 国内精品久久九九国产精品| 久久国产香蕉一区精品| 亚洲精品国产美女久久久| 久久天天躁狠狠躁夜夜av浪潮| 99精品国产99久久久久久97| 99久久精品免费观看国产| 久久精品中文字幕一区| 国内精品久久久久久久久| 99久久精品午夜一区二区| 精品伊人久久大线蕉色首页| 国产99久久久国产精免费| 国产情侣久久久久aⅴ免费| 区久久AAA片69亚洲| 久久国产视频网| 91精品国产高清久久久久久国产嫩草| 精品国产乱码久久久久软件| 久久久久久国产精品美女| 东京热TOKYO综合久久精品| 99久久国产宗和精品1上映| 人妻少妇精品久久| 久久久久国产视频电影| 国产精品免费久久久久久久久| 成人免费网站久久久| 久久99国产精品尤物| 精品国产乱码久久久久久郑州公司| 思思久久99热只有频精品66| 久久人人青草97香蕉| 久久久久久亚洲精品影院| 久久午夜夜伦鲁鲁片免费无码影视| 一本久道久久综合狠狠躁AV| 久久久久99这里有精品10|