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

šŸ”— P1496 火烧赤壁

Problem Statement

é”Œę„ę‘˜č¦

給你 nn å€‹ē‡ƒē‡’å€é–“ [a,b)[a, b)ļ¼Œč¦ä½ ę±‚å‡ŗę‰€ęœ‰ē‡ƒē‡’ä½ē½®ēš„ēø½é•·åŗ¦ļ¼Œä¹Ÿå°±ę˜Æé€™äŗ›åŠé–‹å€é–“ēš„čÆé›†é•·åŗ¦ć€‚

Constraints

č³‡ę–™ēÆ„åœ

  • 1≤n≤2Ɨ1041 \le n \le 2 \times 10^4
  • āˆ’231≤a<b<231-2^{31} \le a < b < 2^{31}
  • å€é–“ę˜Æå·¦é–‰å³é–‹ [a,b)[a, b)
  • ē­”ę”ˆå°ę–¼ 2312^{31}

ę€č·Æļ¼šå€é–“čÆé›†é•·åŗ¦

ę–¹ę³•äø€ļ¼šåˆä½µå€é–“ļ¼ˆč²Ŗåæƒ + ęŽ’åŗļ¼‰

é”Œę„ē‚ŗļ¼šēµ¦å¾ˆå¤šę®µ [a,b)[a,b)ļ¼Œå®ƒå€‘åÆčƒ½é‡ē–Šć€åÆčƒ½ē›øęŽ„ļ¼Œå•ć€Œåˆčµ·ä¾†ēø½å…±č¦†č“‹äŗ†å¤šé•·ć€ć€‚
é€™ę˜Æē¶“å…øēš„ 56. Merge Intervals å•é”Œć€‚

åÆä»„å…ˆęŽ’åŗļ¼Œē„¶å¾Œå¾žå·¦åˆ°å³ęŠŠčƒ½ęŽ„åœØäø€čµ·ēš„ę®µåˆä½µć€‚ęŽƒęę™‚åŖéœ€č¦čØ˜ä½ć€Œē›®å‰é€™äø€ę®µåˆä½µå¾Œēš„å³ē«Æé»žåœØå“Ŗć€ć€‚ē•¶ēœ‹åˆ°äø‹äø€ę®µēš„å·¦ē«Æé»žę™‚ļ¼š

  • å¦‚ęžœå®ƒåœØē›®å‰å³ē«Æé»žēš„å³é‚Šļ¼ŒčŖŖę˜Žå‰äø€ę®µēµęŸäŗ†ļ¼Œé–‹å§‹ę–°ę®µć€‚
  • å¦å‰‡å°±ę˜Æęœ‰é‡ē–Šęˆ–å‰›å„½ęŽ„äøŠļ¼ŒęŠŠå³ē«Æé»žę›“ę–°ęˆę›“å¤§ēš„é‚£å€‹ć€‚
ę­£ē¢ŗę€§č­‰ę˜Ž

