답안 #369811

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
369811 2021-02-22T13:08:52 Z FatihSolak Zoltan (COCI16_zoltan) C++17
0 / 140
1000 ms 25836 KB
#include <bits/stdc++.h>
#define N 200005
#define MOD 1000000007
using namespace std;
struct Node{
    int val1,val2,occur1,occur2;
    Node(){
        val1 = 0,val2 = 0,occur1 = 0,occur2 = 0;
    }
};
Node t[4*N];
Node cmp(Node a,Node b){
    Node ret;
    if(a.val1 == b.val1){
        ret.val1 = a.val1;
        ret.occur1 = (a.occur1 + b.occur1)%MOD;
    }
    else{
        if(a.val1 > b.val1){
            ret.val1 = a.val1;
            ret.occur1 = a.occur1;
        }
        else{
            ret.val1 = b.val1;
            ret.occur1 = b.occur1;
        }
    }
    if(a.val2 == b.val2){
        ret.val2 = a.val2;
        ret.occur2 = (a.occur2 + b.occur2)%MOD;
    }
    else{
        if(a.val2 > b.val2){
            ret.val2 = a.val2;
            ret.occur2 = a.occur2;
        }
        else{
            ret.val2 = b.val2;
            ret.occur2 = b.occur2;
        }
    }
    return ret;
}
int arr[N];
map<int,int> mp;
Node get(int v,int tl,int tr,int l,int r){
    if(tr < l || r < tl){
        return Node();
    }
    if(l <= tl && tr <= r){
        return t[v];
    }
    int tm = (tl+tr)/2;
    Node lc = get(v*2,tl,tm,l,r);
    Node rc = get(v*2+1,tm+1,tr,l,r);
    return cmp(lc,rc);
}
void upd(int v,int l,int r,int pos,Node val){
    if(l == r){
        t[v] = cmp(t[v],val);
        return;
    }
    int m = (l+r)/2;
    if(pos <= m)
        upd(v*2,l,m,pos,val);
    else upd(v*2+1,m+1,r,pos,val);
    t[v] = cmp(t[v*2],t[v*2+1]);
}
int binpow(int a,int b){
    int ret = 1;
    while(b){
        if(b&1){
            ret = 1ll*ret*a%MOD;
        }
        a = 1ll*a *a%MOD;
        b/=2;
    }
    return ret;
}
void solve(){
    int n;
    cin >> n;
    for(int i=0;i<n;i++){
        cin >> arr[i];
        mp[arr[i]]++;
    }
    int cnt = 1;
    for(auto &u:mp){
        u.second = cnt++;
    }
    int ans1 = 0,ans2=0;
    for(int i=0;i<n;i++){
        Node l = get(1,1,n,1,mp[arr[i]]-1);
        Node r = get(1,1,n,mp[arr[i]]+1,n);
        if(l.val1 == 0){
            l.occur1 = 1;
        }
        if(r.val2 == 0){
            r.occur2 = 1;
        }
        int ln = l.val1 + r.val2+1;
        int occ = 1ll*l.occur1 * r.occur2%MOD * binpow(2,n-ln)%MOD;
        if(ln == ans1){
            ans2 = (ans2+occ)%MOD;
        }
        if(ln > ans1){
            ans1 = ln;
            ans2 = occ;
        }
        Node up;
        up.val1 = l.val1 + 1;
        up.occur1 = l.occur1;
        up.val2 = r.val2 + 1;
        up.occur2 = r.occur2;
        upd(1,1,n,mp[arr[i]],up);
        cout << ans1 << " " << ans2 << endl;
    }
    cout << ans1 << " " << ans2;
}

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    #ifdef Local
    freopen("in.txt","r",stdin);
    freopen("out.txt","w",stdout);
    #endif
    int t=1;
    //cin>>t;
    while(t--){
        solve();
    }
    #ifdef Local
    cout<<endl<<fixed<<setprecision(2)<<1000.0 * clock() / CLOCKS_PER_SEC<< " milliseconds ";
    #endif
}
# 결과 실행 시간 메모리 Grader output
1 Incorrect 9 ms 13036 KB Output isn't correct
2 Incorrect 9 ms 12908 KB Output isn't correct
3 Incorrect 8 ms 12928 KB Output isn't correct
4 Incorrect 9 ms 12928 KB Output isn't correct
5 Incorrect 8 ms 12908 KB Output isn't correct
6 Incorrect 9 ms 12812 KB Output isn't correct
7 Incorrect 12 ms 12908 KB Output isn't correct
8 Incorrect 12 ms 12908 KB Output isn't correct
9 Incorrect 13 ms 12908 KB Output isn't correct
10 Incorrect 13 ms 12908 KB Output isn't correct
11 Incorrect 743 ms 23576 KB Output isn't correct
12 Incorrect 641 ms 22072 KB Output isn't correct
13 Incorrect 600 ms 21672 KB Output isn't correct
14 Incorrect 756 ms 21996 KB Output isn't correct
15 Incorrect 977 ms 24044 KB Output isn't correct
16 Execution timed out 1090 ms 25836 KB Time limit exceeded
17 Incorrect 891 ms 24684 KB Output isn't correct
18 Incorrect 888 ms 24924 KB Output isn't correct
19 Incorrect 895 ms 25068 KB Output isn't correct
20 Incorrect 905 ms 24812 KB Output isn't correct