acm香港網(wǎng)賽 D題 Curious Cupid

Problem D

Curious Cupid

There are K different languages in the world. Each person speaks one and only one language. There are exactly N single men and N single women.

Cupid, the god of love, wants to match every single man to a single woman, and vice versa. Everybody wants to find a partner who speaks the same language as s/he does. Communication between the couple is very important! Cupid asks these N men to stand in a line, and likewise for the N women. Cupid knows that the ith man speaks language ai and the ith woman speaks language bi.

It is too hard for Cupid to match all people at the same time. What Cupid does is to repeatedly look at some specific interval in these two lines, pick the men and women in that interval and find the maximum number of man-woman pairs who speak the same language and can be matched.

Input

  • The first line contains three integers N, M and K (1≤N≤50000,1≤M≤50000,1≤K≤1000000).
  • The second line contains N integers a0,a1,a2,…,aN?1, where ai (0≤ai<K) is the language spoken by the ith man.
  • The third line contains N integers b0,b1,b2,…,bN?1, where bi (0≤bi<K) is the language spoken by the ith woman.
  • In the next M lines, each line contains two integers L and R (0≤L≤R<N), representing the starting and ending index of the interval. That is, Cupid is looking at men L,L+1,…,R and women L,L+1,…,R.

Output

For each interval, print the maximum number of couples Cupid could match.

Sample Input 1

3 4 2
0 0 1
0 0 0
0 0
2 2
0 1
1 2

Sample output 1

1
0
2
1

莫隊(duì)算法描述

這里這里還有這里是一些資料载荔。我個(gè)人的理解是這樣的陪毡,給你一堆查詢(xún)區(qū)間,如果q(l,r)可以用q(l+/-n)(r+/-m)以O(shè)(n)復(fù)雜度推出來(lái),就可以用莫隊(duì)算法,所以實(shí)際上求的是每個(gè)(l,r)點(diǎn)的最小曼哈頓距離樹(shù)耸三,莫隊(duì)算法的處理是將這些點(diǎn)分塊排序拓轻,改變了查詢(xún)的順序旬盯,從而降低算法復(fù)雜度而钞。具體見(jiàn)上面的鏈接和代碼注釋沙廉。

題意

給你兩串?dāng)?shù),一串代表男的臼节,一串代表女的撬陵,每個(gè)數(shù)代表這個(gè)人說(shuō)的語(yǔ)言,現(xiàn)在要給一個(gè)區(qū)間[L,R]里面的人配對(duì)网缝,只有語(yǔ)言相同的才能配一對(duì)巨税,問(wèn)對(duì)于每個(gè)區(qū)間,最多能配成幾對(duì)粉臊。莫隊(duì)算法處理草添。

N:男人和女人的個(gè)數(shù)

M:查詢(xún)次數(shù)

K:語(yǔ)言總數(shù)

AC代碼

#include <cstdio>
#include <algorithm>
#include <cmath>

using namespace std;

#define N 51000
#define K 1000100

int n, m, k;
int a[N], b[N], pos[N], c[2][K], ans[N], cnt;

struct node {
    int l, r, id;
    void sc(int i){
        scanf("%d%d", &l, &r);
        id = i;                         //id 查詢(xún)的順序編號(hào)
    }                                   
}p[N];                                  // p數(shù)組存儲(chǔ)查詢(xún)
                                        
bool cmp(node a, node b) {              // 排序 塊的順序?yàn)榈谝魂P(guān)鍵字,r為第二關(guān)鍵字
    if(pos[a.l] == pos[b.l]) 
        return a.r < b.r;
    return pos[a.l] < pos[b.l];
}

