Submission #1191482

#TimeUsernameProblemLanguageResultExecution timeMemory
1191482simona1230Teams (IOI15_teams)C++20
0 / 100
872 ms120188 KiB
#include "teams.h"
#include <bits/stdc++.h>
using namespace std;
const int maxn=5*1e5+5;

int n;
vector<int> v[4*maxn];
void update(int i,int l,int r,int id,int vl)
{
    if(l==r)
    {
        v[i].push_back(vl);
        return;
    }

    int m=(l+r)/2;
    if(id<=m)update(i*2,l,m,id,vl);
    else update(i*2+1,m+1,r,id,vl);
}

void build(int i,int l,int r)
{
    if(l==r)
    {
        sort(v[i].begin(),v[i].end());
        return;
    }

    int m=(l+r)/2;
    build(i*2,l,m);
    build(i*2+1,m+1,r);

    int i1=0,i2=0;
    while(i1<v[i*2].size()&&i2<v[i*2+1].size())
    {
        if(v[i*2][i1]<v[i*2+1][i2])v[i].push_back(v[i*2][i1++]);
        else v[i].push_back(v[i*2+1][i2++]);
    }

    while(i1<v[i*2].size())
        v[i].push_back(v[i*2][i1++]);

    while(i2<v[i*2+1].size())
        v[i].push_back(v[i*2+1][i2++]);
}

void init(int N, int A[], int B[])
{
    n=N;
    for(int i=0;i<n;i++)
        update(1,1,n,A[i],B[i]);

    build(1,1,n);
}

int query(int i,int l,int r,int ql,int qr,int id)
{
    if(ql>qr)return 0;
    if(ql<=l&&r<=qr)
    {
        int id=v[i].size();
        int lf=0,rt=v[i].size()-1;
        while(lf<=rt)
        {
            int m=(lf+rt)/2;
            if(v[i][m]>=id)
            {
                id=m;
                rt=m-1;
            }
            else lf=m+1;
        }

        return v[i].size()-id;
    }

    int m=(l+r)/2;
    return query(i*2,l,m,ql,min(qr,m),id)+query(i*2+1,m+1,r,max(m+1,ql),qr,id);
}

int dp[maxn];
int can(int m, int k[])
{
    sort(k,k+m);
    stack<pair<int,int> > s;
    s.push({-1,m});
    int minn=0;
    for(int i=0;i<m;i++)
    {
        while(s.size()&&s.top().second==i)s.pop();
        if(s.top().first==-1)dp[i]=query(1,1,n,1,k[i],k[i])-k[i];
        else dp[i]=dp[s.top().first]+query(1,1,n,k[s.top().first]+1,k[i],k[i])-k[i];

        int p=0,pv=0;
        if(s.top().first!=-1)
        {
            p=k[s.top().first];
            pv=dp[p];
        }

        int id=m;
        int l=i+1,r=m-1;
        while(l<=r)
        {
            int md=(l+r)/2;
            if(pv+query(1,1,n,p+1,k[md],k[md])<=dp[i]+query(1,1,n,k[i]+1,k[md],k[md]))
            {
                id=md;
                r=md-1;
            }
            else l=md+1;
        }

        minn=min(minn,dp[i]);
        s.push({i,id});

    }
    if(minn<0)return 0;
    return 1;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...