日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[hdu5270]按位统计,容斥,归并

發(fā)布時(shí)間:2024/4/15 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [hdu5270]按位统计,容斥,归并 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題意:給兩個(gè)序列[a, a + n), [b, b + n),求所有數(shù)(ai + bj)的異或和,i,j∈[0,n)。

思路:這個(gè)題思路比較巧妙,不難但是難想到。BC上的題解講得非常清楚了,我就直接copy過來了吧

我們考慮兩個(gè)數(shù)AB。 為了描述方便,我們設(shè)[P]的值為:當(dāng)表達(dá)式P的值為真時(shí),[P]=1,否則[P]=0 我們現(xiàn)在考慮計(jì)算[(A+B)and(2i)>0] 首先我們將A,B都對2i+1取模,顯然這樣是不會(huì)影響答案的 則有一個(gè)十分顯然的等式: [(A+B)and(2i)>0]=[(A+B)(2i)]?[(A+B)(2i+1)]+[(A+B)(3?2i)] 這個(gè)式子相當(dāng)容易理解,這里不多述了 考慮每一位對答案的貢獻(xiàn)是獨(dú)立的,我們每一位分開做 于是現(xiàn)在問題變成了:給定數(shù)組A,B,求滿足Ai+Bjlimit的數(shù)對個(gè)數(shù) 我們可以將A,B排序后,直接O(n)計(jì)算即可 然而排序是O(nlogn)的,這樣總復(fù)雜度就是O(nlognlogA)了,無法通過此題 于是這里有個(gè)小技巧 我們從高位往低位做,現(xiàn)在我們要實(shí)現(xiàn)的是:將A中每個(gè)數(shù)對P取模后將A排序 我們發(fā)現(xiàn)A會(huì)被分成兩段,一段小于P,一段大于等于P,只有后面一段要取模,我們可以取模后直接將這兩段歸并,復(fù)雜度是O(n)的 時(shí)間復(fù)雜度:O(nlogA+nlogn)

?下面的代碼就是根據(jù)題解寫的,個(gè)人感覺也非常清晰了:


123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263#pragma?comment(linker,?"/STACK:10240000,10240000")#include?<iostream>#include?<cstdio>#include?<cstring>#include?<cstdlib>#include?<vector>#include?<algorithm>#include?<queue>using?namespace?std;const?int?maxn?=?1e5?+?7;int?n;long?long?a[maxn],?b[maxn];void?sort(long?long?*a,?long?long?md)?{????int?pos?=?n;????for?(int?i?=?0;?i?<?n;?i?++)?{????????if?(pos?==?n?&&?a[i]?>=?md)?pos?=?i;????????a[i]?=?a[i]?&?(md?-?1);????}????inplace_merge(a,?a?+?pos,?a?+?n);}bool?solve(long?long?limit)?{????long?long?ans?=?0;????int?that?=?n?-?1;????for?(int?i?=?0;?i?<?n;?i?++)?{????????while?(that?>=?0?&&?a[i]?+?b[that]?>=?limit)?that?--;????????ans?+=?n?-?1?-?that;????}????return?ans?&?1;}int?main()?{#ifndef?ONLINE_JUDGE????freopen("in.txt",?"r",?stdin);#endif?//?ONLINE_JUDGE????int?T,?cas?=?0;????cin?>>?T;????while?(T?--)?{????????cin?>>?n;????????for?(int?i?=?0;?i?<?n;?i?++)?{????????????scanf("%I64d",?a?+?i);????????}????????for?(int?i?=?0;?i?<?n;?i?++)?{????????????scanf("%I64d",?b?+?i);????????}????????sort(a,?a?+?n);????????sort(b,?b?+?n);????????long?long?ans?=?0;????????for?(int?i?=?61;?i?>=?0;?i?--)?{????????????sort(a,?(long?long)2?<<?i);????????????sort(b,?(long?long)2?<<?i);????????????long?long?res?=????????????????solve((long?long)1?<<?i)?^????????????????solve((long?long)2?<<?i)?^????????????????solve((long?long)3?<<?i);????????????ans?|=?res?<<?i;????????}????????printf("Case?#%d:?%I64d\n",?++?cas,?ans);????}????return?0;}

?

轉(zhuǎn)載于:https://www.cnblogs.com/jklongint/p/4576232.html

總結(jié)

以上是生活随笔為你收集整理的[hdu5270]按位统计,容斥,归并的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。