Day1 A 數對子 找規律

2021-08-22 11:41:03 字數 1569 閱讀 5953

懶得粘題面了…..

我最開始打了三個小時的表,發現了一件神奇的事情:[1

,k] [1,

k]內的「好的」數對的數量是有規律可循的(這個規律極其複雜)!所以每個區間內的「好的」數對的數量就是a[

ri]−

a[li

−1] a[r

i]−a

[li−

1],然後我就愉快地切過此題啦!

這當然是很*****的錯解。乙個數對如果橫跨兩個區間,那怎麼減?

打表留念:

當把某一位上的1異或掉的時候,1的總個數會減少2個。

如果要得到奇數個1,那麼x和y的1的總個數加起來必須是奇數,這樣無論抵消掉多少個1,最後的答案中1的個數也是奇數。所以x,y中只要乙個是奇數,乙個是偶數就可以滿足要求。

打表可得:當

k k

為奇數的時候,[1

,k]' role="presentation">[1,

k][1

,k]內有奇數個

1 1

的數字個數為(k

+1)/

2' role="presentation">(k+

1)/2

(k+1

)/2;當

k k

為偶數時,[1

,k−1

]' role="presentation">[1,

k−1]

[1,k

−1]內的奇數個數為k/

2 k/2

,再特判一下

k k

即可。最後線段樹維護區間的並,查詢時只用查詢1號線段的答案。

注意被完全覆蓋過的線段要做標記。

**

#include

#include

#define n 4001000

#define ll long long

using

namespace

std;

ll bitcnt(ll x)

ll find(ll x)

ll odd[n],even[n],lson[n<<4],rson[n<<4],tot;

void add(ll p,ll x,ll y)

bool mark[n];

void ins(ll &p,ll l,ll r,ll x,ll y)

ll mid=l+r>>1ll;

ins(lson[p],l,mid,x,y);

ins(rson[p],mid+1,r,x,y);

odd[p]=odd[lson[p]]+odd[rson[p]];

even[p]=even[lson[p]]+even[rson[p]];

}int main()

return

0;}

奧數 找規律 總結

時間限制 1 sec 記憶體限制 128 mb 提交 78 解決 3 提交 狀態 討論版 輸入兩個正整數a,b 1 求在a與b之間的所有正整數 含a,b 中數字d出現的次數 第一行乙個數t 1 t 10000 接下來 t 行每行由 a b d 三個數組成 輸出這組資料a與b之間所有正整數中數字d出現...

劍指offer 醜數(找規律)

把只包含質因子2 3和5的數稱作醜數 ugly number 例如6 8都是醜數,但14不是,因為它包含質因子7。習慣上我們把1當做是第乙個醜數。求按從小到大的順序的第n個醜數。醜數的序列為 每個醜數都是前面某乙個醜數乘上2 3 5的結果。所以新加入的醜數必然是從原有醜數中與2,3,5乘積中最小的值...

hdu 5047 大數找規律

找規律信kuangbin,能ac include include include include include include include include include include include include using namespace std 完全大數模板 輸出cin a 輸出...