Submission #1205240

#TimeUsernameProblemLanguageResultExecution timeMemory
1205240andrei_nExam (eJOI20_exam)C++20
65 / 100
175 ms98976 KiB
#include <bits/stdc++.h> using namespace std; int a[100005], b[100005]; map<int,int> pos; int aib[100005]; int dp[5005][5005]; int rmq[17][100005]; int e[100005]; int n; void updateAIB(int p, int x) { p = n + 2 - p; for(; p<=n+3; p+=(p&-p)) aib[p] += x; } int queryAIB(int p) { p = n + 2 - p; int res = 0; for(; p; p^=(p&-p)) res += aib[p]; return res; } inline int query(const int &a, const int &b) { return max(rmq[e[b-a+1]][a], rmq[e[b-a+1]][b + 1 - (1<<e[b-a+1])]); } signed main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin>>n; for(int i=1; i<=n; ++i) { cin>>a[i]; rmq[0][i] = a[i]; pos[a[i]] = i; } for(int i=1; i<=n; ++i) cin>>b[i]; for(int i=1; i<17; ++i) for(int j=1; j+(1<<i)-1 <= n; ++j) rmq[i][j] = max(rmq[i-1][j], rmq[i-1][j+(1<<i-1)]); for(int i=2; i<=n; ++i) e[i] = e[i-1] + ((i & (i-1)) == 0); if(n <= 5000) { for(int i=1; i<=n; ++i) { for(int j=1; j<=n; ++j) { dp[i][j] = dp[i][j-1]; if(a[j] == query(min(i,j), max(i,j))) dp[i][j] = max(dp[i][j], dp[i-1][j] + (a[j] == b[i])); } } cout<<dp[n][n]; } else { for(int i=1; i<=n; ++i) { int j = pos[b[i]]; if(!j) continue; if(a[j] != query(min(i,j), max(i,j))) continue; updateAIB(n, 1); updateAIB(j-1, -1); } cout<<queryAIB(n); } return 0; }
#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...