結果
問題 | No.1115 二つの数列 / Two Sequences |
ユーザー |
![]() |
提出日時 | 2020-07-17 21:26:54 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 67 ms / 2,000 ms |
コード長 | 2,636 bytes |
コンパイル時間 | 3,632 ms |
コンパイル使用メモリ | 197,856 KB |
最終ジャッジ日時 | 2025-01-11 22:06:20 |
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 5 |
other | AC * 35 |
ソースコード
#include <bits/stdc++.h>using namespace std;using i64 = long long;using u64 = unsigned long long;#define REP(i, n) for (int i = 0; (i64)(i) < (i64)(n); ++i)#ifdef ENABLE_DEBUGtemplate <typename T>void debug(T value) {cerr << value;}template <typename T, typename... Ts>void debug(T value, Ts... args) {cerr << value << ", ";debug(args...);}#define DEBUG(...) \do { \cerr << " \033[33m (L" << __LINE__ << ") "; \cerr << #__VA_ARGS__ << ":\033[0m "; \debug(__VA_ARGS__); \cerr << endl; \} while (0)#else#define debug(...)#define DEBUG(...)#endiftemplate <class Monoid>struct SegTree {using Func = function<Monoid(Monoid, Monoid)>;const Func F;const Monoid UNITY;int size;vector<Monoid> dat;SegTree(int n, const Func f, const Monoid &unity): F(f), UNITY(unity), size(n), dat(2 * n, unity) {}// Sets i-th value (0-indexed) to x for initial setup.// build() must be called after set() calls.void set(int i, const Monoid &x) { dat[size + i] = x; }void build() {for (int k = size - 1; k > 0; --k) {dat[k] = F(dat[k * 2], dat[k * 2 + 1]);}}// Sets i-th value (0-indexed) to x.void update(int i, const Monoid &x) {int k = size + i;dat[k] = x;while (k > 1) {k >>= 1;dat[k] = F(dat[k * 2], dat[k * 2 + 1]);}}// Queries by [l,r) range (0-indexed, open interval).Monoid fold(int l, int r) {l += size;r += size;Monoid vleft = UNITY, vright = UNITY;for (; l < r; l >>= 1, r >>= 1) {if (l & 1) vleft = F(vleft, dat[l++]);if (r & 1) vright = F(dat[--r], vright);}return F(vleft, vright);}// Queries by a single index (0-indexed).Monoid operator[](int i) { return dat[size + i]; }/* debug */void print() {for (int i = 0; i < size; ++i) {cout << (*this)[i];if (i != size - 1) cout << ",";}cout << endl;}};int main() {ios::sync_with_stdio(false);cin.tie(nullptr);int n;cin >> n;vector<int> A(n), B(n);for (auto &x : A) {cin >> x;--x;}for (auto &x : B) {cin >> x;--x;}vector<int> ar(n), br(n);REP(i, n) {ar[A[i]] = i;br[B[i]] = i;}SegTree<i64> ast(n, [](i64 x, i64 y) { return x + y; }, 0LL);REP(i, n) { ast.set(i, 1); }ast.build();i64 steps = 0;REP(i, n) {int k = ar[B[i]];i64 s = ast.fold(0, k);steps += s;ast.update(k, 0);}cout << steps << endl;}