※ã“ã®å•é¡Œã¯ãƒªã‚¢ã‚¯ãƒ†ã‚£ãƒ–å•é¡Œã§ã™ï¼Žã™ãªã‚ã¡ï¼Œã‚µãƒ¼ãƒãƒ¼å´ã«ç”¨æ„ã•ã‚ŒãŸãƒ—ãƒã‚°ãƒ©ãƒ ã¨å¯¾è©±çš„ã«å¿œç”ã™ã‚‹ã“ã¨ã§æ£ç”ã‚’å°Žãプãƒã‚°ãƒ©ãƒ を作æˆã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ï¼Ž ã¾ãŸã€ã‚µãƒ¼ãƒãƒ¼å´ã®ãƒ—ãƒã‚°ãƒ©ãƒ も計算機資æºã‚’共有ã™ã‚‹é–¢ä¿‚上ã€ã‚µãƒ¼ãƒãƒ¼ã ã‘ã§æœ€å¤§ 3 sec程度ã®å®Ÿè¡Œæ™‚é–“ã€æœ€å¤§ 300 MB程度ã®ãƒ¡ãƒ¢ãƒªã‚’使用ã™ã‚‹å ´åˆãŒã‚ã‚Šã¾ã™ã®ã§ã€TLE・MLEã«ãŠæ°—ã‚’ã¤ã‘ãã ã•ã„。
ã‚ã„ãšã«ã‚ƒã‚“ã¯è‹¥ãƒ¶æ¾é«˜æ ¡ã®ãƒ—ãƒã‚°ãƒ©ãƒŸãƒ³ã‚°ã‚³ãƒ³ãƒ†ã‚¹ãƒˆéƒ¨ã€é€šç§°ã·ã‚ã“ん部ã«æ‰€å±žã™ã‚‹2年生ã§ã‚る。見目麗ã—ã„。ã‚ã„ãšã«ã‚ƒã‚“ã¯ãã®å°ã•ãªä½“ã‚‚ç„¡é™ã«å˜åœ¨ã™ã‚‹ãƒãƒ£ãƒ¼ãƒ ãƒã‚¤ãƒ³ãƒˆã®1ã¤ã§ã‚ã‚‹ãŒã€æœ¬äººã¯ã‚³ãƒ³ãƒ—レックスを感ã˜ã¦ã„るよã†ã 。ãã®ã›ã„ã‹ã€ä¸€åˆ—ã«ä¸¦ã‚“ã§ã„る人ãŸã¡ã‚’見るã¨ã€ãã‚Œãžã‚Œã®äººã®å‰æ–¹ã«ãã®äººã‚ˆã‚Šèº«é•·ãŒé«˜ã„人ãŒä½•äººä¸¦ã‚“ã§ã„ã‚‹ã‹ã‚’瞬時ã«æ•°ãˆã‚‰ã‚Œã‚‹èƒ½åŠ›ã‚’æŒã£ã¦ã„る。
プãƒã‚³ãƒ³ã®å門・律命館大å¦ä¸ç‰éƒ¨å’ã®ã‚¨ãƒªãƒ¼ãƒˆç«¶æŠ€ãƒ—ãƒã‚°ãƒ©ãƒžã§ã‚ã‚Šã€ã·ã‚ã“ん部ã®éƒ¨é•·ã§ã‚ã‚‹ã‚Šã£ã¤ã¡ã‚ƒã‚“ã¯ã€ã‚ã„ãšã«ã‚ƒã‚“ã®ã“ã®èƒ½åŠ›ã‚’使ãˆã°ã€ä¸¦ã‚“ã§ã„る人ãŸã¡ãŒãã‚Œãžã‚Œä½•ç•ªç›®ã«èƒŒãŒé«˜ã„ã®ã‹ã‚’当ã¦ã‚‹ã“ã¨ãŒã§ãã‚‹ã®ã§ã¯ãªã„ã‹ã¨è€ƒãˆãŸã€‚
今ã€ã‚Šã£ã¤ã¡ã‚ƒã‚“ã¯N人ãŒä¸¦ã‚“ã§ã„る列をã‚ã„ãšã«ã‚ƒã‚“ã«è¦‹ã›ã¦ã„る。りã£ã¤ã¡ã‚ƒã‚“ã¯ã€äººãŒN人並んã§ã„ã‚‹ã“ã¨ã¯çŸ¥ã£ã¦ã„ã‚‹ãŒã€ãã®ä¸¦ã³é †ãŒã©ã†ãªã£ã¦ã„ã‚‹ã‹ã¯ã‚ã‹ã‚‰ãªã„。りã£ã¤ã¡ã‚ƒã‚“ã¯ã‚ã„ãšã«ã‚ƒã‚“㫠“l番目ã®äººã‹ã‚‰r番目ã®äººã¾ã§ã‚³ãƒ³ãƒ—レックス度†を教ãˆã¦ã‚‚らã†ã“ã¨ãŒã§ãる。ã“ã“ã§ã€l番目ã®äººã‹ã‚‰r番目ã®äººã¾ã§ã®ã‚³ãƒ³ãƒ—レックス度ã¨ã¯ã€i (l \≤ i \≤ r) 番目ã®äººãã‚Œãžã‚Œã«é–¢ã—ã¦ã€l番目ã‹ã‚‰i − 1番目ã¾ã§ã®é–“ã«ã„る自分 (i) より背ãŒé«˜ã„人ã®äººæ•°ã®ç·å’Œã§ã‚る。(より厳密ãªå®šç¾©ã¯å…¥å‡ºåŠ›å½¢å¼ã‚’å‚ç…§ã®ã“ã¨)
(ã†ã‚‰ã‚„ã¾ã—ã„ã“ã¨ã«) ã·ã‚ã“ん部ã®éƒ¨å“¡ã§ã‚ã‚‹ã‚ãªãŸã¯ã€(ã¨ã¦ã‚‚ã€ã¨ã¦ã‚‚心苦ã—ã„ãŒ) ã‚ã„ãšã«ã‚ƒã‚“をオラクルã¨ã—ã¦åˆ©ç”¨ã™ã‚‹ã“ã¨ã§èº«é•·é †ã‚’当ã¦ã‚‹ãƒ—ãƒã‚°ãƒ©ãƒ を書ãよã†ã‚Šã£ã¤ã¡ã‚ƒã‚“ã«å‘½ã˜ã‚‰ã‚ŒãŸã€‚ã¤ã‚‰ã„。ã›ã‚ã¦ã‚ã„ãšã«ã‚ƒã‚“ã«è² æ‹…ã‚’ã‹ã‘ãªã„よã†ã€å°‘ãªã„質å•å›žæ•°ã§æ±‚ã‚られるよã†é ‘å¼µã‚ã†ã€‚
サーãƒãƒ¼ã¯èƒŒã®é †ã‚’表ã™é•·ã•Nã®æ•°åˆ—pã‚’ä¿æŒã—ã¦ã„る。ã“ã‚Œã¯å…¥åŠ›ã¨ã—ã¦ä¸Žãˆã‚‰ã‚Œãªã„。pã®å„è¦ç´ p_iã¯1以上N以下ã§ã‚ã‚Šã€ãã‚Œãžã‚Œå€¤ã¯ç•°ãªã‚‹ã€‚p_iãŒå¤§ãã„値をæŒã¤æ–¹ãŒèƒŒãŒé«˜ã„ã“ã¨ã‚’表ã™ã€‚
サーãƒãƒ¼ã¯ã¾ãšã€pã®é•·ã•Nを表ã™1ã¤ã®æ•´æ•°ã‹ã‚‰ãªã‚‹1行を入力ã¨ã—ã¦è§£ç”プãƒã‚°ãƒ©ãƒ ã«ä¸Žãˆã‚‹ã€‚
次ã«è§£ç”プãƒã‚°ãƒ©ãƒ ãŒ2ã¤ã®æ•´æ•° l, r (1 \≤ l \≤ r \≤ N) ã‹ã‚‰ãªã‚‹ã‚¯ã‚¨ãƒªã‚’サーãƒãƒ¼ã«é€ã‚‹ã€‚クエリã®å‡ºåŠ›å½¢å¼ã¯
? l r
ã§ã‚る。ã“ã‚Œã¯ä¾‹ãˆã°C/C++ã ã¨ã€
printf("? %d %d\n", l, r); fflush(stdout);
ãªã©ã¨æ›¸ã‘ã°ã‚ˆã„。出力ã®åº¦ã«ãƒ•ãƒ©ãƒƒã‚·ãƒ¥ã™ã‚‹ã“ã¨ã‚’推奨ã™ã‚‹ã€‚
ã™ã‚‹ã¨ã€ã‚µãƒ¼ãƒãƒ¼å´ã¯ä»¥ä¸‹ã®å€¤ã‚’表ã™1ã¤ã®æ•´æ•°Cã‹ã‚‰ãªã‚‹1行を入力ã¨ã—ã¦è§£ç”プãƒã‚°ãƒ©ãƒ ã«ä¸Žãˆã‚‹ã€‚
C = (\{ (i, j) | p_i > p_j {\rm for} l \≤ i<j \≤ r \}ã®è¦ç´ æ•°)
ãŸã ã—ã€ã‚¯ã‚¨ãƒªã¨ã—ã¦æ£ã—ããªã„l, r (l, rãŒ1以上N以下ã®æ•°ã§ã¯ãªã„ã€ã¾ãŸã¯l>rã§ã‚ã‚‹) ãŒä¸Žãˆã‚‰ã‚ŒãŸå ´åˆã€ã‚µãƒ¼ãƒãƒ¼ã¯−1ã‚’Cã¨ã—ã¦è¿”ã™ã€‚
ã“ã®å¿œç”を何度ã‹ç¹°ã‚Šè¿”ã—ã€è§£ç”プãƒã‚°ãƒ©ãƒ ãŒpを推定ã§ããŸãªã‚‰ã°ã€pを以下ã®å½¢å¼ã§å‡ºåŠ›ã™ã‚‹ã€‚
! p_1 ... p_N
推定ã—ãŸé †åˆ—ã®å‡ºåŠ›ã¯1度ã—ã‹ã§ããšã€ã“ã®å‡ºåŠ›ãŒpã¨ç•°ãªã‚‹å ´åˆã€èª¤ç”ã¨ãªã‚‹ã€‚200,000回以内ã®ã‚¯ã‚¨ãƒªã§æ£ã—ã„pを出力ã§ããŸå ´åˆã€æ£ç”ã¨ãªã‚‹ã€‚
å„クエリã§æ”¹è¡Œã‚’è¡Œã†ã‚ˆã†æ°—ã‚’ã¤ã‘ã‚‹ã“ã¨ã€‚
サーãƒãƒ¼ã®å‡ºåŠ› | サーãƒãƒ¼ã¸ã®å…¥åŠ› |
---|---|
4 | |
? 1 3 | |
2 | |
? 2 4 | |
1 | |
... | ... |
! 4 1 3 2 |