結果
問題 | No.1508 Avoid being hit |
ユーザー |
![]() |
提出日時 | 2021-05-16 08:05:21 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 201 ms / 3,000 ms |
コード長 | 2,931 bytes |
コンパイル時間 | 4,000 ms |
コンパイル使用メモリ | 236,580 KB |
実行使用メモリ | 25,392 KB |
最終ジャッジ日時 | 2024-10-04 09:13:23 |
合計ジャッジ時間 | 8,968 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 43 |
ソースコード
#include <bits/stdc++.h>#include <atcoder/all>using namespace std;using namespace atcoder;#define REP(i,a,n) for(int i=(a); i<(int)(n); i++)#define rep(i,n) REP(i,0,n)#define FOR(it,c) for(__typeof((c).begin()) it=(c).begin(); it!=(c).end(); ++it)#define ALLOF(c) (c).begin(), (c).end()typedef long long ll;typedef unsigned long long ull;//using mint = modint1000000007;//using mint = modint998244353;class Range {public:struct RNG {ll l, r;bool operator<(const RNG& a) const {return r < a.r;}};set<RNG> rngs;void add(ll nl, ll nr){RNG rng;rng.l = nl;rng.r = nr;auto bgn = rngs.lower_bound((RNG){nl-1,nl-1});auto it = bgn;for(; it != rngs.end(); it++){if(it->l <= rng.r+1){nl = min(nl, it->l);nr = max(nr, it->r);}else{break;}}rngs.erase(bgn, it);rngs.insert((RNG){nl,nr});}void erase(ll nl, ll nr){RNG rng;rng.l = nl;rng.r = nr;set<RNG> tmp;auto bgn = rngs.lower_bound((RNG){nl,nl});auto it = bgn;for(; it != rngs.end(); it++){if(it->l <= rng.r){if(it->l < nl){tmp.insert((RNG){it->l,nl-1});}if(nr < it->r){tmp.insert((RNG){nr+1,it->r});}}else{break;}}rngs.erase(bgn, it);FOR(it,tmp){rngs.insert(*it);}}};Range ok[100005];vector<int> solve(int N, const vector<pair<int,int>>& v){int Q = v.size();vector<int> ret;{int a = v[Q-1].first;int b = v[Q-1].second;ok[Q-1].add(1,N);ok[Q-1].erase(a,a);ok[Q-1].erase(b,b);}for(int i=Q-2; i>=0; i--){int a = v[i].first;int b = v[i].second;if(a > b) swap(a,b);FOR(it,ok[i+1].rngs){int aa = it->l - 1;int bb = it->r + 1;aa = max(aa, 1);bb = min(bb, N);ok[i].add(aa,bb);}ok[i].erase(a,a);ok[i].erase(b,b);}/*rep(i,Q){cout << i << endl;FOR(it,ok[i]){cout << "\t" << it->first << " " << it->second << endl;}}*/if(ok[0].rngs.size() == 0) return vector<int>();int pos = ok[0].rngs.begin()->l;ret.push_back(pos);REP(i,1,Q){int nxt = pos;REP(j,-1,2){int npos = pos + j;bool flg = false;if(1<=npos&&npos<=N){FOR(it,ok[i].rngs){if(it->l <= npos && npos <= it->r) flg = true;}}if(flg){nxt = npos;break;}}pos = nxt;ret.push_back(pos);}return ret;}int main(){int N, Q;cin >> N >> Q;vector<pair<int,int>> v(Q);rep(i,Q) cin >> v[i].first;rep(i,Q) cin >> v[i].second;vector<int> ret = solve(N, v);if(ret.size() > 0){cout << "YES" << endl;cout << ret[0] << endl;rep(i,ret.size()) cout << ret[i] << endl;return 0;}cout << "NO" << endl;return 0;}