並查集 xcoj 1234 ZJTZYRC篩offer

來源:互聯網
上載者:User

1234: ZJTZYRC篩offer 時間限制: 5 Sec   記憶體限制: 128 MB
提交: 40   解決: 10
標籤 提交 統計 討論版
題目描述

ZJTZYRC同學作為牛頭沖最強就業戰鬥力,每天都會收到大量offer。 有一天ZJTZYRC同學決定篩選一下offer,就像hr篩簡曆一樣。 首先,ZJTZYRC同學把所有offer進行了一次排名,依次從1到n。 接著,ZJTZYRC同學根據各方面資訊,把某兩個offer同歸為兩者之中較高的排名。如果某個offer有相同排名的其他offer,那麼其他offer也會被歸入較高的排名。 注意該操作不會導致其餘offer排名變動。 偶爾,ZJTZYRC同學會想知道某個offer究竟被他排名到哪兒去了,偶爾也會想要知道,當前還剩下多少個排名等級。 偶爾,ZJTZYRC同學會腦袋抽風,把兩個相同等級的公司合并,此時無視該操作就行。 輸入

第一行一個n,表示有多少家公司的offer。 接下來n行,每行一個公司名稱,表示ZJTZYRC收到了這家公司的offer。保證公司名稱是唯一的。公司名稱的順序對應它的初始排名(1~n) 第n+1行一個數字m,表示ZJTZYRC同學進行了總共幾次操作。 接下來m行,每行表示一個操作。操作描述如下: "a 公司名a 公司名b":ZJTZYRC把這兩家公司合并。 "q 公司名":ZJTZYRC想要知道這家公司當前的排名。 "t":ZJTZYRC希望知道當前還有多少個排名等級 我們保證n<=10000,m<=20000,公司名稱是一串大寫字母開頭的英文字元(不包含任何空格在內的特殊字元) 輸出

對於每個q操作,輸出一行包含一個整數表示這家公司當前的排名。 對於每個t操作,輸出一行包含一個整數表示當前還有多少個排名等級。 範例輸入 5TencentHuaweiShanbeiBaiduAli7ta Baidu Huaweia Shanbei Alia Baidu Aliq Tencentq Baidut 範例輸出 5122 提交 統計 討論版









並查集與map聯用,比賽的時候腦子抽了......


#include<bits/stdc++.h>using namespace std;typedef long long LL;typedef long double LD;const double pi = acos(-1.0);/////////////////////////////// int par[10008];map<string, int>M;  int find(int u) {    if (u == par[u]) {        return u;    }    else {        return par[u] = find(par[u]);    }} void aunion (int a, int b) {    int x = find(a);    int y = find(b);     if (x<y) {        par[y] = x;    }    else{        par[x] = y;    }}   ///////////////////////////////int main(int argc, char**argv) {    //ios_base::sync_with_stdio(0); cin.tie(0);    //freopen("input.txt", "r", stdin);    //freopen("output.txt", "w", stdout);    ////////////////////////////     int n, m;    cin >> n;    for (int i = 1; i <= n; i++) {        string in;        cin >> in;        M[in] = i;    }     cin >> m;     for (int i = 1; i <= n; i++) {        par[i] = i;    }      while (m--) {        char sw[3];        scanf("%s",sw);                 if (sw[0] == 't') {            int ans = 0;             for (int i = 1; i <= n; i++) {                if (find(i) == i) {                    ans++;                }            }             printf("%d\n",ans);        }        if (sw[0] == 'a') {            string fr;            string se;            cin >> fr >> se;             int u = M[fr];            int v = M[se];             aunion(u, v);            }        if (sw[0] == 'q') {             string in;            cin >> in;             int u = M[in];             int ans = find(u);             printf("%d\n",ans);            }         }                 ////////////////////////////    //system("pause");    return 0; }//END /**************************************************************    Problem: 1234    User: 2015217298    Language: C++    Result: 正確    Time:4469 ms    Memory:2608 kb****************************************************************/



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.