Submission #369657

#TimeUsernameProblemLanguageResultExecution timeMemory
369657Atill83Zoltan (COCI16_zoltan)C++14
140 / 140
498 ms19432 KiB
#include <bits/stdc++.h>
#define ff first
#define ss second
#define endl '\n'
using namespace std;
const long long INF = (long long) 1e18;
const int mod = (int) 1e9+7;
const int MAXN = (int) 3e5+5;

typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
ll n;
int a[MAXN];
map<int, int> mp;
int c = 1;
pii t1[4*MAXN], t2[4*MAXN];


void build(int v, int tl, int tr, pii * t){
    if(tl == tr){
        t[v] = {0, 0};
    }else{
        int tm = (tl + tr) / 2;

        build(2*v, tl, tm, t);
        build(2*v + 1, tm + 1, tr, t);

        if(t[2*v].ff == t[2*v + 1].ff)
            t[v].ff = t[2*v].ff, t[v].ss = (t[2*v].ss + t[2*v + 1].ss) % mod;
        else
            t[v] = max(t[2*v], t[2*v + 1]);
    }
}

pii que(int v, int tl, int tr, int l, int r, pii *t){
    if(l > r)
        return {0, 0};
    else if(l == tl && r == tr)
        return t[v];
    else{
        int tm = (tl + tr) / 2;
        pii a = que(2*v, tl, tm, l, min(tm, r), t), b = que(2*v + 1, tm + 1, tr, max(tm + 1, l), r, t);
        if(a.ff == b.ff)
            return {a.ff, (a.ss + b.ss) % mod};
        else
            return max(a, b);
    }
}

void upd(int v, int tl, int tr, int pos, pii val, pii *t){
    if(tl == tr){
        if(t[v].ff == val.ff)
            t[v].ss = (t[v].ss + val.ss) % mod;
        else if(t[v].ff < val.ff)
            t[v] = val;
    }else{
        int tm = (tl + tr) / 2;
        if(pos <= tm)
            upd(2*v, tl, tm, pos, val, t);
        else
            upd(2*v + 1, tm + 1, tr, pos, val, t);
        if(t[2*v].ff == t[2*v + 1].ff)
            t[v].ff = t[2*v].ff, t[v].ss = (t[2*v].ss + t[2*v + 1].ss) % mod;
        else
            t[v] = max(t[2*v], t[2*v + 1]);
    }
}

int bp(int tab, int b){
    int res = 1;
    while(b){
        if(b % 2) 
            res = 1LL * res * tab % mod;
        tab = 1LL * tab * tab % mod;
        b = b / 2;
    }
    return res;
}


int32_t main(){
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);cout.tie(nullptr);

    #ifdef Local
        freopen("C:/Users/Admin/Desktop/Yazilim/C/IO/int.txt","r",stdin);
        freopen("C:/Users/Admin/Desktop/Yazilim/C/IO/out.txt","w",stdout);
    #endif


    cin>>n;
    vector<int> comp;
    
    for(int i = 0; i < n; i++){
        cin>>a[i];
        comp.push_back(a[i]);
    }

    sort(comp.begin(), comp.end());
    comp.resize(unique(comp.begin(), comp.end()) - comp.begin());


    for(int i: comp)
        mp[i] = c++;

    for(int i = 0; i < n; i++){
        a[i] = mp[a[i]];
    }
    int ansLen = 0, ansCount = 0;

    build(1, 1, c, t1);
    upd(1, 1, c, c, {0, 1}, t1);


    build(1, 0, c - 1, t2);
    upd(1, 0, c - 1, 0, {0, 1}, t2);
    for(int i = n - 1; i >= 0; i--){
        pii gt1 = que(1, 1, c, a[i] + 1, c, t1), gt2 = que(1, 0, c - 1, 0, a[i] - 1, t2);
        //cerr<<i<<" "<<endl;
        //cerr<<gt1.ff<<" "<<gt1.ss<<endl<<gt2.ff<<" "<<gt2.ss<<endl;
        
        int nL = gt1.ff + gt2.ff + 1;
        int nC = 1LL * gt1.ss * gt2.ss % mod * bp(2, (n - 1) - nL + 1) % mod;

        if(nL > ansLen){
            ansLen = nL;
            ansCount = nC;
        }else if(nL == ansLen)
            ansCount = (ansCount + nC) % mod; 

        gt1.ff++;
        gt2.ff++;
        upd(1, 1, c, a[i], gt1, t1);
        upd(1, 0, c - 1, a[i], gt2, t2);
    }
    

    cout<<ansLen<<" "<<ansCount<<endl;



    #ifdef Local
        cout<<endl<<fixed<<setprecision(2)<<1000.0 * clock() / CLOCKS_PER_SEC<< " milliseconds ";
    #endif
}
#Verdict Execution timeMemoryGrader output
Fetching results...