é”Œē›®ēš„é›£åŗ¦é”č‰²ä½æē”Ø Luogu äøŠēš„åˆ†ē“šļ¼Œē”±ē°”å–®åˆ°å›°é›£åˆ†åˆ„ē‚ŗ šŸ”“šŸŸ šŸŸ”šŸŸ¢šŸ”µšŸŸ£āš«ć€‚

šŸ”— P1314 [NOIP 2011 ęé«˜ē»„] čŖę˜Žēš„č“Øē›‘å‘˜

Problem Statement

é”Œē›®ē°”čæ°

給定 nn å€‹ē¤¦ēŸ³ļ¼ˆęÆå€‹ęœ‰é‡é‡čˆ‡åƒ¹å€¼ļ¼‰ä»„åŠ mm å€‹å€é–“ć€‚

選一個門檻 WWļ¼Œå°ęÆå€‹å€é–“ęŠŠć€Œé‡é‡ ≄W\ge Wć€ēš„ē¤¦ēŸ³ęŒ‘å‡ŗä¾†ļ¼Œä»¤č©²å€é–“ēš„ęŖ¢é©—å€¼ē‚ŗć€ŒęŒ‘å‡ŗę•øé‡ć€ä¹˜ä»„ć€ŒęŒ‘å‡ŗåƒ¹å€¼ēø½å’Œć€ļ¼Œå†ęŠŠę‰€ęœ‰å€é–“ēš„ęŖ¢é©—å€¼åŠ ēø½å¾—åˆ°ēø½ęŖ¢é©—ēµęžœ yy怂

ę±‚čƒ½č®“ ∣sāˆ’y∣|s-y| ęœ€å°ēš„å€¼ć€‚

Constraints

ē“„ęŸę¢ä»¶

  • 1≤n,m≤2Ɨ1051 \le n,m \le 2\times 10^5
  • 0<wi,vi≤1060 < w_i, v_i \le 10^6
  • 0<s≤10120 < s \le 10^{12}
  • 1≤li≤ri≤n1 \le l_i \le r_i \le n

ę€č·Æļ¼šäŗŒåˆ†ē­”ę”ˆ + å€é–“å‰ē¶“å’Œ

å…ˆęŠŠé”Œē›®ć€Œå›ŗå®š WW 時如何算 yyć€čˆ‡ć€Œč¦ę‰¾ęœ€ęŽ„čæ‘ ss ēš„ WW怍ꋆ開怂

å›ŗå®šé–€ęŖ» WWļ¼šå¦‚ä½•åæ«é€Ÿē®—ēø½ęŖ¢é©—ēµęžœ y(W)y(W)

å°ę–¼äø€å€‹å€é–“ļ¼ŒęŖ¢é©—å€¼ę˜Æļ¼š

(ē¬¦åˆč€…ę•øé‡)Ɨ(ē¬¦åˆč€…åƒ¹å€¼ēø½å’Œ)\text{(ē¬¦åˆč€…ę•øé‡)} \times \text{(ē¬¦åˆč€…åƒ¹å€¼ēø½å’Œ)}

å› ę­¤åœØęŽƒęē¤¦ēŸ³ę™‚ļ¼Œęˆ‘å€‘åŖé—œåæƒć€Œé‡é‡ę˜Æå¦č‡³å°‘ē‚ŗ WWć€ć€‚ęŠŠęÆå€‹ä½ē½®č½‰ęˆå…©å€‹åŗåˆ—ļ¼š

  • ęŒ‡ē¤ŗåŗåˆ—ļ¼šē¬¦åˆå‰‡ę˜Æ 11ļ¼Œå¦å‰‡ 00
  • åƒ¹å€¼åŗåˆ—ļ¼šē¬¦åˆå‰‡ę˜Æåƒ¹å€¼ļ¼Œå¦å‰‡ 00

å°é€™å…©å€‹åŗåˆ—å„åšäø€ę¬”å‰ē¶“å’Œļ¼Œå°±čƒ½åœØ O(1)\mathcal{O}(1) å–å‡ŗä»»ę„å€é–“ēš„ć€Œē¬¦åˆč€…ę•øé‡ć€čˆ‡ć€Œē¬¦åˆč€…åƒ¹å€¼ēø½å’Œć€ļ¼Œå†ē›øä¹˜äø¦ē“ÆåŠ ę‰€ęœ‰å€é–“ļ¼Œå¾—åˆ° y(W)y(W)怂

ē‚ŗä»€éŗ¼åŖč¦å…©å€‹å‰ē¶“å’Œå°±å¤ ļ¼Ÿ

å› ē‚ŗå€é–“å…§ęŖ¢é©—å€¼åŖä¾č³“ć€Œå…©å€‹åÆåŠ é‡ć€ļ¼šē¬¦åˆč€…ēš„å€‹ę•øčˆ‡ē¬¦åˆč€…åƒ¹å€¼å’Œļ¼›å®ƒå€‘éƒ½čƒ½ē”Øå‰ē¶“å’Œåšå€é–“ęŸ„č©¢ć€‚

ē‚ŗä»€éŗ¼åÆä»„äŗŒåˆ† WW

