# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
548024 | FEDIKUS | Zoltan (COCI16_zoltan) | C++17 | 0 ms | 0 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
#define mp make_pair
#define pb push_back
#define pf push_front
#define popb pop_back
#define popf pop_front
#define xx first
#define yy second
#define ff(i,s,f) for(ll (i)=s;(i)<(f);(i)++)
#define fb(i,s,f) for(ll (i)=s-1;(i)>=f;(i)--)
#define ffi(i,s,f) for(ll (i)=s;(i)<=(f);(i)++)
#define fbi(i,s,f) for(ll (i)=s;(i)>=(f);(i)--)
#define srt(a) sort(a.begin(),a.end());
#define srtg(a,ll) sort(a.begin(),a.end(),greater<ll>())
#define lb(a,x) lower_bound(a.begin(),a.end(),x)
#define ub(a,x) upper_bound(a.begin(),a.end(),x)
#define fnd(a,x) find(a.begin(),a.end(),x)
#define vstart auto startt=chrono::system_clock::now()
#define vend auto endd=chrono::system_clock::now()
#define vvreme chrono::duration<double> vremee=endd-startt
#define ios ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0)
using namespace std;
typedef long long ll;
typedef pair<ll,ll> pii;
typedef pair<ll,ll> pll;
typedef string str;
const ll maxn=2e5+10;
const ll mod=1e9+7;
ll niz[maxn];
ll compr[maxn];
pii seginc[4*maxn];
pii segdec[4*maxn];
pii incr[maxn];
pii decr[maxn];
ll n;
ll add(ll a,ll b){
return (a+b)%mod;
}
ll mul(ll a,ll b){
return a*b%mod;
}
ll pwr(ll a,ll b){
ll ret=1;
while(b){
if(b&1) ret=mul(ret,a);
b/=2;
a=mul(a,a);
}
return ret;
}
pii comb(const pii a,const pii b){
pii ret;
if(a.xx==b.xx) ret={a.xx,a.yy+b.yy};
else ret=max(a,b);
return ret;
}
void update(ll t,pii v,pii *seg,ll ind=1,ll l=0,ll r=n-1){
if(l==r){
seg[ind]=v;
return;
}
ll mid=l+(r-l)/2;
if(t<=mid) update(t,v,seg,2*ind,l,mid);
else update(t,v,seg,2*ind+1,mid+1,r);
seg[ind]=comb(seg[2*ind],seg[2*ind+1]);
}
pii query(ll tl,ll tr,pii *seg,ll ind=1,ll l=0,ll r=n-1){
if(tl<=l && r<=tr) return seg[ind];
ll mid=l+(r-l)/2;
pii ret={0,0};
if(tl<=mid) ret=comb(ret,query(tl,tr,seg,2*ind,l,mid));
if(tr>mid) ret=comb(ret,query(tl,tr,seg,2*ind+1,mid+1,r));
return ret;
}
void solve(){
cin>>n;
ff(i,0,n){
cin>>niz[i];
compr[i]=niz[i];
}
sort(compr,compr+n);
ff(i,0,n){
niz[i]=lower_bound(compr,compr+n,niz[i])-compr;
}
fb(i,n,0){
{//decr
pii qry;
if(niz[i]>0) qry=query(0,niz[i]-1,segdec);
else qry={0,0};
qry.xx++;
qry=max(qry,mp(1,1));
update(niz[i],qry,segdec);
incr[i]=qry;
}
{//incr
pii qry;
if(niz[i]<n-1) qry=query(niz[i]+1,n-1,seginc);
else qry={0,0};
qry.xx++;
qry=max(qry,mp(1,1));
update(niz[i],qry,seginc);
decr[i]=qry;
}
}
pii res=mp(0,0);
ff(i,0,n){
pii tren={incr[i].xx+decr[i].xx-1,mul(incr[i].yy,decr[i].yy)};
if(res.xx==tren.xx) res.yy=add(res.yy,tren.yy);
else res=max(res,tren);
}
cout<<res.xx<<" "<<mul(res.yy,pwr(2,n-res.xx));
}
int main(){
ios;
ll t=1;
// cin>>t;
while(t--) solve();
return 0;
}