제출 #1269227

#제출 시각아이디문제언어결과실행 시간메모리
1269227DangKhoizzzzZoltan (COCI16_zoltan)C++20
140 / 140
289 ms20116 KiB
#include <bits/stdc++.h>
#define int long long
#define fi first
#define se second
#define pii pair <int , int>
#define arr3 array <int , 3>

using namespace std;

const int INF = 1e18;
const int maxn = 2e5 + 7;
const int mod = 1e9 + 7;

pii merging(pii a, pii b)
{
    if(a.fi == b.fi) return {a.fi, (a.se + b.se)%mod};
    else return max(a, b);
}

struct Segment_Tree
{
    pii st[maxn*4];
    void update(int id, int l, int r, int pos, pii val)
    {
        if(r < pos || l > pos) return;
        if(l == r)
        {
            st[id] = merging(val , st[id]);
            st[id].se %= mod;
            return;
        }
        int mid = (l+r) >> 1;
        update(id*2, l, mid, pos, val);
        update(id*2+1, mid+1, r, pos, val);
        st[id] = merging(st[id*2], st[id*2+1]);
        st[id].se %= mod;
    }
    pii get(int id, int l, int r, int u, int v)
    {
        if(r < u || l > v) return {-INF, 0};
        if(u <= l && r <= v) return st[id];
        int mid = (l+r) >> 1;
        return merging(get(id*2, l, mid, u, v), get(id*2+1, mid+1, r, u, v));
    }
} ST[2];

int n , a[maxn] , pow2[maxn];
pii ans = {0 , 0};

void compress()
{
    vector <int> val;
    for(int i = 1; i <= n; i++) val.push_back(a[i]);
    sort(val.begin(), val.end());
    val.erase(unique(val.begin(), val.end()), val.end());
    for(int i = 1; i <= n; i++) a[i] = upper_bound(val.begin(), val.end(), a[i]) - val.begin();
}

void solve()
{
    pow2[0] = 1;
    cin >> n;
    for(int i = 1; i <= n; i++)
    {
        cin >> a[i];
        pow2[i] = (pow2[i-1]*2)%mod;
    }
    compress();

    ST[1].update(1 , 0 , n+1 , n+1 , (pii){0 , 1});
    for(int i = n; i >= 2; i--)
    {
        pii upd = ST[1].get(1 , 0 , n+1 , a[i] + 1 , n+1); upd.fi++;
        ST[1].update(1 , 0 , n+1 , a[i] , upd);
    }

    ST[0].update(1 , 0 , n+1 , 0 , (pii){0 , 1});
    for(int i = n; i >= 2; i--)
    {
        pii upd = ST[0].get(1 , 0 , n+1 , 0 , a[i] - 1); upd.fi++;
        ST[0].update(1 , 0 , n+1 , a[i] , upd);
    }

    pii temp1 = ST[0].get(1 , 0 , n+1 , 0 , a[1] - 1);
    pii temp2 = ST[1].get(1 , 0 , n+1 , a[1]+1 , n+1);

    ans.fi = temp1.fi + temp2.fi + 1;
    ans.se = (((temp1.se * temp2.se)%mod) * pow2[n - ans.fi])%mod;

    for(int i = 0; i <= n; i++)
    {
        pii tmp1 = ST[0].get(1 , 0 , n+1 , i , i);
        pii tmp2 = ST[1].get(1 , 0 , n+1 , i+1 , n+1);

        pii res;

        res.fi = tmp1.fi + tmp2.fi;
        res.se = (((tmp1.se*tmp2.se)%mod)*pow2[n - 1 - res.fi])%mod;
        ans = merging(res , ans);
    }
    cout << ans.fi << ' ' << ans.se << '\n';
}

signed main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    solve();
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...