NOI Online2021第一場題解

2022-07-20 16:42:08 字數 1946 閱讀 9566

定義 $pop(n)$ 表示 n 二進位制下 1 的個數

可以發現 $b_n=pop(n)\bmod(2)$

考慮去掉模運算,$b_n=\frac(1-(-1)^)$

那麼可以有以下推導

可以將 n 二進位制拆分成若干段,具體地,對於乙個這樣的數 $(10110)_2$

可以拆分成這些段:

算算後發現複雜度是 $o(m^2\log n+m^3)$

通過打表發現或者歸納證明

當 $x>2^t$ 或者 $t>k$ 時,$f(x,t,k)=0$,所以 $f$ 的規模縮小到 o(m) 級別

複雜度 $o(m^3+\log n)$

考慮列舉 b 序列子區間,同時 a 陣列用乙個指標從左往右一路掃過去,複雜度 $o(n^2)$

關鍵在於如何子串判重,總共 $o(n^2)$ 個串需要 $o(1)$ 判重

手寫雜湊表即可,單模雜湊可能被卡,寫了個雙模

#include #include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define inf 3007

#define inf 0x7fffffff

#define ll long long

#define uint unsigned int template

inline

void read(i &num)

template

inline

void read(i &a, i &b)

template

inline

void read(i &a, i &b, i &c)

intn, ans;

char

s[inf], t[inf];

const

int p = 10025051

;const

int bp = 1019260817

;const

intbase = 127

;class

hashlist ;

int head[p + 2

]; listnode lst[p + 2

];

intindex;

inline

bool

insert(ll x)

else

lst[now].nxt = ++index;

lst[index].v =x;

return1;}}

};hashlist hl;

inline

void

setting()

signed main()

if(now > n) break

; hash1 = 1ll * (hash1 * base + t[r]) %bp;

hash2 = (hash2 * base +t[r]);

ans += hl.insert(1ll * hash2 * (1000000000) +hash1);}}

std::cout

<< ans << '\n'

;

return0;

}

遊記 NOI Online 2021 遊記

考前成功為自己攢夠了人品。指前幾天的模擬賽統統爆零 8 30 拿到題面 還好伺服器沒卡。一看三個題,都是 256mb,最後一題 2s,不開 o2 屑人吧!然後乙個乙個題看 t1 計數,沒啥思路,不過這個構造方式非常的格雷碼。t2 看起來非常可做,不過粗略看過去感覺題意不太清楚。t3 看就非常資料結構...

NOI Online 3 提高組 第一題 水壺

題目鏈結 其實這道題也不算是特別難,也跟普及組的題目的難度差不多。題目基本演算法 最大欄位和 字首和維護 由於水都是正數,我們能加多少就加多少,故我們必須要用完k kk次。而且我們要保證我們最後都能把所有水加到一杯水裡面去,所以題目就轉化成了求一段長度為k 1 k 1 k 1的最大子段和。inclu...

2021 BUAA OO第一單元總結

oo第一單元總結 第一次作業 一 題目要求 簡單多項式求導,僅支援常數與冪函式的乘積作為項,保證輸入無格式錯誤。二 作業實現及分析 由於第一次作業要求實現的功能並不複雜,且我當時對於物件導向的理解並不夠深入,所以我當時只是根據自己的想法構建了4個類來解決這個問題 類圖如下 關鍵類分析如下 strin...