結果
問題 | No.610 区間賞(Section Award) |
ユーザー |
|
提出日時 | 2020-04-12 17:21:19 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 58 ms / 2,000 ms |
コード長 | 2,582 bytes |
コンパイル時間 | 1,321 ms |
コンパイル使用メモリ | 123,328 KB |
実行使用メモリ | 6,944 KB |
最終ジャッジ日時 | 2024-09-22 03:23:10 |
合計ジャッジ時間 | 4,996 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 50 |
ソースコード
#include <cstdio>#include <iostream>#include <string>#include <sstream>#include <stack>#include <algorithm>#include <cmath>#include <queue>#include <map>#include <set>#include <cstdlib>#include <bitset>#include <tuple>#include <assert.h>#include <deque>#include <bitset>#include <iomanip>#include <limits>#include <chrono>#include <random>#include <array>#include <unordered_map>#include <functional>#include <complex>#include <numeric>template<class T> inline bool chmax(T& a, T b) { if (a < b) { a = b; return 1; } return 0; }template<class T> inline bool chmin(T& a, T b) { if (a > b) { a = b; return 1; } return 0; }constexpr long long MAX = 5100000;constexpr long long INF = 1LL << 60;constexpr int inf = 1 << 28;//constexpr long long mod = 1000000007LL;//constexpr long long mod = 998244353LL;using namespace std;typedef unsigned long long ull;typedef long long ll;template< typename Monoid >struct SegmentTree {using F = function< Monoid(Monoid, Monoid) >;int sz;vector< Monoid > seg;const F f;const Monoid M1;SegmentTree(int n, const F f, const Monoid& M1) : f(f), M1(M1) {sz = 1;while (sz < n) sz <<= 1;seg.assign(2 * sz, M1);}void set(int k, const Monoid& x) {seg[k + sz] = x;}void build() {for (int k = sz - 1; k > 0; k--) {seg[k] = f(seg[2 * k + 0], seg[2 * k + 1]);}}void update(int k, const Monoid& x) {k += sz;seg[k] = x;while (k >>= 1) {seg[k] = f(seg[2 * k + 0], seg[2 * k + 1]);}}Monoid query(int a, int b) {Monoid L = M1, R = M1;if (a == b) return M1;for (a += sz, b += sz; a < b; a >>= 1, b >>= 1) {if (a & 1) L = f(L, seg[a++]);if (b & 1) R = f(seg[--b], R);}return f(L, R);}};int f(int a, int b) {return max(a, b);}int main(){/*cin.tie(nullptr);ios::sync_with_stdio(false);*/int n; scanf("%d", &n);vector<int> p(n);vector<int> a(n); for (int i = 0; i < n; i++) scanf("%d", &a[i]), a[i]--;vector<int> b(n); for (int i = 0; i < n; i++) scanf("%d", &b[i]), b[i]--,p[b[i]] = i;vector<int> res;SegmentTree<int> seg(n, f, 0);for (int i = n - 1; i >= 0; i--) {int idx = p[a[i]];int mx = seg.query(0, idx);if (mx == 0) res.push_back(a[i] + 1);seg.update(idx, 1);}sort(res.begin(), res.end());for (int i = 0; i < res.size(); i++) {printf("%d\n", res[i]);}return 0;}