Submission #721214

# Submission time Handle Problem Language Result Execution time Memory
721214 2023-04-10T14:01:51 Z bin9638 Comparing Plants (IOI20_plants) C++17
0 / 100
284 ms 72064 KB
#include <bits/stdc++.h>

#ifndef SKY
#include "plants.h"
#endif // SKY

using namespace std;

#define N 400010
#define ll long long
#define fs first
#define sc second
#define ii pair<int,int>
#define pb push_back

int dem,k,n,h[N],a[N],pre[N][21],nxt[N][21],LOG;

struct IT
{
    struct node
    {
        ii min_val,max_val;
        int t=0;
    }ST[N*4];

    void down(int id)
    {
        ST[id*2].min_val.fs+=ST[id].t;
        ST[id*2].max_val.fs+=ST[id].t;
        ST[id*2].t+=ST[id].t;
        ST[id*2+1].min_val.fs+=ST[id].t;
        ST[id*2+1].max_val.fs+=ST[id].t;
        ST[id*2+1].t+=ST[id].t;
        ST[id].t=0;
    }

    void update(int id,int l,int r,int i,ii val)
    {
        if(l>i||r<i)
            return;
        if(l==r)
        {
            ST[id].min_val=ST[id].max_val=val;
            return;
        }
        down(id);
        int mid=(l+r)/2;
        update(id*2,l,mid,i,val);
        update(id*2+1,mid+1,r,i,val);
        ST[id].min_val=min(ST[id*2].min_val,ST[id*2+1].min_val);
        ST[id].max_val=max(ST[id*2].max_val,ST[id*2+1].max_val);
    }

    void them(int id,int l,int r,int u,int v,int val)
    {
        if(l>r||l>v||r<u)
            return;
        if(l>=u&&r<=v)
        {
            ST[id].t+=val;
            ST[id].min_val.fs+=val;
            ST[id].max_val.fs+=val;
            return;
        }
        down(id);
        int mid=(l+r)/2;
        them(id*2,l,mid,u,v,val);
        them(id*2+1,mid+1,r,u,v,val);
        ST[id].min_val=min(ST[id*2].min_val,ST[id*2+1].min_val);
        ST[id].max_val=max(ST[id*2].max_val,ST[id*2+1].max_val);
    }

    ii get_min(int id,int l,int r,int u,int v)
    {
        if(l>v||r<u)
            return {1e9,-1};
        if(l>=u&&r<=v)
            return ST[id].min_val;
        down(id);
        int mid=(l+r)/2;
        return min(get_min(id*2,l,mid,u,v),get_min(id*2+1,mid+1,r,u,v));
    }

    ii get_max(int id,int l,int r,int u,int v)
    {
        if(l>v||r<u)
            return {-1e9,-1};
        if(l>=u&&r<=v)
            return ST[id].max_val;
        down(id);
        int mid=(l+r)/2;
        return max(get_max(id*2,l,mid,u,v),get_max(id*2+1,mid+1,r,u,v));
    }
}T;

void build(int i)
{
    while(T.get_min(1,1,n*2,i+1+n-k+1,i+1+n-1).fs==0)
    {
        build(T.get_min(1,1,n*2,i+1+n-k+1,i+1+n-1).sc);
    }
    T.them(1,1,n*2,i+1+n-k+1,i+1+n-1,-1);
    if(i-k+1>=0)
    {
        T.them(1,1,n*2,i+1-k+1,i+1-1,-1);
    }else
    {
        T.them(1,1,n*2,1,i+1-1,-1);
        T.them(1,1,n*2,n*2-(k-i-2),n*2,-1);
    }
    T.update(1,1,n*2,i+1,{1e9,i});
    T.update(1,1,n*2,i+n+1,{1e9,i});
    h[i]=--dem;
}

bool check_hihi(int u)
{
    if(a[u]!=0)
        return 0;
    for(int j=1;j<k;j++)
        if(a[(u-j+n)%n]==0)
            return 0;
    return 1;
}

void init(int cc, vector<int> r)
{
	k=cc;
	n=r.size();
	for(int i=0;i<n;i++)
    {
        a[i]=r[i];
        T.update(1,1,n*2,i+1,{a[i],i});
        T.update(1,1,n*2,i+n+1,{a[i],i});
    }
   /* dem=n;
    for(int i=0;i<n;i++)
    {
        build(T.get_min(1,1,n*2,1,n*2).sc);
     //   for(int i=0;i<n;i++)cout<<T.get_max(1,1,n*2,i+1,i+1).fs<<" ";cout<<endl;
    }*/
        int dem=n;
    for(int t=0;t<n;t++)
    {
    for(int i=0;i<n;i++)
        if(check_hihi(i))
        {
            h[i]=--dem;
            for(int j=0;j<k;j++)
                a[(i-j+n)%n]--;
            break;
        }
    }
 //   for(int i=0;i<n;i++)cout<<h[i]<<" ";cout<<endl;
    for(int i=0;i<n;i++)
    {
        T.update(1,1,n*2,i+1,{-1e9,-1});
        T.update(1,1,n*2,i+n+1,{-1e9,-1});
    }
    vector<ii>s;
    for(int i=0;i<n;i++)
        s.pb({h[i],i});
    sort(s.begin(),s.end());
    memset(pre,-1,sizeof(pre));
    memset(nxt,-1,sizeof(nxt));
    for(auto cc:s)
    {
        int i=cc.sc;
        pre[i][0]=T.get_max(1,1,n*2,i+1+n-k+1,i+1+n-1).sc;
        nxt[i][0]=T.get_max(1,1,n*2,i+1+1,i+1+k-1).sc;
        T.update(1,1,n*2,i+1,cc);
        T.update(1,1,n*2,i+n+1,cc);
        //cout<<i<<" "<<pre[i][0]<<" "<<nxt[i][0]<<endl;
    }
    LOG=log2(n);
    for(int k=1;k<=LOG;k++)
        for(int i=0;i<n;i++)
        {
            pre[i][k]=(pre[i][k-1]==-1 ? -1 : pre[pre[i][k-1]][k-1]);
            nxt[i][k]=(nxt[i][k-1]==-1 ? -1 :nxt[nxt[i][k-1]][k-1]);
        }
}

