結果
| 問題 |
No.1508 Avoid being hit
|
| コンテスト | |
| ユーザー |
tnakao0123
|
| 提出日時 | 2021-05-16 19:42:46 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 47 ms / 3,000 ms |
| コード長 | 2,221 bytes |
| コンパイル時間 | 1,055 ms |
| コンパイル使用メモリ | 99,964 KB |
| 実行使用メモリ | 11,008 KB |
| 最終ジャッジ日時 | 2024-10-05 05:15:26 |
| 合計ジャッジ時間 | 4,618 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 43 |
ソースコード
/* -*- coding: utf-8 -*-
*
* 1508.cc: No.1508 Avoid being hit - yukicoder
*/
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<iostream>
#include<string>
#include<vector>
#include<map>
#include<set>
#include<stack>
#include<list>
#include<queue>
#include<deque>
#include<algorithm>
#include<numeric>
#include<utility>
#include<complex>
#include<functional>
using namespace std;
/* constant */
const int MAX_N = 100000;
const int MAX_Q = 100000;
/* typedef */
typedef pair<int,int> pii;
typedef vector<pii> vpii;
/* global variables */
int as[MAX_Q], bs[MAX_Q], vs[MAX_Q + 1];
vpii gs[MAX_Q + 1];
/* subroutines */
void splitg(int x, vpii &g) {
vpii tg;
for (auto p: g) {
if (p.first <= x && x < p.second) {
if (p.first < x) tg.push_back(pii(p.first, x));
if (x + 1 < p.second) tg.push_back(pii(x + 1, p.second));
}
else
tg.push_back(p);
}
swap(g, tg);
}
bool includeg(int x, vpii &g) {
for (auto p: g)
if (p.first <= x && x < p.second) return true;
return false;
}
void printg(vpii g) {
for (auto p: g) printf("(%d,%d) ", p.first, p.second);
putchar('\n');
}
/* main */
int main() {
int n, q;
scanf("%d%d", &n, &q);
for (int i = 0; i < q; i++) scanf("%d", as + i), as[i]--;
for (int i = 0; i < q; i++) scanf("%d", bs + i), bs[i]--;
gs[0].push_back(pii(0, n));
for (int i = 0; i < q; i++) {
vpii &g0 = gs[i], &g1 = gs[i + 1];
int l = -1, r = -1;
for (auto p: g0) {
int li = p.first, ri = p.second;
if (li > 0) li--;
if (ri < n) ri++;
if (l < 0) l = li, r = ri;
else if (r < li) {
g1.push_back(pii(l, r));
l = li, r = ri;
}
else
r = ri;
}
if (l >= 0) g1.push_back(pii(l, r));
splitg(as[i], g1);
splitg(bs[i], g1);
if (g1.empty()) { puts("NO"); return 0; }
}
//for (int i = 0; i <= q; i++) printf("%d: ", i), printg(gs[i]);
vs[q] = gs[q][0].first;
for (int i = q - 1; i >= 0; i--) {
int x = vs[i + 1];
if (includeg(x, gs[i])) vs[i] = x;
else if (x > 0 && includeg(x - 1, gs[i])) vs[i] = x - 1;
else vs[i] = x + 1;
}
puts("YES");
for (int i = 0; i <= q; i++) printf("%d\n", vs[i] + 1);
return 0;
}
tnakao0123