當門檻 WW č®Šå¤§ę™‚ļ¼Œē¬¦åˆć€Œé‡é‡č‡³å°‘ē‚ŗ WWć€ēš„ē¤¦ēŸ³åŖęœƒč®Šå°‘ć€äøęœƒč®Šå¤šć€‚
å› ę­¤ęÆå€‹å€é–“ēš„ć€Œē¬¦åˆč€…ę•øé‡ć€čˆ‡ć€Œē¬¦åˆč€…åƒ¹å€¼ēø½å’Œć€éƒ½ę˜ÆéšØ WW éžå¢žļ¼Œä¹˜ē©ä¹ŸéšØ WW éžå¢žļ¼›ēø½å’Œ y(W)y(W) åŒęØ£ę˜Æå–®čŖæäøå¢žć€‚

å–®čŖæę€§ę„å‘³č‘—ļ¼š

  • č‹„ęŸå€‹ WW 使得 y(W)≄sy(W) \ge sļ¼Œé‚£éŗ¼č¼ƒå°ēš„é–€ęŖ»ä¹Ÿęœƒę»æč¶³ ≄s\ge s
  • č‹„ęŸå€‹ WW 使得 y(W)<sy(W) < sļ¼Œé‚£éŗ¼č¼ƒå¤§ēš„é–€ęŖ»ä¹Ÿęœƒę»æč¶³ <s< s

ę‰€ä»„åÆä»„äŗŒåˆ†ę‰¾ć€Œå–®čŖæå‡½ę•øē©æč¶Š ss ēš„äŗ¤ē•Œé»žć€ļ¼Œå†åœØäŗ¤ē•Œå…©å“å„å–äø€ę¬”č·é›¢ć€‚

å¦‚ä½•ę‰¾å‡ŗčˆ‡ ss ęœ€ęŽ„čæ‘ēš„ęŖ¢é©—ēµęžœ

å› ē‚ŗēø½ęŖ¢é©—å€¼éšØé–€ęŖ»äøŠå‡č€Œå–®čŖæäøå¢žļ¼Œęœ€ęŽ„čæ‘ęØ™ęŗ–å€¼ēš„é»žäø€å®šå‡ŗē¾åœØå‡½ę•øå¾žå¤§ę–¼ē­‰ę–¼ ss č·Øč¶Šåˆ°å°ę–¼ ss ēš„äŗ¤ē•Œé™„čæ‘ć€‚

äŗŒåˆ†ęœå°‹ēµęŸå¾Œļ¼Œč‡Ŗē„¶ęœƒå¾—åˆ°å…©å€‹ē›øé„°ēš„å€™éøé–€ęŖ»ļ¼ˆåÆčƒ½ē›øå·® 1ļ¼Œęˆ–č½åœØé‚Šē•Œļ¼‰ć€‚åˆ†åˆ„čØˆē®—é€™å…©å€‹é–€ęŖ»å°ę‡‰ēš„ēø½ęŖ¢é©—å€¼ļ¼Œå–å‡ŗčˆ‡ ss å·®å€¼ēš„č¼ƒå°č€…å³åÆć€‚

é‚Šē•Œčˆ‡č¶Šē•Œ

č‹„é–€ęŖ»č¶…éŽę‰€ęœ‰ē¤¦ēŸ³é‡é‡ļ¼Œå‰‡ę‰€ęœ‰č²¢ē»ē‚ŗ 00ļ¼›č‹„é–€ęŖ»č¶³å¤ å°ļ¼Œå‰‡å¹¾ä¹Žå…Øéøę‰€ęœ‰ē¤¦ēŸ³ć€‚åæ…é ˆę­£ē¢ŗč™•ē†å·¦å³é‚Šē•Œęƒ…ę³ļ¼Œéæå…éŗę¼ęœ€å°å·®å€¼ć€‚

č¤‡é›œåŗ¦åˆ†ęž

  • ę™‚é–“č¤‡é›œåŗ¦ļ¼šO((n+m)log⁔(max⁔w))\mathcal{O}\big((n+m)\log(\max w)\big)
  • ē©ŗé–“č¤‡é›œåŗ¦ļ¼šO(n)\mathcal{O}(n)

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
def solve():
n, m, s = map(int, input().split()) # s 為標準檢驗值
items = [tuple(map(int, input().split())) for _ in range(n)]
queries = [tuple(map(int, input().split())) for _ in range(m)]

s_cnt = [0] * (n + 1)
s_sum = [0] * (n + 1)

def check(W):
"""å›ŗå®šé–€ęŖ» W ę™‚čØˆē®—ēø½ęŖ¢é©—å€¼ y"""
for i, (w, v) in enumerate(items, start=1):
s_cnt[i] = s_cnt[i - 1] + (1 if w >= W else 0)
s_sum[i] = s_sum[i - 1] + (v if w >= W else 0)
res = 0
for l, r in queries:
res += (s_cnt[r] - s_cnt[l - 1]) * (s_sum[r] - s_sum[l - 1])
return res

maxW = max(w for w, _ in items)
left, right = 0, maxW
while left <= right:
mid = (left + right) // 2
if check(mid) >= s: # y >= s ę™‚ęé«˜é–€ęŖ»ä»„é™ä½Žēø½ęŖ¢é©—å€¼
left = mid + 1
else:
right = mid - 1

# ęŖ¢ęŸ„äŗŒåˆ†ę”¶ę–‚å¾Œēš„å…©å€‹å€™éøé–€ęŖ»ļ¼Œå–čˆ‡ s å·®å€¼ēš„ęœ€å°å€¼
print(min(s - check(left), check(right) - s))


if __name__ == "__main__":
solve()