å°‡ę‰€ęœ‰å€é–“ä¾å·¦ē«Æé»žęŽ’åŗå¾Œļ¼Œē”±å·¦åˆ°å³ęŽƒęļ¼Œē¶­č­·ć€Œē›®å‰åˆä½µå¾Œēš„č¦†č“‹ę®µć€ć€‚

  • äøč®Šé‡ļ¼šęŽƒęåˆ°ē¬¬ kk å€‹ęŽ’åŗå¾Œå€é–“ę™‚ļ¼Œć€Œē›®å‰åˆä½µå¾Œēš„č¦†č“‹ę®µć€ę°å„½ē­‰ę–¼å‰ kk å€‹å€é–“ēš„čÆé›†ļ¼Œäø¦äø”é€™å€‹čÆé›†åÆä»„č”Øē¤ŗęˆč‹„å¹²å€‹äŗ’äøē›øäŗ¤äø”ä¾åŗęŽ’åˆ—ēš„å€é–“ļ¼›å…¶äø­ęœ€å¾Œäø€ę®µēš„å³ē«Æé»žļ¼Œå°±ę˜Æęˆ‘å€‘ē¶­č­·ēš„ć€Œē›®å‰å³ē«Æé»žć€ć€‚
  • åˆå§‹åŒ–ļ¼šē¬¬äø€å€‹å€é–“ē›“ęŽ„ęˆē‚ŗē›®å‰č¦†č“‹ę®µļ¼Œäøč®Šé‡ęˆē«‹ć€‚
  • ē¶­č­·ļ¼šč€ƒę…®äø‹äø€å€‹å€é–“ [l,r)[l,r):
    • č‹„ ll åœØē›®å‰å³ē«Æé»žå³å“ļ¼ˆl>Rl > Rļ¼‰ļ¼Œå‰‡å®ƒčˆ‡ę—¢ęœ‰čÆé›†å®Œå…Øåˆ†é›¢ļ¼ˆę³Øę„åŠé–‹å€é–“äø‹ļ¼Œl=Rl=R ä»£č”Øć€Œå‰›å„½ęŽ„äøŠć€ä»å±¬é€£ęˆäø€ę®µļ¼‰ļ¼Œå› ę­¤åæ…é ˆé–‹å•Ÿę–°ę®µć€‚ę­¤ę™‚čÆé›†č®Šęˆć€ŒčˆŠčÆé›† + ę–°å€é–“ć€ļ¼Œäøč®Šé‡ä»ęˆē«‹ć€‚
    • 否則 l≤Rl \le Rļ¼Œę–°å€é–“čˆ‡ęœ€å¾Œäø€ę®µęœ‰é‡ē–Šęˆ–ē›øęŽ„ļ¼ŒčÆé›†ēš„ęœ€å¾Œäø€ę®µęœƒå»¶ä¼øåˆ° max⁔(R,r)\max(R, r)ļ¼ŒåŖéœ€ęŠŠå³ē«Æé»žę›“ę–°ęˆč¼ƒå¤§č€…å³åÆļ¼›å…¶é¤˜å·²å®Œęˆēš„ę®µäøå—å½±éŸæļ¼Œäøč®Šé‡ä»ęˆē«‹ć€‚
  • ēµ‚ę­¢ļ¼šęŽƒęå®Œę‰€ęœ‰å€é–“å¾Œļ¼Œå¾—åˆ°ēš„č‹„å¹²ę®µå³ē‚ŗå…ØéƒØå€é–“ēš„čÆé›†åˆ†č§£ć€‚å› ē‚ŗå®ƒå€‘äŗ’äøé‡ē–Šļ¼Œēø½é•·åŗ¦ē­‰ę–¼å„ę®µé•·åŗ¦å’Œļ¼Œä¹Ÿå°±ę˜Æē­”ę”ˆć€‚

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

  • ę™‚é–“č¤‡é›œåŗ¦ļ¼šO(nlog⁔n)\mathcal{O}(n \log n)ļ¼ˆęŽ’åŗäø»å°Žļ¼Œå¾ŒēŗŒē·šę€§ęŽƒęåˆä½µļ¼‰
  • ē©ŗé–“č¤‡é›œåŗ¦ļ¼šO(n)\mathcal{O}(n)ļ¼ˆęŽ’åŗå¾Œå­˜ę”¾å€é–“ļ¼›č‹„åŽŸåœ°ęŽ’åŗäø¦åŖē¶­č­·ē›®å‰ę®µļ¼Œé”å¤–å·„ä½œē©ŗé–“åÆč¦–ä½œ O(1)\mathcal{O}(1))

ę–¹ę³•äŗŒļ¼šé›¢ę•£åŒ–ēµåˆå·®åˆ†é™£åˆ—ļ¼ˆę•øē·šęŽƒęę€ē¶­ļ¼‰

