Code 7 教科書般的褻瀆

2021-10-06 13:18:02 字數 1827 閱讀 7344

不難發現,對於所有血量的隨從都存在的情況,詢問 [1,

m]

[1,m]

[1,m

] 的答案應為 o(n

logn

)o(nlogn)

o(nlog

n)級別。

考慮分別維護 f

if_i

fi​ ,表示 i

ii 點法術傷害的褻瀆造成傷害的次數。

對於 i≤o

(n

)i\leq o(\sqrt)

i≤o(n​

) ,顯然可以直接維護未出現的血量的 mex

mexme

x ,這裡血量指 ⌈xi

⌉\lceil\frac\rceil

⌈ix​⌉ 。

對於 i≥o

(n

)i\geq o(\sqrt)

i≥o(n​

) ,有 fi≤

o(n)

f_i\leq o(\sqrt)

fi​≤o(

n​) ,可以對各個血量維護未出現的法術傷害的集合。

由此,我們可以動態維護出 f

if_i

fi​ ,由於 f

if_i

fi​ 的總量不超過 o(n

logn

)o(nlogn)

o(nlog

n),用樹狀陣列維護其區間和,總的修改複雜度為 o(n

log2

n)

o(nlog^2n)

o(nlog

2n) ,詢問複雜度為 o(m

logn

)o(mlogn)

o(mlog

n)。時間複雜度 o(n

n+nl

og2n

+mlo

gn

)o(n\sqrt+nlog^2n+mlogn)

o(nn​+

nlog

2n+m

logn

) 。

#includeusing namespace std;

const int maxn = 1e5 + 5;

const int maxm = 1e6 + 5;

const int block = 405;

typedef long long ll;

template void chkmax(t &x, t y)

template void chkmin(t &x, t y)

template void read(t &x)

struct binaryindextree

void modify(int x, int d)

int query(int x)

int query(int l, int r)

} bit;

set a[maxn]; bool add[maxn];

bool vis[block][maxn]; int n, m, mex[maxn];

void update(int pos)

}int main()

for (int i = block + 1; i <= n + 1; i++)

for (int j = 1; j <= n / i + 3; j++)

a[j].insert(i);

for (int i = 1; i <= m; i++)

}int l = 0, r = n;

for (int j = 1; r > block; j++)

r = l - 1;

}} else

} return 0;

}

TJOI2018 教科書般的褻瀆

點此看題 首先問題可以轉化成求 i 1nim sum n i m i 1n im0x01 拉格朗日插值法 你會發現這就是板子,因為他是乙個m 1 m 1m 1次多項式,選m 2 m 2m 2個點插值就可以了。時間複雜度o m 3 o m 3 o m3 考試時候降智寫了o m 4 o m 4 o m4...

TJOI2018 教科書般的褻瀆

首先,認真讀題不難發現若血量的區間 1,m i 連續,則只需要一張褻瀆就可以殺死區間 1,m i 內所有怪物,所以 k m 1 考慮到這點,我們就可以輕鬆的寫出式子 保證 a i 公升序 定義 a 0 0 有 large ans sum limits left sum limits j sum li...

TJOI 2018 教科書般的褻瀆

題目描述 小豆喜歡玩遊戲,現在他在玩乙個遊戲遇到這樣的場面,每個怪的血量為 a i 且每個怪物血量均不相同,小豆手裡有無限張 褻瀆 褻瀆的效果是對所有的怪造成 1 點傷害,如果有怪死亡,則再次施放該法術。我們認為血量為 0 的怪物死亡。小豆使用一張 褻瀆 會獲得一定的分數,分數計算如下,在使用一張 ...