bool check(int x,int y)
{
   // cout<<pre[1][0]<<endl;
    if(x<y)
    {
        int vt=x;
        for(int k=LOG;k>=0;k--)
            if(pre[vt][k]!=-1&&!(pre[vt][k]>x&&pre[vt][k]<=y)&&(pre[vt][k]<=x ? pre[vt][k]+n-y : pre[vt][k]-y)>k-1)
                vt=pre[vt][k];
        if((vt<=x ? vt+n-y : vt-y)>k-1)
            vt=pre[vt][0];
        if(vt!=-1&&(vt<=x ? vt+n-y : vt-y)<=k-1&&h[vt]>=h[y])
            return 1;
        vt=x;
        for(int k=LOG;k>=0;k--)
            if(nxt[vt][k]!=-1&&(nxt[vt][k]>=x&&nxt[vt][k]<=y)&&(y-nxt[vt][k])>k-1)
                vt=nxt[vt][k];
         if(y-vt>k-1)
            vt=nxt[vt][0];
         if(vt!=-1&&y-vt<=k-1&&h[vt]>=h[y])
            return 1;
    }else
    {
          int vt=x;
        for(int k=LOG;k>=0;k--)
            if(pre[vt][k]!=-1&&(pre[vt][k]<=x&&pre[vt][k]>=y)&&pre[vt][k]-y>k-1)
                vt=pre[vt][k];
        if(vt-y>k-1)
            vt=pre[vt][0];
        if(vt!=-1&&vt-y<=k-1&&h[vt]>=h[y])
            return 1;
        vt=x;
        for(int k=LOG;k>=0;k--)
            if(nxt[vt][k]!=-1&&!(nxt[vt][k]<=x&&nxt[vt][k]>y)&&(nxt[vt][k]>=y ? x+n-nxt[vt][k] : x-nxt[vt][k])>k-1)
                vt=nxt[vt][k];
         if((vt>=y ? x+n-vt : x-vt)>k-1)
            vt=nxt[vt][0];
        if(vt!=-1&&(vt>=y ? x+n-vt : x-vt)<=k-1&&h[vt]>=h[y])
            return 1;
    }
    return 0;
}

int compare_plants(int x, int y)
{
    if(check(x,y))
        return 1;
    if(check(y,x))
        return -1;
    return 0;
}

#ifdef SKY
int main()
{
    freopen("A.inp","r",stdin);
    freopen("A.out","w",stdout);
    ios::sync_with_stdio(0);
    cin.tie(NULL);
    cout.tie(NULL);
    int n,k;
    cin>>n>>k;
    vector<int>r(n);
    for(int i=0;i<n;i++)
        cin>>r[i];//,cout<<r[i]<<endl;
    init(k,r);
    int q;
    cin>>q;
    while(q--)
    {
        int x,y;
        cin>>x>>y;
        cout<<compare_plants(x,y)<<endl;
    }
    return 0;
}
#endif
# Verdict Execution time Memory Grader output
1 Correct 24 ms 66004 KB Output is correct
2 Correct 25 ms 65980 KB Output is correct
3 Correct 25 ms 66040 KB Output is correct
4 Correct 24 ms 65972 KB Output is correct
5 Correct 28 ms 66044 KB Output is correct
6 Correct 78 ms 69020 KB Output is correct
7 Incorrect 284 ms 72064 KB Output isn't correct
8 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 25 ms 66032 KB Output is correct
2 Correct 27 ms 66040 KB Output is correct
3 Correct 26 ms 66008 KB Output is correct
4 Incorrect 30 ms 66008 KB Output isn't correct
5 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 25 ms 66032 KB Output is correct
2 Correct 27 ms 66040 KB Output is correct
3 Correct 26 ms 66008 KB Output is correct
4 Incorrect 30 ms 66008 KB Output isn't correct
5 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 24 ms 65996 KB Output is correct
2 Correct 24 ms 65968 KB Output is correct
3 Incorrect 110 ms 69272 KB Output isn't correct
4 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 25 ms 66036 KB Output is correct
2 Correct 24 ms 66068 KB Output is correct
3 Incorrect 24 ms 65944 KB Output isn't correct
4 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 24 ms 66004 KB Output is correct
2 Correct 24 ms 65996 KB Output is correct
3 Incorrect 25 ms 66004 KB Output isn't correct
4 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 24 ms 66004 KB Output is correct
2 Correct 25 ms 65980 KB Output is correct
3 Correct 25 ms 66040 KB Output is correct
4 Correct 24 ms 65972 KB Output is correct
5 Correct 28 ms 66044 KB Output is correct
6 Correct 78 ms 69020 KB Output is correct
7 Incorrect 284 ms 72064 KB Output isn't correct
8 Halted 0 ms 0 KB -