é™¤äŗ†åˆä½µļ¼Œä¹ŸåÆä»„ę›å€‹ęƒ³ę³•ļ¼šęŠŠę•“ę¢ę•øē·šåˆ‡ęˆå¾ˆå¤šå·¦é–‰å³é–‹ēš„å°ę®µ [xi,xi+1)[x_i, x_{i+1})ļ¼Œåˆ¤ę–·ęÆå°ę®µć€Œęœ‰ę²’ęœ‰č¢«č“‹åˆ°ć€ļ¼ŒęŠŠęœ‰č¢«č“‹åˆ°ēš„å°ę®µé•·åŗ¦åŠ ēø½ć€‚

ē‚ŗä»€éŗ¼åÆä»„åˆ‡ęˆå°ę®µä¾†åˆ¤ę–·č¦†č“‹ļ¼Ÿé€™ęØ£åšēš„ę­£ē¢ŗę€§ä¾ę“šę˜Æä»€éŗ¼ļ¼Ÿ

å› ē‚ŗē‹€ę…‹åŖęœƒåœØć€ŒęŸę®µēš„čµ·é»žęˆ–ēµ‚é»žć€ę”¹č®Šļ¼Œå› ę­¤å°ę–¼ęÆå€‹å°ę®µå…§éƒØä¾†čŖŖļ¼Œē‹€ę…‹ę˜Æäø€ęØ£ēš„ć€‚åŖęœ‰åÆčƒ½ę˜Æć€Œę•“ę®µéƒ½č¢«č“‹åˆ°ć€ęˆ–ć€Œę•“ę®µéƒ½ę²’č¢«č“‹åˆ°ć€ļ¼Œäøęœƒå‡ŗē¾ć€ŒåŠę®µč¢«č“‹åˆ°ć€åŠę®µę²’č¢«č“‹åˆ°ć€ēš„ęƒ…ę³ć€‚

ē‚ŗä»€éŗ¼č¦åˆ‡ęˆć€Œå·¦é–‰å³é–‹ [xi,xi+1)[x_i, x_{i+1})ć€ēš„å°ę®µļ¼Ÿ

é€™ę˜Æē‚ŗäŗ†č®“åˆ‡å‡ŗä¾†ēš„å°ę®µć€Œå½¼ę­¤ę²’ęœ‰é‡ē–Šć€ļ¼ŒēœåŽ»äŗ†äø€äŗ›éŗ»ē…©ēš„åˆ¤ę–·å•é”Œć€‚
åˆ‡ęˆå·¦é–‰å³é–‹å¾Œļ¼Œē›øé„°å…©ę®µåŖęœƒåœØē«Æé»žē¢°åˆ°ļ¼Œä½†ē«Æé»žäøē®—é€²å³é‚Šļ¼Œę‰€ä»„å…©ę®µäøé‡ē–Šļ¼ŒåŠ ēø½é•·åŗ¦äøęœƒé‡č¤‡ć€‚

åœØåˆ‡åˆ†ęˆč‹„å¹²å°ę®µå¾Œļ¼Œęˆ‘å€‘éœ€č¦äø€å€‹č¾¦ę³•ä¾†č™•ē†ć€Œå“Ŗäŗ›å°ę®µč¢«č“‹åˆ°ć€ļ¼Œé€™ē­‰åŒå°ę–¼äø€å€‹é€£ēŗŒēš„å€é–“åšåŠ ę³•ę“ä½œļ¼Œē›“ęŽ„ē¶­č­·ęœ‰ę•ˆēŽ‡å•é”Œļ¼ŒåÆä»„ä½æē”Øå·®åˆ†é™£åˆ—ä¾†ē¶­č­·ļ¼š

  • å°ęÆå€‹å€é–“ [a,b)[a,b),在 aa ēš„ä½ē½® +1ć€åœØ bb ēš„ä½ē½® -1ļ¼Œč”Øē¤ŗć€Œå¾žé€™č£”é–‹å§‹å¤šč“‹äø€å±¤ / åˆ°é€™č£”å°‘č“‹äø€å±¤ć€ć€‚
  • ęœ€å¾Œå°å·®åˆ†é™£åˆ—åšå‰ē¶“å’Œļ¼Œå°±čƒ½å¾—åˆ°ęÆå€‹å°ę®µē›®å‰č¢«č“‹äŗ†å¹¾å±¤ļ¼›åŖč¦å±¤ę•ø >0>0 å°±ä»£č”Øé€™ę®µč¢«č“‹åˆ°ć€‚
