Submission #641811

#TimeUsernameProblemLanguageResultExecution timeMemory
641811manizareExam (eJOI20_exam)C++14
100 / 100
246 ms392248 KiB
#include<bits/stdc++.h> #define all(a) a.begin(),a.end() #define pb push_back #define int long long using namespace std ; const int maxn = 5002 , maxq = 1e5+10 , mod = 998244353 ,inf = 1e18 ; int dp[3][maxn][maxn] , n , a[maxq] , b[maxq] , l[maxq] , r[maxq] , c[maxq] , p[maxq] ; stack<int> s , t; set <int > ff; int solve(int n){ map <int , int > m , q ; int cnt = 1 ; for(int i = 1; i <= n ; i++){ m[a[i]] = cnt ; p[cnt] = i ; cnt++; } cnt = 1; vector <int> v , last ; last.pb(0); for(int i = 1; i <= n ; i++){ last.pb(inf); if(m[b[i]] == 0)continue ; int ind = p[m[b[i]]] ; if(l[ind] < i && r[ind] > i){ if(q[b[i]] == 0){ q[b[i]] = cnt ; cnt++; } v.pb(m[b[i]]); } } int ans = 0 ; for(int i = 0; i < v.size() ; i++){ int x = upper_bound(all(last) , v[i])- last.begin() - 1; last[x+1] = min(last[x+1] , v[i]); ans = max(x+1 , ans); } return ans ; } int solve2(int n){ int dp[maxq]; memset(dp , 0 , sizeof dp); for(int i =1 ; i <= n ; i++){ if(a[i] != b[1])continue ; dp[l[i]+1]++; dp[r[i]]--; } int ans =0 ; for(int i =1; i <= n ; i++){ dp[i] +=dp[i-1] ; if(dp[i] !=0 )ans++; } return ans ; } 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]; } for(int i= 1; i <= n ; i++){ while(s.size() && a[i] >= a[s.top()])s.pop(); if(s.size() == 0){ l[i] = 0 ; }else{ l[i] = s.top(); } s.push(i); } for(int i = n; i >= 1 ; i--){ while(t.size() && a[i] >= a[t.top()])t.pop(); if(t.size() == 0){ r[i] = n+1 ; }else{ r[i] = t.top(); } t.push(i); } for(int i = 1; i <= n ; i++){ cin >> b[i] ; ff.insert(b[i]); // cout << l[i] << " " << r[i] <<"<-\n"; } if(ff.size() == 1){ cout << solve2(n) << "\n"; return 0 ; } if(n > 5000){ cout << solve(n) << "\n" ; return 0 ; } for(int i = 1; i <= n ; i++){ for(int j =1 ; j <= n ; j++){ dp[0][i][j] = max(dp[0][i-1][j] , dp[1][i-1][j]); dp[1][i][j] = max(max(dp[0][i-1][j-1] , dp[1][i-1][j-1]) , dp[1][i][j-1]) + ((j > l[i] && r[i] > j) && a[i] == b[j]) ; } } for(int i = 1; i <= n ; i++){ for(int j =1 ; j <= n ; j++){ // cout << dp[0][i][j] << " " << dp[1][i][j] << " "; } // cout << "\n"; } cout << max(dp[0][n][n] , dp[1][n][n]) << "\n"; return 0 ; }

Compilation message (stderr)

exam.cpp: In function 'long long int solve(long long int)':
exam.cpp:36:19: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   36 |  for(int i = 0; i < v.size() ; i++){
      |                 ~~^~~~~~~~~~
#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...