void update(int x, int y) {  
  //每次update的時(shí)候更新某種語(yǔ)言人數(shù)扼仲,取男女中的較小值更新到答案中
    if(a[x] != b[x])     
  //男人女人語(yǔ)言不一樣 cnt減去男人和女人說(shuō)a[x]語(yǔ)言的最小值和男人和女人說(shuō)b[x]語(yǔ)言的最小值
        cnt -= min(c[0][a[x]], c[1][a[x]]) + min(c[0][b[x]], c[1][b[x]]); 
    else                 //男人女人語(yǔ)言一樣 cnt減去男人和女人說(shuō)a[x]語(yǔ)言的最小值
        cnt -= min(c[0][a[x]], c[1][a[x]]);
    c[0][a[x]] += y;    //更新語(yǔ)言數(shù)量
    c[1][b[x]] += y;
    if(a[x] != b[x])    //然后再加回去
        cnt += min(c[0][a[x]], c[1][a[x]]) + min(c[0][b[x]], c[1][b[x]]);
    else 
        cnt += min(c[0][a[x]], c[1][a[x]]);
}

/*
void pri() {  //輸出數(shù)組c 測(cè)試用函數(shù)
    for(int j = 0;j < 2;j++)
        for(int i = 0;i < n;i++)
            printf("%d%c", c[j][i], " \n"[i==n-1]);
}
*/

void solve() {
    memset(c, 0, sizeof(c));//c數(shù)組 0男人 1女人 c[0/1][x]為該性別說(shuō)x語(yǔ)言的人的數(shù)量
    int pl = 0, pr = 0;                                 
    cnt = a[0] == b[0] ? 1 : 0; 
  //cnt 計(jì)數(shù)變量 如果第0個(gè)男人和第0個(gè)女人說(shuō)的語(yǔ)言相同 cnt為1 否則為0
    c[0][a[0]]++;                       //說(shuō)a[0] b[0]語(yǔ)言的男人和女人數(shù)量 + 1
    c[1][b[0]]++;                                       
    for(int i = 0;i < m;i++) {                          //對(duì)查詢(xún)次數(shù)遍歷
        int id = p[i].id, l = p[i].l, r = p[i].r;       
      //第i次查詢(xún)的id l r(此時(shí)p數(shù)組已經(jīng)排序远寸,排序方法見(jiàn)cmp
        for(int j = pr + 1;j <= r;j++)      //從pr和pl開(kāi)始O(1)的推到r和l的查詢(xún)次數(shù)
            update(j, 1);
        for(int j = pr;j > r;j--)
            update(j, -1);
        for(int j = pl;j < l;j++)
            update(j, -1);
        for(int j = pl-1; j >= l;j--)
            update(j, 1);
        pr = r; pl = l;                     //然后把開(kāi)始的那個(gè)點(diǎn)更新為這個(gè)點(diǎn)
        ans[id] = cnt;                      //記錄ans的cnt
    }
    for(int i = 0;i < m;i++)                //以輸入的順序輸出答案
        printf("%d\n", ans[i]);
}

