æè¡æ¬éšã®æŸæ¬ã§ãããã©ã«ã·ã¢ã§ã¯ã2019幎æ°åã®åŠçã察象ã«ãã¯ãŒã¯ã·ã§ãããäŒç€Ÿèª¬æäŒã宿œããŠããŸãããšã³ãžãã¢å¿æè
åãã®ã¯ãŒã¯ã·ã§ããã§ã¯ãèšå€§ãã€è€éãªããŒã¿ããé«éã«æé©è§£ãå°ãç¬èªã®ãé«éæ€çŽ¢æè¡ãããããã°ã©ãã³ã°ã®å®è·µã亀ããªããåŠã¹ãããã°ã©ã ãçšæããŠããŸãã æ¬æ¥ã¯ç¹å¥ã«ã4æ24æ¥ïŒç«ïŒã«éå±±ã§éå¬ãããšã³ãžãã¢ã¯ãŒã¯ã·ã§ããã§åºé¡ããåé¡ã解説ããŸãã åé¡ Level1 Level2 Level3 ãŸãšã ä»åŸã®ã¯ãŒã¯ã·ã§ããã®ãæ¡å
åé¡ ããã§ã¯ãå®éã«åºé¡ããåé¡ãèŠãŠãããŸãããã å顿 N人ã®èº«é· h_i ãšQåã®è³ªåã¯ãšãªãäžããããŸãã å質åã¯ãšãªã¯ã (h_min_j, h_max_j) ã®2èŠçŽ ã§æ§æãããŸãã ãã®ãšããããããã®ã¯ãšãªã«ã€ã㊠h_min_j <= h_i <= h_max_j ãæºãã人æ°ãçããªããã â»èº«é·ãã¯ãšãªã¯ãã¹ãп޿°ã§ããã å
¥å å
¥åã¯æšæºå
¥åãã以äžã®åœ¢åŒã§äžãããããïŒãâã以éã¯æ³šéã§ãïŒ N Q â ãã®ããšèº«é·ã®ããŒã¿ãNåãæ¬¡ãã§ã¯ãšãªãQåå
¥åããã h_1 â 1çªç®ã®èº«é· ïž h_N â Nçªç®ã®èº«é· h_min_1 h_max_1 â 1çªç®ã®ã¯ãšãª ïž h_min_Q h_max_Q åºå åã¯ãšãªã«å¯ŸããŠçããšãªãå€ãæŽæ°ã§åºåããã Sample Input 0 3 1 4 9 5 3 5 Sample Output 0 2 Explanation 0 3人ã®èº«é· 4,9,5 ãšã¯ãšãª (3, 5) ãäžããããŸãã身é·ã3以äž5以äžã®äººã¯1çªç®(4)ãš3çªç®(5)ã®2人ã§ãããããã£ãŠã¯ãšãª (3, 5) ã«å¯ŸããŠåºåãã¹ãå€ã¯2ã§ãã Sample Input 1 5 2 2 3 4 4 4 1 1 4 4 Sample Output 1 0 3 Explanation 1 身é·ã1以äž1以äžã®äººã¯0人ã§ãã身é·ã4以äž4以äžã®äººã¯3人ã§ãã Sample Input 2 6 2 10 2 5 6 10 8 6 7 1 9 Sample Output 2 1 4 Explanation 2 身é·ã6以äž7以äžã®äººã¯1人ã§ãã身é·ã1以äž9以äžã®äººã¯4人ã§ãã Level 1 äžèšã®åé¡èšå®ã«å
·äœçãªå¶çŽïŒå
¥åã®å€åïŒãäžããŠãåã¬ãã«ã®åé¡ãèŠãŠãããããšæããŸãããŸãéåžžã«å€ã®å°ããåé¡ãèããŸãã å¶çŽ(Level1) 1 <= N <= 10 1 <= Q <= 10 1 <= h_i <= 10 1 <= h_min_j <= h_max_j <= 10 ãã®åé¡ã解決ããåçŽãªããã°ã©ã ãå®è£
ããŸãã å
šå¡ã®èº«é·ãé
åã«æ ŒçŽãã å質åã«ã€ããŠå人ã®èº«é·ãç¯å²å
ã«åãŸã£ãŠããããå€å®ãã æ¡ä»¶ã«åœãŠã¯ãŸã人æ°ãçããŸãã äžèšãPython3ã®å®è£
äŸã§ãã Python:Level1å®è£
äŸ N, Q = map(int, input().split()) P = [] for i in range(N): h = int(input()) P.append(h) # å質åããšã« for i in range(Q): h_min, h_max = map(int, input().split()) count = 0 # å人ã®èº«é·ãå€å®ãã for p in P: if h_min <= p <= h_max: count += 1 print(count) äžèšã¢ã«ãŽãªãºã ã®èšç®éã¯Qåã®ã«ãŒã(8è¡ç®)ã®äžã«Nåã®ã«ãŒã(13è¡ç®)ãå
¥ã£ãŠãããã O(QN) ã«ãªããŸããæå
ã®ç°å¢ã§å®è¡ããŠã¿ããš0.1ç§ä»¥äžã§åºåãè¿ã£ãŠããŸãã Level2 å¶çŽ(Level2) 1 <= N <= 10,000 = 10**4 1 <= Q <= 10,000 = 10**4 1 <= h_i <= 10,000 = 10**4 1 <= h_min_j <= h_max_j <= 10,000 = 10**4 Level2ã§ã¯ããããã®å€ã1000åã«ãªããŸããLevel1ã§å®è£
ããããã°ã©ã ã§ã¯ãçããåºããŸã§ã«çŽ8ç§ã®æéãå¿
èŠã«ãªããŸãã Level1ã§å®è£
ããããã°ã©ã ã®ã©ãã«æéãããã£ãŠããããèããŸãããã2éã«ãŒãã«ãã£ãŠåèš Q * N åã身é·ã®æ¯èŒãè¡ãããŠããŸãã å®éã«èªåããã®äœæ¥ãè¡ããšããããšèããŠã¿ããšã身é·ãæããã«ç¯å²ããå€ããŠãã人ã«ã¯äœåºŠã質åããªãã§ãããã 質åããšã«å人ã®èº«é·ãå€å®ããã¢ã«ãŽãªãºã 㯠"æ¯åãå
šå¡ãã®èº«é·ã確ãããå¿
èŠããã" ç¹ãéå¹çã§ãã ããã§ã¯ãã©ãããã° "ãå
šå¡ãã«å¯ŸããŠã®å€å®" ãé¿ããããããèããŠã¿ãŸãããã ãLevel2ã®ãã€ã³ãã æ°ããã®ã§ã¯ãªããèšç®ããã äžé以äžã®äººæ°ããäžéã«æºããªã人æ°ãåŒãããšã§æ¡ä»¶ãæºãã人æ°ãèšç®ããããšãã§ããŸãã åŠæ ¡ã®å€§æé€ã§ã12çªãã16çªã®5人ã¯çªæãïŒãã®ãããªã·ãŒã³ããããŸããã§ãããïŒ äºåã«ãœãŒãããŠããã ãœãŒããããŠãããšããã®ã¯åŒ·ãæ§è³ªã§ãæé ã«ãœãŒããããŠããŠãiçªç®ã®äººãäžéæªæºã®å Žåãi-1çªç®ä»¥äžã®äººãäžéæªæºã§ããããšãæããã§ãã ãããã®ãã€ã³ãããµãŸãããšãåé¡ã¯æ¬¡ã®ããã«èšãæããããŸãã ãåé¡ã®èšãæãã ãœãŒããããé
åããäžéæªæºã®æåŸã®äººãäžé以äžã®æåŸã®äººãèŠã€ãããã ããã§ã泚æãããç¹ããããŸããåããé çªã«èŠãŠãããšãæ¢ããŠãã人ãé
åã®åŸãã®æ¹ã«ããå Žåãçµå±ã»ãŒãã¹ãŠã®äººã®èº«é·ã確èªããããšã«ãªããŸãã ãã£ãšå¹çè¯ãèšç®ããããã«ãäœäººããããã¯ã¢ããããŠè³ªåãããããšæããŸãã åºæ¬æ
å ±æè¡è
詊éšãå匷ããŠãã人ãæ
å ±ç³»ã®äººãªãèããããšããããããããŸãããã "çãäžã®äººããèããŠè§£ã®ååšç©ºéãååã«ãã" ãšããèãæ¹ããããŸãã ãã㯠"äºåæ¢çŽ¢" ãšåŒã°ããæ¢çŽ¢ã¢ã«ãŽãªãºã ã®äžã€ã§ãä»åã®åé¡èšå®ãšçžæ§ãè¯ããããäºåæ¢çŽ¢ã䜿ã£ãŠã¿ãŸãããã äºåæ¢çŽ¢ã䜿çšããŠããœãŒããããé
åããããå€T以äžã®æåã®äººã®ã€ã³ããã¯ã¹ããæ¢ããŸãã P ã身é·ãæé ã«ãœãŒããããé
åãé
å P äžã§èº«é· T 以äžã®æåã®äººã®ã€ã³ããã¯ã¹ãæ¢ããšããŠèª¬æãé²ããŸãã P[lb] < T <= P[ub] (â»)ãæºããããã« lb, ub ãåæåããŸãããã®æ¡ä»¶ãä¿ã¡ãªããæŽæ°ããããšãäºåæ¢çŽ¢ã®ãã€ã³ãã§ãã m = (lb+ub)//2 (å¹³åã®å°æ°ç¹ä»¥äžåæš)ãšã㊠P[m] < T â lb = m , T <= P[m] â ub = m ãšè§£ã®ååšç¯å²ãæŽæ°ããŸãã lb+1 == ub ãæãç«ã€ãšãã(â»)ã®æ¡ä»¶ãã ub ããããããå€T以äžã®æåã®äººã®ã€ã³ããã¯ã¹ãã§ããããšãåãããŸãã äŸãšããŠäžèšã®å
¥åãäžãããããšãã身é·ãh_min=3以äžã®æåã®äººã®ã€ã³ããã¯ã¹ãæ±ããŸãã N = 12 H = {1, 2, 2, 4, 4, 5, 6, 6, 7, 7, 7, 10} h_min=3, h_max=6 P[0]=1 < T=3 ã§ããããšã確èªããäžã§ã lb=0, ub=len(P)=12 ã§åæåããŸããâ»é
åäžã«T以äžã®å€ããªãå Žåã¯Pã®èŠçŽ æ°(=12)ãè¿ããŸãã m = (lb+ub)//2=(0+11)//2=5 ãšãªããŸãã P[m]=P[5]=6 >= T=3 ãªã®ã§ ub = m=5 ã«æŽæ°ããŸãã m = (lb+ub)//2=(0+5)//2=2 ãšãªããŸãã P[m]=P[2]=2 < T=3 ãªã®ã§ lb = m=2 ã«æŽæ°ããŸãã m = (lb+ub)//2=(2+5)//2=3 ãšãªããŸãã P[m]=P[3]=4 >= T=3 ãªã®ã§ ub = m=3 ã«æŽæ°ããŸãã lb+1 == ub ãæãç«ã¡ãã身é·ãh_min=3以äžã®æåã®äººã®ã€ã³ããã¯ã¹ã㯠ub=3 ã§ããããšãåãããŸãã åŠçã®æµããåãã£ããšããã§ãå®è£
ãããŠã¿ãŸãã Python:Level2å®è£
äŸ """ ãœãŒãããŠäºåæ¢çŽ¢ """ import bisect N, Q = map(int, input().split(" ")) P = [] for i in range(N): h = int(input()) P.append(h) # O( N*logN ) P.sort() # O( Q*logN ) for i in range(Q): h_min, h_max = map(int, input().split()) count = 0 lower = bisect.bisect_left(P, h_min) upper = bisect.bisect_left(P, h_max + 1) print(upper - lower) æšæºã©ã€ãã©ãªã䜿ã£ãŠããäºåæ¢çŽ¢éšåãæžãäžããšãããªããŸãã """ äºåæ¢çŽ¢ """ def bisect_left(array, target): if target <= array[0]: return 0 lb = 0 ub = len(array) while lb + 1 < ub: m = (lb + ub) // 2 if target <= array[m]: ub = m else: lb = m return ub äºããœãŒãããæéã¯ããããã®ã®ã1åãœãŒãããŠããã ãã§ãQåã®ã¯ãšãªåŠçã«ãããæéã倧å¹
ã«ççž®ããããšãåºæ¥ãŸããäºåã«N人ã®èº«é·ããœãŒãããèšç®éã O(NlogN) ãQåã®ã¯ãšãªããããã«å¯ŸããŠãäºéšæ¢çŽ¢ãè¡ãèšç®éãO(QlogN)ã§ãåèšã®èšç®é㯠O(NlogN) + O(QlogN) ã«ãªããŸãã Level3 Level3ã§ã¯å¶çŽãæŽã«10åã«ããåé¡ãèããŸãã å¶çŽ(Level3) 1 <= N <= 100,000 = 10**5 1 <= Q <= 100,000 = 10**5 1 <= h_i <= 100,000 = 10**5 1 <= h_min_j <= h_max_j <= 100,000 = 10**5 Level2ã§ãé«éã«æ€çŽ¢ã§ããŠã¯ããŸããããŸã ç¡é§ãªéšåããããŸãã1åã®ã¯ãšãªãåŠçãããšãã«2åã®äºåæ¢çŽ¢ãå®è¡ããååŸã®å¢çãšãªãäººãæ¢ãäœæ¥ãããŠããŸããä»åã®åé¡èšå®ã§ã¯å
·äœçãªäººãç¹å®ããå¿
èŠã¯ãªãã人æ°ã ãã«çç®ããã°ååã§ããæ
å ±ã®æã¡æ¹ãå€ããŠãå身é·ããšã«äœäººããããæã£ãŠã¿ãŸãããã 人æ°ã ããé
åã«æã£ãå Žåãã¯ãšãªã«å¯ŸããåŠçã¯ãäžéããäžéãŸã§ã®å身é·ããšã®äººæ°ã®åããšããŠè¡šçŸããããšãã§ããŸããããã§ã泚æãå¿
èŠã§ãããã¯ãšãªããšã«äžéããäžéãŸã§ãè¶³ããŠãã£ãã®ã§ã¯ã O(QH) ã®èšç®éã«ãªãã身é·ã®å¹
ã倧ããå Žåã«æ¹åããããŸããã æ
å ±ã®æã¡æ¹ãæŽã«äžå·¥å€«ããŠã身é·i以äžã®åèšäººæ°ãiçªç®ã®èŠçŽ ãšããŠæã€ãããªé
åãèããŸãããããã㯠O(N+H) ã§æºåã§ããŸããLevel2ãšåãå
·äœäŸã䜿ã£ãŠèª¬æããŸãã åãã«èº«é·ã®å€ååã®é
åã確ä¿ããŠãããå人ã®èº«é·ãèªã¿èŸŒãã ãã察å¿ããå€ã+1ããŸãããã®åŠçã¯å ç®Nåã§ O(N) ã§ããæ¬¡ã« P[i] = P[i] + P[i-1] ãšã㊠P[i] ã身é·i以äžã®äººæ°ã衚ãããã«ããŒã¿ãæã¡ãŸãããã®åŠçã¯èº«é·ã®äžéãŸã§è¶³ãå¿
èŠããããããå ç®H_MAXåãå¿
èŠã§ O(H_MAX) ã§ãã ãã®é
åäžã§ãäžéãšäžéã®åŒãç®ãè¡ãããšã§ãç¯å²ã«å«ãŸãã人æ°ãçããããšãå¯èœã§ããäºåã«äººæ°ãè¶³ããŠæã£ãŠããããšã§ãã¯ãšãªã«å¯ŸããŠã¯ïŒåã®åŒãç®( O(1) )ã§ã¬ã¹ãã³ã¹ããäºãã§ããŸãããã®ææ³ã环ç©åãšãããŸãã Level3ã®ãã€ã³ããèããŠã¿ãŸãããã ãLevel3ã®ãã€ã³ãã èº«é·æ
å ±ã®æã¡æ¹ãå€ãã æ¯åã®æ¢çŽ¢ããå¿
èŠãªã åŒãç®1åã§èšç®ãã¹ã Python:Level3å®è£
äŸ """ 环ç©å """ H_MAX = 10**5 N, Q = map(int, input().split(" ")) P = [] lower_count = [0] * (H_MAX + 1) # 身é·i以äžã®äººæ°ãlower_count[i]ã«æ ŒçŽããã for i in range(N): h = int(input()) lower_count[h] += 1 # O( H_MAX ) for i in range(H_MAX): lower_count[i + 1] += lower_count[i] # O( Q ) for i in range(Q): h_min, h_max = map(int, input().split()) upper = lower_count[h_max] lower = lower_count[h_min - 1] print(upper - lower) # 人æ°ãåãã£ãŠããã®ã§åŒãç®ã ãã§çãããããã èšç®é㯠O(N) + O(H) + O(Q) ã«ãªããŸããæ¯åã®æ¢çŽ¢ãå¿
èŠãªããããé«éã«åŠçãããããšãåºæ¥ãŸãã ãŸãšã ä»åã®ã¯ãŒã¯ã·ã§ããã§ã¯ãå¶çŽã®å€§ããã«åãããŠã¢ã«ãŽãªãºã ã®æ¹åãšèãæ¹ã玹ä»ããŸããã ããŒã¿æ°ãå°ãªããªããå®è£
ãç°¡åãªå
šæ¢çŽ¢ã ããŒã¿æ°ãå€ãå Žåã¯ãœãŒãããŠãããŠäºåæ¢çŽ¢ãïŒååŠçïŒ ããŒã¿æ°ã ããå¿
èŠã«ãªãå ŽåãããŒã¿æ°ã ãæ°ããŠãããŠãåŒãç®ãã环ç©åã®ææ³ã䜿ãããïŒããŒã¿ã®æã¡æ¹ãå€ããïŒ ã€ãå
æ¥ã瀟å
slackã§ãO(N)ãO(logN)ã«æ¹åããŸããïŒããšãã話é¡ãäžãã£ãŠããŸãããèšç®éãèããªããã¢ã«ãŽãªãºã ã®æ¹åãããããšã«é¢çœããæããæ¹ãäžç·ã«åããã®ã楜ãã¿ã«ããŠããŸãïŒ ä»åŸã®ã¯ãŒã¯ã·ã§ããã®ãæ¡å
å®éã®ã¯ãŒã¯ã·ã§ããã§ã¯åå è
ã®çããããLevel1ã§åé¡ãçè§£ããŠãLevel2ã®å®è£
ã«åãçµããšããæ§åã§ãããç«¶æããã°ã©ãã³ã°ã«æ
£ããŠããæ¹ã¯ãLevel2ãŸã§ã¯ç¬æ®ºãLevel3ã«ãã£ã¬ã³ãžããŠããŸãããã ä»åŸããã©ã«ã·ã¢ã§ã¯ãã¯ãŒã¯ã·ã§ããã®éå¬ãäºå®ããŠããŸãããšã³ãžãã¢ãšããŠã®ç¥èŠãåºãããæ¹ãã©ã«ã·ã¢ã®ããšãç¥ãããæ¹ããã²ãå¿åãåŸ
ã¡ããŠãããŸãïŒ ã¯ãŒã¯ã·ã§ããã®æ¥çšããç³ã蟌ã¿ã¯ ãã¡ã