不難發現,對於所有血量的隨從都存在的情況,詢問 [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 的怪物死亡。小豆使用一張 褻瀆 會獲得一定的分數,分數計算如下,在使用一張 ...