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

            朋友

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            精品久久久久久无码中文字幕| 婷婷久久综合九色综合98| 国产精品青草久久久久福利99 | 国产精品久久久久免费a∨| 欧洲性大片xxxxx久久久| 国产精品99久久久久久宅男小说 | 色天使久久综合网天天| 久久国产精品99国产精| 亚洲综合久久综合激情久久| 三级三级久久三级久久| 国产美女久久精品香蕉69| 久久国产一片免费观看| 亚洲AV无码成人网站久久精品大| 国产91久久综合| 亚洲精品无码久久一线| 国产午夜精品久久久久九九| 香蕉久久av一区二区三区| 久久男人中文字幕资源站| 久久夜色精品国产噜噜麻豆| 无码人妻少妇久久中文字幕| 久久天堂AV综合合色蜜桃网| 色婷婷久久综合中文久久一本| 热re99久久精品国99热| 色妞色综合久久夜夜| 久久久久亚洲爆乳少妇无| 成人久久综合网| 婷婷久久久亚洲欧洲日产国码AV | 久久精品人人做人人爽97| 久久99精品久久久大学生| 久久精品国产亚洲Aⅴ香蕉| 久久精品国内一区二区三区| 亚洲va中文字幕无码久久不卡| 精品久久久久成人码免费动漫| 久久精品国产精品亜洲毛片| 丰满少妇人妻久久久久久4| 99久久国产热无码精品免费久久久久| 亚洲av日韩精品久久久久久a| 精品人妻伦九区久久AAA片69| 久久笫一福利免费导航 | 精品国产福利久久久| 2021精品国产综合久久|