Submission #1125924

#TimeUsernameProblemLanguageResultExecution timeMemory
1125924SoMotThanhXuanZoltan (COCI16_zoltan)C++20
140 / 140
93 ms9056 KiB
#include <bits/stdc++.h>
using namespace std;
#define FOR(i, a, b) for(int i = (a), _b = (b); i <= _b; ++i)
#define REP(i, a, b) for(int i = (a), _b = (b); i >= _b; --i)
#define mp make_pair
#define all(v) v.begin(), v.end()
#define uni(v) v.erase(unique(all(v)), v.end())
inline bool maximize(int &u, int v){
    if(v > u){
        u = v;
        return true;
    }
    return false;
}
inline bool minimize(int &u, int v){
    if(v < u){
        u = v;
        return true;
    }
    return false;
}
inline bool maximizell(long long &u, long long v){
    if(v > u){
        u = v;
        return true;
    }
    return false;
}
inline bool minimizell(long long &u, long long v){
    if(v < u){
        u = v;
        return true;
    }
    return false;
}
const int mod = 1e9 + 7;
inline int fastPow(int a, int n){
    int res = 1;
    while(n){
        if(n & 1)res = 1ll * res * a * mod;
        a = 1ll * a * a % mod;
        n >>= 1;
    }
    return res;
}
inline void add(int &u, int v){
    u += v;
    if(u >= mod) u -= mod;
}
inline void sub(int &u, int v){
    u -= v;
    if(u < 0) u += mod;
}
const int maxN = 2e5 + 5;
const int inf = 2e9;
const long long infll = 1e18;
int power[maxN], n, a[maxN], comp[maxN];

struct Node{
    int len, cnt;
    Node(int lenVal = 0, int cntVal = 0){
        len = lenVal;
        cnt = cntVal;
    }
    Node operator + (const Node &rhs) const {
        if(len > rhs.len) return *this;
        if(rhs.len > len) return rhs;
        Node res = *this;
        add(res.cnt, rhs.cnt);
        return res;
    }
};
Node f[maxN], g[maxN];
#define dec DECCCCC
Node inc[maxN], dec[maxN];
void updateInc(int x, Node val){
    for(; x <= n; x += x & -x)inc[x] = inc[x] + val;
}
Node getInc(int x){
    Node res;
    for(; x >= 1; x &= x - 1)res = res + inc[x];
    return res;
}
void updateDec(int x, Node val){
    for(; x >= 1; x &= x - 1)dec[x] = dec[x] + val;
}
Node getDec(int x){
    Node res;
    for(; x <= n; x += x & -x)res = res + dec[x];
    return res;
}

void process(){
    cin >> n;
    power[0] = 1;
    FOR(i, 1, n){
        cin >> a[i];
        power[i] = 2ll * power[i - 1] % mod;
        comp[i] = a[i];
    }
    sort(comp + 1, comp + 1 + n);
    FOR(i, 1, n){
        a[i] = lower_bound(comp + 1, comp + 1 + n, a[i]) - comp;
    }
    REP(i, n, 1){
        Node val = getInc(a[i] - 1);
        if(val.len == 0)f[i] = Node(1, 1);
        else f[i] = val, ++f[i].len;
        updateInc(a[i], f[i]);
        val = getDec(a[i] + 1);
        if(val.len == 0)g[i] = Node(1, 1);
        else g[i] = val, ++g[i].len;
        updateDec(a[i], g[i]);
    }
    Node res;
    FOR(i, 1, n){
        Node Merge;
        Merge.len = f[i].len + g[i].len - 1;
        Merge.cnt = 1ll * f[i].cnt * g[i].cnt % mod * power[n - Merge.len] % mod;
        res = res + Merge;
    }
    cout << res.len << ' ' << res.cnt;
}
#define NAME "Zoltan"
int main(){
    if(fopen(NAME".inp", "r")){
        freopen(NAME".inp", "r", stdin);
        freopen(NAME".out", "w", stdout);
    }
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    int t = 1;
//    cin >> t;
    while(t--)
        process();
//    cerr << '\n' << "Time elapsed: " << (1.0 * clock() / CLOCKS_PER_SEC) << " s\n" ;
    return 0;
}




Compilation message (stderr)

zoltan.cpp: In function 'int main()':
zoltan.cpp:127:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  127 |         freopen(NAME".inp", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
zoltan.cpp:128:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  128 |         freopen(NAME".out", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...