답안 #412201

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
412201 2021-05-26T15:37:47 Z Theo830 Exam (eJOI20_exam) C++17
36 / 100
146 ms 10848 KB
#include <bits/stdc++.h>
using namespace std;
typedef int ll;
ll INF = 1e9+7;
ll MOD = 998244353;
typedef pair<ll,ll> ii;
#define iii pair<ii,ll>
#define f(i,a,b) for(ll i = a;i < b;i++)
#define pb push_back
#define vll vector<ll>
#define F first
#define S second
#define all(x) (x).begin(), (x).end()
///I hope I will get uprating and don't make mistakes
///I will never stop programming
///sqrt(-1) Love C++
///Please don't hack me
///@TheofanisOrfanou Theo830
///Think different approaches (bs,dp,greedy,graphs,shortest paths,mst)
///Stay Calm
///Look for special cases
///Beware of overflow and array bounds
///Think the problem backwards
///Training
ll seg[400005]={0};
void update(ll s,ll e,ll qs,ll qe,ll idx,ll k){
    if(s == e && s == qs){
        seg[idx] = max(seg[idx],k);
        return;
    }
    if(qs > e || qe < s){
        return;
    }
    ll mid = (s+e)/2;
    update(s,mid,qs,qe,idx*2,k);
    update(mid+1,e,qs,qe,idx*2+1,k);
    seg[idx] = max(seg[idx*2],seg[idx*2+1]);
}
ll query(ll s,ll e,ll qs,ll qe,ll idx){
    if(qs <= s && e <= qe){
        return seg[idx];
    }
    if(qs > e || qe < s){
        return 0;
    }
    ll mid = (s+e)/2;
    ll a = query(s,mid,qs,qe,idx*2);
    ll b = query(mid+1,e,qs,qe,idx*2+1);
    return max(a,b);
}
int main(void){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    ll n;
    cin>>n;
    ll a[n],b[n];
    map<ll,ll>pos;
    f(i,0,n){
        cin>>a[i];
        pos[a[i]] = i+1;
    }
    f(i,0,n){
        cin>>b[i];
        b[i] = pos[b[i]];
        if(b[i] == 0){
            b[i] = INF;
        }
    }
    ll l[n],r[n];
    priority_queue<ii,vector<ii>,greater<ii> >pq;
    f(i,0,n){
        pq.push(ii(a[i],i));
        while(pq.top().F < a[i]){
            r[pq.top().S] = i-1;
            pq.pop();
        }
    }
    while(!pq.empty()){
        r[pq.top().S] = n-1;
        pq.pop();
    }
    for(ll i=n-1;i >= 0;i--){
        pq.push(ii(a[i],i));
        while(pq.top().F < a[i]){
            l[pq.top().S] = i+1;
            pq.pop();
        }
    }
    while(!pq.empty()){
        l[pq.top().S] = 0;
        pq.pop();
    }
    ll ans = 0;
    ll dp[n+1];
    dp[0] = 0;
    f(i,1,n+1){
        dp[i] = 0;
        if(b[i-1] == INF || !(l[b[i-1]-1] <= i-1 && i-1 <= r[b[i-1]-1])){
            continue;
        }
        dp[i] = query(1,n+1,1,b[i-1],1) + 1;
        update(1,n+1,b[i-1],b[i-1],1,dp[i]);
        ans = max(ans,dp[i]);
    }
    cout<<ans<<endl;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 204 KB Output is correct
2 Incorrect 1 ms 204 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 332 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 324 KB Output is correct
2 Correct 1 ms 332 KB Output is correct
3 Correct 2 ms 460 KB Output is correct
4 Correct 6 ms 844 KB Output is correct
5 Correct 5 ms 844 KB Output is correct
6 Correct 5 ms 856 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 720 KB Output is correct
2 Correct 35 ms 3816 KB Output is correct
3 Correct 110 ms 8348 KB Output is correct
4 Correct 112 ms 9156 KB Output is correct
5 Correct 146 ms 10848 KB Output is correct
6 Correct 136 ms 9660 KB Output is correct
7 Correct 112 ms 10424 KB Output is correct
8 Correct 90 ms 8760 KB Output is correct
9 Correct 131 ms 9152 KB Output is correct
10 Correct 98 ms 9572 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 204 KB Output is correct
2 Incorrect 1 ms 204 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 204 KB Output is correct
2 Incorrect 1 ms 204 KB Output isn't correct
3 Halted 0 ms 0 KB -