競技プãƒã‚°ãƒ©ãƒžãƒ¼ã¯æ—¥ã€…最çŸçµŒè·¯å•é¡Œã‚’解ã„ã¦ã„る。BFS ã‚„ã€ãƒ™ãƒ«ãƒžãƒ³ãƒ•ã‚©ãƒ¼ãƒ‰ã€ãƒ€ã‚¤ã‚¯ã‚¹ãƒˆãƒ©ã€ãƒ¯ãƒ¼ã‚·ãƒ£ãƒ«ãƒ•ãƒã‚¤ãƒ‰ã¨å¤šãã®ã‚¢ãƒ«ã‚´ãƒªã‚ºãƒ も知られã¦ã„る。
ã‚ãªãŸã¯ãã‚“ãªä¸ã€ã©ã†ã—ã¦ã‚‚解ã‘ãªã„最çŸè·¯å•é¡ŒãŒã‚ã£ãŸã€‚ãã‚Œã¯ã‚°ãƒ©ãƒ•ã‚’見ãšã«æœ€çŸè·¯å•é¡Œã‚’解ã‘ã¨ã„ã†å•é¡Œã ï¼ã“ã‚“ãªã‚‚ã®é€šå¸¸ã®äººé¡žã«ã¯è§£ã‘ã‚‹ã‚ã‘ãŒãªã„ã®ã ãŒã€30 分ã ã‘ ivvivvi 神ã®å¤©å•“ã‚’å—ã‘ã‚‹ã“ã¨ãŒã§ãるよã†ã«ãªã£ãŸã€‚
ivvivvi 神ã¯ç«¶æŠ€ãƒ—ãƒã‚°ãƒ©ãƒŸãƒ³ã‚°ã«ã‚‚最çŸçµŒè·¯å•é¡Œã«ã‚‚精通ã—ã¦ãŠã‚Šã€ã©ã‚“ãªã‚°ãƒ©ãƒ•ã«å¯¾ã—ã¦ã‚‚ä»»æ„ã® 2 点間ã®æœ€çŸçµŒè·¯é•·ã‚’定数時間ã§æ±‚ã‚る能力をæŒã£ã¦ã„る。ã‚ãªãŸã¯ ivvivvi 神ã®åŠ›ã‚’借りã¦æœ€çŸçµŒè·¯å•é¡Œã‚’解ã“ã†ã¨æ€ã£ãŸãŒã€æ®‹å¿µãªãŒã‚‰ã‚ãªãŸã®è§£ãã¹ã最çŸçµŒè·¯å•é¡Œã§ã¯å…·ä½“çš„ãªçµŒè·¯ã‚’出力ã—ãªã‘ã‚Œã°ãªã‚‰ãªã„。ivvivvi 神ãªã‚‰ã€æœ€çŸçµŒè·¯ã®å¾©å…ƒã‚‚容易ã ãŒã€ivvivvi 神ã¯éžå¸¸ã«å¿™ã—ã„ã®ã§ã€ã“れ以上手を煩ã‚ã›ã‚‹ã‚ã‘ã«ã¯è¡Œã‘ãªã„。ãã“ã§ã€ã§ãã‚‹ã ã‘å°‘ãªã„質å•å›žæ•°ã§è‡ªåŠ›ã§æœ€çŸçµŒè·¯ã‚’復元ã™ã‚‹ã“ã¨ã«ã—ãŸã€‚
3 ã¤ã®æ•´æ•° N〠sã€ãã—ã¦ã€t ãŒä¸Žãˆã‚‰ã‚Œã‚‹ã€‚ã“ã®ã¨ãã€é ‚点数 N ã®ã‚°ãƒ©ãƒ•ãŒã‚ã‚Šã€é ‚点数以外ã®è¾ºæ•°ã‚„é ‚ç‚¹ã®éš£æŽ¥é–¢ä¿‚ãªã©ã®ã‚°ãƒ©ãƒ•ã«é–¢ã™ã‚‹æƒ…å ±ã¯ä¸Žãˆã‚‰ã‚Œãªã„ãŒã€2 é ‚ç‚¹ uã€v ã®è·é›¢ã‚’質å•ã™ã‚‹ã“ã¨ãŒã§ãる。ã“ã“ã§ã€ã‚°ãƒ©ãƒ•ã®é ‚点番å·ã¯ 1 以上 N 以下ã§ã‚る。5N 回以下ã®è³ªå•å›žæ•°ã§ s ã‹ã‚‰ t ã¸ã®æœ€çŸè·¯ã‚’発見ã—ã€æœ€çŸè·¯ã‚’表ã™é ‚点列を 1 ã¤å‡ºåŠ›ã›ã‚ˆã€‚
ã“ã®å•é¡Œã§ã¯ 2 é ‚ç‚¹ uã€v é–“ã®è·é›¢ã‚’ジャッジã«è³ªå•ã—ãªã‘ã‚Œã°ãªã‚‰ãªã„。 標準出力ã«æ¬¡ã®ã‚ˆã†ã«å‡ºåŠ›ã™ã‚‹ã“ã¨ã§ã€uã€v é–“ã®è·é›¢ã‚’質å•ã™ã‚‹ã“ã¨ãŒã§ãる。
? u v
ã“ã®ã‚ˆã†ã«æ¨™æº–出力ã—ãŸã‚ã¨ã€ã“ã®ç”ãˆã¯æ¨™æº–入力㫠1 è¡Œã®æ•´æ•°ã¨ã—ã¦ä¸Žãˆã‚‰ã‚Œã‚‹ã€‚ ã“ã®å•é¡Œã§ã¯ãƒ—ãƒã‚°ãƒ©ãƒ ã®è¡Œã£ãŸè³ªå•ã®å›žæ•°ãŒ 5N 回を超ãˆã‚‹ã¨èª¤ç”(WA)ã¨åˆ¤å®šã•ã‚Œã‚‹ã€‚ã“ã®å•é¡Œã§ã¯æœ€å¾Œã«é ‚点列ã€ã¤ã¾ã‚Šæ•´æ•°åˆ—を出力ã™ã‚‹ã€‚é ‚ç‚¹åˆ— (x_1, ..., x_k) を出力ã™ã‚‹å‡ºåŠ›å½¢å¼ã¯æ¬¡ã®ã‚ˆã†ã§ã‚る。
! x_1 x_2 ... x_k
ã“ã“ã§ã€å‡ºåŠ›ã¯ x_1 = s 〠x_k = t を満ãŸã—ã€ä»»æ„ã®1 \leq i \leq k - 1 ã«å¯¾ã—ã¦ã€x_i 㨠x_{i + 1} を直接çµã¶è¾ºãŒå˜åœ¨ã™ã‚‹ã€‚ ã•ã‚‰ã«ã€ã“ã®æœ€çµ‚çš„ãªè§£ç”ã¯ã€ä¸€åº¦ã—ã‹è¡Œã†ã“ã¨ãŒã§ããªã„。ã“ã®è§£ç”ãŒæ£ã—ã„出力ã ã£ãŸã¨ãã€æ£ç”ã¨ã¿ãªã™ã€‚ã•ã‚‰ã«ã€æ¨™æº–出力ã¨ã—ã¦ä¸Šè¨˜ã® 2 ã¤ã®è¨˜æ³•ã¨ç•°ãªã‚‹å‡ºåŠ›ã‚„質å•å›žæ•°ãŒ 5N 回を超ãˆãŸæ™‚ã¯ã‚¸ãƒ£ãƒƒã‚¸ã¯ -1 ã‚’è¿”ã™ã€‚ã“ã®æ™‚ã€å³åº§ã«ãƒ—ãƒã‚°ãƒ©ãƒ を終了ã•ã›ãªã„å ´åˆã€ã‚¸ãƒ£ãƒƒã‚¸ãŒ WA ã‚’æ£ã—ã判定ã™ã‚‹ã“ã¨ã‚’ä¿è¨¼ã—ãªã„。
ã¾ãŸã€æ¨™æº–出力を行ã†æ¯Žã«ã€ã‚¹ãƒˆãƒªãƒ¼ãƒ をフラッシュ (flush) ã™ã‚‹å¿…è¦ãŒã‚ã‚‹ã“ã¨ã«æ³¨æ„ã•ã‚Œã‚ˆã€‚主è¦ãªè¨€èªžã§ã®ãƒ•ãƒ©ãƒƒã‚·ãƒ¥ä¾‹ã‚’以下ã«ç¤ºã™ã€‚ã‚‚ã¡ã‚ã‚“ã€ã“れ以外ã®æ–¹æ³•ã§ãƒ•ãƒ©ãƒƒã‚·ãƒ¥ã‚’è¡Œã£ã¦ã‚‚構ã‚ãªã„。
C 言語:
#include <stdio.h> fflush(stdout);
C++:
#include <iostream> std::cout.flush();
Java:
System.out.flush();
Python:
print(end='', flush=True)
入力ã¨ã—ã¦æ•´æ•° 3 ã¤ãŒä¸Žãˆã‚‰ã‚Œã‚‹ã€‚
N s t
標準入力 | 標準出力 |
---|---|
4 1 3 | |
? 4 3 | |
3 | |
? 1 4 | |
2 | |
? 2 1 | |
1 | |
? 3 2 | |
2 | |
? 1 3 | |
3 | |
? 4 2 | |
1 | |
! 1 2 3 |
ã“ã®å…¥å‡ºåŠ›ä¾‹ã§ã¯ä»¥ä¸‹ã®ã‚°ãƒ©ãƒ•ã«å¯¾ã—㦠2 点間ã®è·é›¢ã‚’質å•ã—ã¦ã„る。