int main() {
    while(~scanf("%d%d%d", &n, &m, &k)) {   
      //輸入n 男人和女人的個(gè)數(shù) m 查詢(xún)次數(shù) k 語(yǔ)言總數(shù)
        for(int i = 0;i < n;i++)            //數(shù)組a[i] 第i個(gè)男人說(shuō)的語(yǔ)言
            scanf("%d", &a[i]);             
        for(int i = 0;i < n;i++)            //數(shù)組b[i] 第i個(gè)女人說(shuō)的語(yǔ)言
            scanf("%d", &b[i]);             
        int bk = sqrt(n + 1.0);             // bk 分塊的塊數(shù)
        for(int i = 0;i < n;i++)            
            pos[i] = i / bk;                // pos[i] 第i組 ?犀盟? 被分到第pos[i]塊
        for(int i = 0;i < m;i++)            
            p[i].sc(i);                     //輸入查詢(xún) 保存在node數(shù)組 p[i] 中
        sort(p, p+m, cmp);                  //為p排序
        solve();                            
    }                                       
    return 0;                               
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末而晒,一起剝皮案震驚了整個(gè)濱河市蝇狼,隨后出現(xiàn)的幾起案子阅畴,更是在濱河造成了極大的恐慌,老刑警劉巖迅耘,帶你破解...
    沈念sama閱讀 216,919評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贱枣,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡颤专,警方通過(guò)查閱死者的電腦和手機(jī)纽哥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)栖秕,“玉大人春塌,你說(shuō)我怎么就攤上這事〈睾矗” “怎么了只壳?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,316評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)暑塑。 經(jīng)常有香客問(wèn)我吼句,道長(zhǎng),這世上最難降的妖魔是什么事格? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,294評(píng)論 1 292
  • 正文 為了忘掉前任惕艳,我火速辦了婚禮搞隐,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘远搪。我一直安慰自己劣纲,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,318評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布谁鳍。 她就那樣靜靜地躺著味廊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪棠耕。 梳的紋絲不亂的頭發(fā)上余佛,一...
    開(kāi)封第一講書(shū)人閱讀 51,245評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音窍荧,去河邊找鬼辉巡。 笑死,一個(gè)胖子當(dāng)著我的面吹牛蕊退,可吹牛的內(nèi)容都是我干的郊楣。 我是一名探鬼主播,決...
    沈念sama閱讀 40,120評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼瓤荔,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼净蚤!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起输硝,我...
    開(kāi)封第一講書(shū)人閱讀 38,964評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤今瀑,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后点把,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體橘荠,經(jīng)...
    沈念sama閱讀 45,376評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,592評(píng)論 2 333
  • 正文 我和宋清朗相戀三年郎逃,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了哥童。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,764評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡褒翰,死狀恐怖贮懈,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情优训,我是刑警寧澤朵你,帶...
    沈念sama閱讀 35,460評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站型宙,受9級(jí)特大地震影響撬呢,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜妆兑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,070評(píng)論 3 327
  • 文/蒙蒙 一魂拦、第九天 我趴在偏房一處隱蔽的房頂上張望毛仪。 院中可真熱鬧,春花似錦芯勘、人聲如沸箱靴。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,697評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)衡怀。三九已至,卻和暖如春安疗,著一層夾襖步出監(jiān)牢的瞬間抛杨,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,846評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工荐类, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留怖现,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,819評(píng)論 2 370
  • 正文 我出身青樓玉罐,卻偏偏與公主長(zhǎng)得像屈嗤,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子吊输,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,665評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 晨昏交際 天如同死一般沉寂 灰色充斥著每一個(gè)角落 夾雜著微微冷雨 壓抑的氣氛讓人透不過(guò)氣 這沒(méi)有夕陽(yáng)的黃昏 是沒(méi)有...
    無(wú)盡De華爾茲閱讀 678評(píng)論 0 0
  • 對(duì)面的幾個(gè)青年嘴里叼著煙饶号,煙霧朦朧,將他們長(zhǎng)滿青春痘的臉藏了起來(lái)季蚂。時(shí)值冬日茫船,他們穿著單鞋和很薄的皮夾襖,褲子緊的像...
    趙覬覦閱讀 442評(píng)論 0 2
  • 我女兒有個(gè)很不好的習(xí)慣癣蟋,就是吃頭發(fā)透硝。 她總是在手空閑下來(lái)的時(shí)候狰闪,比如走路的時(shí)候疯搅,睡覺(jué)的時(shí)候,把自己的頭發(fā)一根一根地...
    于小魚(yú)歪歪閱讀 181評(píng)論 0 0
  • 假設(shè)你已經(jīng)了解 依賴(lài)注入 這一概念埋泵,只是在如何使用 Dagger 時(shí)遇到了一些困擾幔欧,因?yàn)?Dagger 其實(shí)是一個(gè)...
    iamwent閱讀 6,207評(píng)論 11 50
  • 廢話不多說(shuō),先上圖: 再看看代碼塊丽声; 樣式表: body { font: normal 11px auto "Tr...
    一個(gè)很近的地方閱讀 4,471評(píng)論 0 0