Submission #1199328

#TimeUsernameProblemLanguageResultExecution timeMemory
1199328prideliqueeeMountains (NOI20_mountains)C++20
66 / 100
2096 ms19184 KiB
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define f first
#define s second
int a[300010];
pair<int,int> mm[1200010];
void build(int l,int r,int i)
{
    if(l==r)
    {
        mm[i]={a[l],a[l]};
        return;
    }
    int mid=(l+r)/2;
    build(l,mid,i*2);
    build(mid+1,r,i*2+1);
    mm[i]={min(mm[i*2].f,mm[i*2+1].f),max(mm[i*2].s,mm[i*2+1].s)};
}
int sum;
void query(int l,int r,int i,int ql,int qr,int val)
{
    //cout<<l<<' '<<r<<' '<<mm[i].f<<' '<<mm[i].s<<endl;
    if(qr<l||ql>r)
    return;
    if(ql<=l&&qr>=r)
    {
        if(mm[i].s<val)
        {
            sum+=(r-l+1);
            return;
        }
        else if(mm[i].f>=val)
        return;
    }
    int mid=(l+r)/2;
    query(l,mid,i*2,ql,qr,val);
    query(mid+1,r,i*2+1,ql,qr,val);
}
signed main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    cin>>a[i];
    build(1,n,1);
    int cnt=0;
    for(int i=2;i<n;i++)
    {
        int x=1;
        sum=0;
        query(1,n,1,1,i-1,a[i]);
        x*=sum;
        //cout<<i<<' '<<sum<<' ';
        sum=0;
        query(1,n,1,i+1,n,a[i]);
        //cout<<sum<<' '<<endl;
        x*=sum;
        cnt+=x;
    }
    cout<<cnt;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...