競ãã er ã®éã§ã¯ãï¼ä¸»ã«å®çæ´»ã§ï¼æé©å¤ãæ¢ããã¨äºåæ¢ç´¢ããã¦ãä¸éã大ããåããããããã«ç ´æ» ããã¨ããå®çªãã¿ãããã¾ã*1ã
ãããã¯ãå®éã®ã³ã³ãã¹ãã§ããä¸éãå°ããããããä¸éã大ããããããããå¤å®é¢æ°å
ã§ãªã¼ãã¼ããã¼ããããªã©ã®å¤±æããã人ã¯ãããªãã«ããå°è±¡ã§ãã
å¾è
ã¯ç¹ã«ãä¸éãæèåæ¢ã§ 1e9
ããã㯠1e18
ã«ãã¦ãã人ã«ãããã¡ã§ãã
ããã§ã¯ããããæåçã®é«ãæèåæ¢ã®æ¹æ³ãã¨ãã¦ãææ°æ¢ç´¢ (exponential search) ã¨ããã®ãç´¹ä»ãã¾ãã ææ°æéããã¦å ¨æ¢ç´¢ããã¨ããã¿ã¤ãã®ã®ã£ã°ã§ã¯ãªãã§ãã
æ¬é¡
以ä¸ã®ãããªã³ã¼ããèãã¾ãã
let mut ok = 0; let mut bad = todo!(); while bad - ok > 1 { let mid = ok + (bad - ok) / 2; *(if pred(mid) { &mut ok } else { &mut bad }) = mid; }
C++ ãªã以ä¸ã®ãããªæãã§ãã
ll ok = 0; ll bad = TODO(); while (bad - ok > 1) { auto mid = ok + (bad - ok) / 2; (pred(mid)? ok: bad) = mid; }
mid = (ok + bad) / 2;
ã§ãããã§ããã以ä¸ã®çç±ããmid = ok + (bad - ok) / 2;
ã使ã£ã¦ãã¾ãï¼
bad
ããªã¼ãã¼ããã¼ããªããã°è¨ç®éç¨ã§ãªã¼ãã¼ããã¼ããªããã¨- ï¼
ok < 0
ã®å ´åã¯æ³¨æãå¿ è¦ã§ãï¼
- ï¼
- ã«ã¼ãæ¡ä»¶ã§
bad - ok
ã使ã£ã¦ããã®ã§ãããã使ãæ¹ãç´æçãªï¼or é ã«ããããï¼æ°ããããã¨
ã¾ãããã®ç¨åº¦ã®æé©åã¯äººéã§ã¯ãªãã³ã³ãã¤ã©ã®å½¹å²ã ããã¨èãã>> 1
ã§ã¯ãªã / 2
ã使ã£ã¦ãã¾ãã
ãã¦ãtodo ã®é¨åã決ããããã«é©å½ãªå¤ãèããã®ã§ã¯ãªãã次ã®ããã«ãã¦ã¿ã¾ãããã
let mut ok = 0; let mut bad = 1; // <- ! ããã while pred(bad) { // <- ! 追å bad *= 2; // <- ! ãã } // <- ! ã ã while bad - ok > 1 { let mid = ok + (bad - ok) / 2; *(if pred(mid) { &mut ok } else { &mut bad }) = mid; }
ã¾ã 1 ã§åæåãã¦ãããä¸éãå°ããéãåã ã§ï¼= ææ°çã«ï¼å¢ããã¦ããã¨ãããã®ã§ãã
çãã \(z\) ã¨ããã¨ãã以ä¸ã®ãããããããã¾ãï¼
- å¤å®ã®åæ°ã \(2\log_2(z)+O(1)\) åã«ãªã
- ä¸éã決ãæã¡ããå ´åã«æ¯ã¹ã¦ææªæã§ãé«ã 2 åç¨åº¦ã®åæ°ã«ãããªããªã
- å¤å®é¢æ°ã®å
¥åå¤ã \(2z\) 以ä¸ã«ãããªããªã
- ããã§ãªã¼ãã¼ããã¼ããªããã°åé¡ãªã
- ãµã¤ãã®äºåæ¢ç´¢ã¨æ¯ã¹ã¦è¿½è¨ã®å·®åãå°ãã
pred(mid)
ã®å½¢ã§å¼ã³åºãããã®ã¨ããã¨ãã®è©±- ã«ã¼ãå ã§ãã¿æ¸ããã¦ãããã¤ãããã©ãããã¯è¨è¨ãè¦ç´ãã¦ããã ãã¦...
ä¾ãªã©
å¤å®é¢æ°å
㧠mid * x + y
ã®ãããªå¤ã使ãã¨ããããããªã¼ãã¼ããã¼ããªãããã«ãä¸éã 1e18 / x
ç¨åº¦ã«ãããªã©ãå¿
è¦ãªå ´åãããã¾ããåãæ¨ã¦åãä¸ããªã©ã®å¢çã§ééããããy
ã大ããã£ãããã¦ãããããã«ãªãå ´åãããã¾ãã
ããããã±ã¼ã¹ã§ä¸è¨ã®æ¹æ³ãæå¹ã«ãªããã¾ãã
ãã¡ããããªã¼ãã¼ããã¼ã«å¯¾ãã¦å®å
¨ã«æèåæ¢ããããªãå¤åé·æ´æ°ã使ãã®ãããã¨ã¯æãã¾ããããã®è¾ºã®è¦æ¥µãã¯åã
ã«ä»»ãã¾ãã
æèåæ¢ã§ 1e18
ã«ããããã¯ããã£ã½ã©ãã·ãªæ°ã¯ãã¾ãã
ã¾ããæèåæ¢ä»¥å¤ã®æèã§ãæç¨ã§ããã¨ãã°ãã©ã³ãã æååãäºã¤ãããä¸è´ããå ±éæ¥é è¾ã®é·ããäºåæ¢ç´¢ããããã¨ãã£ãç¶æ³ã§ããã©ã³ãã æååãªã®ã ããçãã¯å°ããã¯ãã§ãæåããæååé·ãä¸éã¨ããªãã¦ããããããã¨ããæ¨æ¸¬ãããé«éåãå³ã£ããã¨ãããã¾ããï¼è¥å¹²ãã¿è¨äºã¨ãã¦ã®è²ãå¼·ãã§ãã...ï¼ã
ï¼âãã®è¨äºã¯ãããªããã SA ãä½ããã¨ãããã¨èªä½ããããããªãã§è¾æ¸é æ¯è¼ãé«éã«è¡ããã¨ããé¨åãæç¨ãã¼ããªæ°ããã¾ãï¼
ãã¨ãã
ã°ãªã¼ã¼ã®ãã¿ã«å¯¾ãããã¸ã¬ã¹è¨äºã®ãããªæãã«ã¯ãããããã¾ããã§ããã ä¸æ¹ã§ããã«ã¶ãããå®çæ´»ã§ãããã¨ããã¨ã©ããã¦ãã°ãªã¼ã¼ã«ãªã£ã¦ãã¾ããã®ããã«æã£ã¦ããããªåå¿è ã®æ°é ãæãããã¨ãä½åº¦ããã£ããããæ¸ããããªã£ã¦ãã¾ãã¾ããã
ææ°æ¢ç´¢ã®æ¬ ç¹ã¨ãã¦ã¯ããã¤ãã¿ã¼æ ãããªãã¨ããã®ãããã¾ããã
ããã
ãã®è¨äºã¯ Advent Calendar ã¨ã¯ä¸åé¢ä¿ããã¾ããã
*1:ãããã \ï¾ï¾ï¾ï½¯/ã°ãªã¼ã¼ã¼ã¼ãã»ãå¤æ°ã