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

            hdu 3627 Giant For

               這個(gè)題是對(duì)可排序數(shù)據(jù)的實(shí)時(shí)增加刪除查找,那天做比賽的時(shí)候一點(diǎn)都不會(huì),想來(lái)想去覺(jué)得平衡樹(shù)可以做,但是寫(xiě)平衡樹(shù)是件很難的事情。
            后面知道線段數(shù)可以做,雖然數(shù)據(jù)的范圍很大,但是可以在全部讀入數(shù)據(jù)后排序再離散化,然后進(jìn)行線段樹(shù)的操作,具體的代碼沒(méi)有寫(xiě)。
               今天隊(duì)友在網(wǎng)上發(fā)現(xiàn)一種用map和set可以水掉這題的方法。原來(lái),這個(gè)方法最主要的使用了map和set里面的upper_bound操作,以前
            居然忘記了這個(gè)東西了。既然這樣,map和set也可以查前驅(qū)和后繼了,但是注意low_bound查到的是小于等于的鍵。這個(gè)代碼,注意是用
            了一個(gè)map< int, set<int> > 集合把坐標(biāo)都存起來(lái)了,進(jìn)行添加刪除和查找后繼的操作。由于查找需要查找的元素是既比x大又比y大的元
            素,就比較麻煩,需要循環(huán)x往后查找,但是這樣就無(wú)情的超時(shí)了。然后,有一個(gè)優(yōu)化,記錄y的數(shù)目,那么當(dāng)出現(xiàn)很大的y的時(shí)候,就不需要
            查找了,然后才過(guò)了這個(gè)題。但是,數(shù)據(jù)變成很大的y對(duì)應(yīng)的x很小的話,那么絕對(duì)過(guò)不了這個(gè)題了,只能用線段樹(shù)做了。
               現(xiàn)在覺(jué)得用map和set查找前驅(qū)和后繼確實(shí)能水掉一些題啊。

               代碼如下:
            #include <map>
            #include <set>
            #include <stdio.h>
            using namespace std;

            map< intset<int> > ms;//存儲(chǔ)x,y
            map< intset<int> >::iterator it;
            map<intint> my;//存儲(chǔ)y的數(shù)目
            set<int>::iterator msit;
            int main()
            {
                int nN;
                int nCase = 1;
                char szCmd[10];
                int nX, nY;
                int nTemp;

                while(scanf("%d", &nN), nN)
                {
                    if (nCase > 1)
                    {
                        printf("\n");
                    }
                    
                    printf("Case %d:\n", nCase++);
                    ms.clear();
                    my.clear();
                    while (nN--)
                    {
                        scanf("%s", szCmd);
                        scanf("%d%d", &nX, &nY);
                        if (szCmd[0] == 'a')
                        {
                            if (my.find(nY) == my.end())
                            {
                                my[nY] = 1;
                            }
                            else
                            {
                                my[nY]++;
                            }
                            
                            if (ms.find(nX) == ms.end())
                            {
                                ms[nX].insert(nY);
                            }
                            else
                            {
                                msit = ms[nX].find(nY);
                                if (msit == ms[nX].end())//會(huì)出現(xiàn)重復(fù)的數(shù)據(jù)
                                {
                                    ms[nX].insert(nY);
                                }
                            }
                        }
                        else if (szCmd[0] == 'r')
                        {
                            ms[nX].erase(nY);
                            if(ms[nX].size() == 0)
                            {
                                ms.erase(nX);
                            }
                            my[nY]--;
                            if (my[nY] == 0)
                            {
                                my.erase(nY);
                            }
                        }
                        else if (szCmd[0] == 'f')
                        {
                            if (my.upper_bound(nY) == my.end())
                            {
                                printf("-1\n");
                                continue;
                            }
                            while (true)
                            {
                                it = ms.upper_bound(nX);
                                if (it == ms.end())//比nX大的不存在
                                {
                                    printf("-1\n");
                                    break;
                                }
                                nTemp = it->first;
                                msit = ms[nTemp].upper_bound(nY);
                                if (msit == ms[nTemp].end())//比nY大的不存在
                                {
                                    nX = nTemp;
                                    continue;//那么增加x,繼續(xù)往后查
                                }
                                else
                                {
                                    printf("%d %d\n", nTemp, *msit);
                                    break;
                                }
                            }
                        }
                    }
                }

                return 0;
            }

            posted on 2012-07-26 12:22 yx 閱讀(892) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 數(shù)據(jù)結(jié)構(gòu)

            <2012年7月>
            24252627282930
            1234567
            891011121314
            15161718192021
            22232425262728
            2930311234

            導(dǎo)航

            統(tǒng)計(jì)

            公告

            常用鏈接

            留言簿(3)

            隨筆分類

            隨筆檔案

            me

            好友

            同學(xué)

            網(wǎng)友

            搜索

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            超级碰久久免费公开视频| 久久伊人五月天论坛| 久久久久亚洲av无码专区喷水| 欧美亚洲国产精品久久| 午夜精品久久久久久毛片| 国产精品久久午夜夜伦鲁鲁| 亚洲国产精品久久久久| 久久久久久久91精品免费观看| 色欲久久久天天天综合网精品 | 久久婷婷五月综合色高清| 蜜桃麻豆www久久| 久久精品青青草原伊人| 久久精品国产亚洲综合色| 亚洲国产成人久久综合一区77| 久久天天躁狠狠躁夜夜96流白浆| 99久久精品国产一区二区三区| 思思久久99热只有频精品66| 亚洲国产精品婷婷久久| 久久精品中文字幕无码绿巨人| 久久嫩草影院免费看夜色| 97久久超碰成人精品网站| 欧美精品乱码99久久蜜桃| 国产无套内射久久久国产| 97超级碰碰碰久久久久| 中文字幕日本人妻久久久免费| 香蕉99久久国产综合精品宅男自 | 99久久中文字幕| 久久精品国产99国产精品亚洲| 国产精品嫩草影院久久| 久久99国产精一区二区三区| 亚洲精品乱码久久久久久按摩 | 日产精品99久久久久久| 无码任你躁久久久久久老妇App| 国产精品成人99久久久久 | 99久久夜色精品国产网站| 国产人久久人人人人爽 | 久久精品国产只有精品66 | 久久精品无码专区免费东京热| 国产aⅴ激情无码久久| 蜜桃麻豆WWW久久囤产精品| 久久精品中文字幕大胸|