å·®åˆ†ęŠ€å·§ēš„ęœ¬č³Ŗå„Ŗå‹¢

å‚³ēµ±äøŠå·®åˆ†åøøē”Øę–¼é€£ēŗŒé™£åˆ—ć€‚ę­¤č™•é›–ē„¶åŗ§ęØ™äøé€£ēŗŒļ¼Œä½†é›¢ę•£åŒ–å¾Œēš„ē“¢å¼•č®“ęˆ‘å€‘čƒ½ē”Øäø€å€‹å°é™£åˆ—ä¾†ęØ”ę“¬ć€Œäŗ‹ä»¶ē™¼ē”Ÿé»žć€ļ¼Œå¾ŒēŗŒęŽƒęę™‚å†ęŠŠē›øé„°åŗ§ęØ™ēš„åÆ¦éš›č·é›¢é‚„åŽŸęˆč²¢ē»é•·åŗ¦ć€‚é€™ę˜Æå°‡ć€Œé€£ēŗŒę•øē·šå•é”Œć€å£“ēø®åˆ°ć€Œé›¢ę•£äŗ‹ä»¶é»žć€äøŠēš„ęØ™ęŗ–ęŠ€å·§ć€‚

å»¶ä¼øę€č€ƒ

å¦‚ęžœé”Œē›®ę”¹ęˆę±‚ć€Œč¢«č‡³å°‘č¦†č“‹å…©ę¬”ä»„äøŠēš„ēø½é•·åŗ¦ć€ļ¼Œč©²å¦‚ä½•äæ®ę”¹å·®åˆ†čˆ‡ęŽƒęēš„åˆ¤ę–·ę¢ä»¶ļ¼Ÿ

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

  • ę™‚é–“č¤‡é›œåŗ¦ļ¼šO(nlog⁔n)\mathcal{O}(n \log n)ļ¼ˆę”¶é›†čˆ‡ęŽ’åŗę‰€ęœ‰ē«Æé»žę˜Æäø»č¦ęˆęœ¬ļ¼Œå¾ŒēŗŒęŽƒęē‚ŗē·šę€§ļ¼‰
  • ē©ŗé–“č¤‡é›œåŗ¦ļ¼šO(n)\mathcal{O}(n)ļ¼ˆē«Æé»žé›†åˆć€é›¢ę•£ę˜ å°„č”Øä»„åŠå·®åˆ†é™£åˆ—ēš„å¤§å°ēš†čˆ‡ē«Æé»žę•øęˆę­£ęÆ”ļ¼‰

é”žä¼¼é”Œē›®


Code

ę–¹ę³•äø€ļ¼šåˆä½µå€é–“

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def solve():  #  Merge Interval
q = int(input())
intervals = [tuple(map(int, input().split())) for _ in range(q)]
intervals.sort()

merged = []
for l, r in intervals:
if not merged or l > merged[-1][1]:
merged.append([l, r])
else:
merged[-1][1] = max(merged[-1][1], r)

ans = sum(r - l for l, r in merged)
print(ans)

if __name__ == "__main__":
solve()

ę–¹ę³•äŗŒļ¼šé›¢ę•£åŒ– + 差分

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
from itertools import pairwise

def solve():
q = int(input())
queries = [tuple(map(int, input().split())) for _ in range(q)]

# é›¢ę•£åŒ–
Xs = set()
for l, r in queries: # [l, r)
Xs.add(l)
Xs.add(r)
Xs = sorted(Xs)
mp = {x: i for i, x in enumerate(Xs)}
m = len(Xs)

# 差分
diff = [0] * (m + 1)
for l, r in queries:
diff[mp[l]] += 1
diff[mp[r]] -= 1

ans = s = 0
for i, (a, b) in enumerate(pairwise(Xs)):
s += diff[i]
if s > 0:
ans += b - a

print(ans)

if __name__ == "__main__":
solve()