Submission #646915

#TimeUsernameProblemLanguageResultExecution timeMemory
646915LeonaRagingExam (eJOI20_exam)C++14
100 / 100
176 ms100060 KiB
#include <bits/stdc++.h> using namespace std; #define fi first #define se second #define ll long long #define pb push_back #define db(val) "[" #val " = " << (val) << "] " const ll mod = 1e9 + 7; const int maxn = 1e5 + 4; const int INF = 1e9; const int N = 5005; int n, a[maxn], b[maxn], L[maxn], R[maxn]; set<int> mySet; void Sub2() { int res = 0, pre = 0; for (int i = 1; i <= n; i++) if (a[i] == b[i]) { res += R[i] - max(pre, L[i]) - 1; pre = R[i]; i = R[i] - 1; } cout << res; } struct seg_tree { vector<int> t; seg_tree() { t.resize(4 * maxn); } void update(int pos, int val, int v = 1, int l = 1, int r = maxn - 1) { if (l == r) { t[v] = val; return; } int m = (l + r) / 2; if (pos <= m) update(pos, val, 2 * v, l, m); else update(pos, val, 2 * v + 1, m + 1, r); t[v] = max(t[2 * v], t[2 * v + 1]); } int get(int l, int r, int v = 1, int tl = 1, int tr = maxn - 1) { if (tl > r || tr < l) return 0; if (tl >= l && tr <= r) return t[v]; int m = (tl + tr) / 2; int L = get(l, r, 2 * v, tl, m); int R = get(l, r, 2 * v + 1, m + 1, tr); return max(L, R); } } IT; map<int,int> mp; void Sub4() { for (int i = 1; i <= n; i++) mp[a[i]] = i; for (int i = 1; i <= n; i++) { auto it = mp.find(b[i]); if (it == mp.end()) continue; int idx = it->se; if (L[idx] < i && R[idx] > i) IT.update(idx, IT.get(1, idx) + 1); } cout << IT.t[1]; } int dp[N][N]; void Sub6() { int res = 0; for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) { if (a[i] == b[j] && L[i] < j && j < R[i]) dp[i][j] = dp[i][j - 1] + 1; dp[i][j] = max({dp[i][j], dp[i][j - 1], dp[i - 1][j]}); res = max(res, dp[i][j]); } cout << res << '\n'; } int main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); //freopen(".INP", "r", stdin); //freopen(".OUT", "w", stdout); cin >> n; for (int i = 1; i <= n; i++) cin >> a[i]; for (int i = 1; i <= n; i++) { cin >> b[i]; mySet.insert(b[i]); } stack<int> st; st.push(0); a[0] = a[n + 1] = INF + 1; for (int i = 1; i <= n; i++) { while (a[st.top()] <= a[i]) st.pop(); L[i] = st.top(); st.push(i); } stack<int>().swap(st); st.push(n + 1); for (int i = n; i >= 1; i--) { while (a[st.top()] <= a[i]) st.pop(); R[i] = st.top(); st.push(i); } if (mySet.size() == 1) Sub2(); else if (n > 5000) Sub4(); else { Sub6(); } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...