Submission #883710

#TimeUsernameProblemLanguageResultExecution timeMemory
883710vjudge1Zoltan (COCI16_zoltan)C++17
14 / 140
330 ms31676 KiB
#ifndef Local
    #pragma GCC optimize("O3,unroll-loops")
    const int lim=2e5+100;
#else
    const int lim=2e5+100;
#endif

#include "bits/stdc++.h"
using namespace std;

//#define int long long
#define pb push_back

const int mod=1e9+7;
using pii=pair<int,int>;

int sum(long int i,long int j){
    return (i+j<mod?i+j:i+j-mod);
}
int mul(long int i,long int j){
    return (i*j)%mod;
}
int expo(long int i,long int j){
    int ans=1;
    while(j){
        if(j&1){
            ans=mul(ans,i);
        }
        i=mul(i,i);
        j>>=1;
    }
    return ans;
}

struct segtree{
    int n;
    pii tree[4*lim];
    segtree(int n):n(n){
        fill(tree,tree+4*n,pii{0,0});
    }
    inline pii merge(pii v1,pii v2){
        if(v1.first>v2.first){
            return v1;
        }
        if(v2.first>v1.first){
            return v2;
        }
        return pii{v1.first,sum(v1.second,v2.second)};
    }
    int P;
    pii VAL;
    pii update(int l,int r,int node){
        if(P<l||r<P){
            return tree[node];
        }
        if(l==r){
            return tree[node]=merge(tree[node],VAL);
        }
        int mid=(l+r)>>1,child=node<<1;
        return tree[node]=merge(update(l,mid,child),update(mid+1,r,child|1));
    }
    pii query(int l,int r,int node){
        if(P<=l){
            return {0,0};
        }
        if(r<P){
            return tree[node];
        }
        int mid=(l+r)>>1,child=node<<1;
        return merge(query(l,mid,child),query(mid+1,r,child|1));
    }
    void update(int p,pii val){
        P=p,VAL=val;
        update(0,n-1,1);
    }
    pii query(int p){
        P=p;
        return query(0,n-1,1);
    }
};

int perm[lim],iperm[lim];
int ncr(long int n,long int r){
    if(n<r)return 0;
    if(n<0||r<0)return 0;
    return mul(perm[n],mul(perm[n-r],perm[r]));
}

int formula(int n){
    return mul(n,expo(2,n-1));
}

inline void solve(){
    perm[0]=1;
    for(int i=1;i<lim;i++){
        perm[i]=mul(perm[i],i);
    }
    iperm[lim-1]=expo(perm[lim-1],mod-2);
    for(int i=lim-2;0<=i;i--){
        iperm[i]=mul(iperm[i+1],i);
    }
    int n;
    cin>>n;
    vector<pii>a;
    set<int>all;
    for(int i=0;i<n;i++){
        int tem;
        cin>>tem;
        if(!a.size()||a.back().first!=tem){
            a.pb(pii{tem,1});
        }else{
            a.back().second++;
        }
        all.insert(tem);
    }
    map<int,int>to;
    int counter=0;
    for(int i:all){
        to[i]=counter++;
    }
    for(int i=0;i<n;i++){
        a[i].first=to[a[i].first];
    }
    deque<pii> d{a[0]};
    for(int i=1;i<a.size();i++){
        d.pb(a[i]);
        d.push_front(a[i]);
    }
    segtree st(counter);
    for(int i=0;i<d.size();i++){
        pii too=st.query(d[i].first);
        if(too==pii{0,0}){
            too={1,formula(d[i].second)};
        }else{
            too.first++;
            too.second=mul(too.second,formula(d[i].second));
        }
        //cerr<<d[i]<<" {"<<too.first<<" "<<too.second<<"}\n";
        st.update(d[i].first,too);
    }
    pii ans=st.query(counter);
    cout<<ans.first<<" "<<ans.second<<"\n";
}

signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);cout.tie(NULL);
#ifdef Local  
    freopen(".in","r",stdin);
    freopen(".out","w",stdout);
#else
    //freopen("grass.in","r",stdin);
    //freopen("grass.out","w",stdout);
#endif
    int t=1;
    //cin>>t;
    while (t--)
    {
        solve();
    }
}

Compilation message (stderr)

zoltan.cpp: In function 'void solve()':
zoltan.cpp:125:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  125 |     for(int i=1;i<a.size();i++){
      |                 ~^~~~~~~~~
zoltan.cpp:130:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::deque<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  130 |     for(int i=0;i<d.size();i++){
      |                 ~^~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...