Submission #304019

# Submission time Handle Problem Language Result Execution time Memory
304019 2020-09-21T00:50:18 Z daniel920712 Comparing Plants (IOI20_plants) C++14
5 / 100
185 ms 178040 KB
#include "plants.h"
#include <stdio.h>
#include <vector>
#include <utility>
#include <set>
using namespace std;
vector < int > all;
vector < int > ttt;
vector < int > Next[200005];
vector < pair < int , int > > con[200005];
int N,tt=0;
bool use[2000005]={0};
int Con[200005];
int what[200005];
int now=1;
struct A
{
    int l,r;
    int nxl,nxr;
    int small1,small2;
    int add1,add2;
    int con=0,con1;
}Node[2000005];
void build(int l,int r,int here)
{
    Node[here].l=l;
    Node[here].r=r;
    Node[here].add1=0;
    Node[here].add2=0;
    Node[here].small1=0;
    Node[here].con=0;
    Node[here].con1=0;
    if(l==r)
    {
        Node[here].small2=all[l];
        Node[here].con1=1;
        return ;
    }
    Node[here].nxl=now++;
    Node[here].nxr=now++;
    build(l,(l+r)/2,Node[here].nxl);
    build((l+r)/2+1,r,Node[here].nxr);
    Node[here].small2=min(Node[Node[here].nxl].small2,Node[Node[here].nxr].small2);
    Node[here].small1=min(Node[Node[here].nxl].small1,Node[Node[here].nxr].small1);
    if(Node[Node[here].nxl].small2==Node[here].small2) Node[here].con1+=Node[Node[here].nxl].con1;
    if(Node[Node[here].nxr].small2==Node[here].small2) Node[here].con1+=Node[Node[here].nxr].con1;
}
void UPD(int here)
{
    Node[Node[here].nxl].add1+=Node[here].add1;
    Node[Node[here].nxl].small1+=Node[here].add1;
    Node[Node[here].nxr].add1+=Node[here].add1;
    Node[Node[here].nxr].small1+=Node[here].add1;
    Node[here].add1=0;

    Node[Node[here].nxl].add2+=Node[here].add2;
    Node[Node[here].nxl].small2+=Node[here].add2;
    Node[Node[here].nxr].add2+=Node[here].add2;
    Node[Node[here].nxr].small2+=Node[here].add2;
    Node[here].add2=0;
}
void cha1(int l,int r,int con,int here)
{
    if(l>r) return ;
    if(l==Node[here].l&&r==Node[here].r)
    {
        Node[here].add1+=con;
        Node[here].small1+=con;
        return;
    }
    UPD(here);
    if(r<=(Node[here].l+Node[here].r)/2) cha1(l,r,con,Node[here].nxl);
    else if(l>(Node[here].l+Node[here].r)/2) cha1(l,r,con,Node[here].nxr);
    else
    {
        cha1(l,(Node[here].l+Node[here].r)/2,con,Node[here].nxl);
        cha1((Node[here].l+Node[here].r)/2+1,r,con,Node[here].nxr);
    }
    Node[here].small2=min(Node[Node[here].nxl].small2,Node[Node[here].nxr].small2);
    Node[here].small1=min(Node[Node[here].nxl].small1,Node[Node[here].nxr].small1);
    if(Node[Node[here].nxl].small2==Node[here].small2) Node[here].con1+=Node[Node[here].nxl].con1;
    if(Node[Node[here].nxr].small2==Node[here].small2) Node[here].con1+=Node[Node[here].nxr].con1;
}

void cha2(int l,int r,int con,int here)
{
    if(l>r) return ;
    if(l==Node[here].l&&r==Node[here].r)
    {
        Node[here].add2+=con;
        Node[here].small2+=con;
        return;
    }
    UPD(here);
    if(r<=(Node[here].l+Node[here].r)/2) cha2(l,r,con,Node[here].nxl);
    else if(l>(Node[here].l+Node[here].r)/2) cha2(l,r,con,Node[here].nxr);
    else
    {
        cha2(l,(Node[here].l+Node[here].r)/2,con,Node[here].nxl);
        cha2((Node[here].l+Node[here].r)/2+1,r,con,Node[here].nxr);
    }
    Node[here].small2=min(Node[Node[here].nxl].small2,Node[Node[here].nxr].small2);
    Node[here].small1=min(Node[Node[here].nxl].small1,Node[Node[here].nxr].small1);
    if(Node[Node[here].nxl].small2==Node[here].small2) Node[here].con1+=Node[Node[here].nxl].con1;
    if(Node[Node[here].nxr].small2==Node[here].small2) Node[here].con1+=Node[Node[here].nxr].con1;
}
int Find1(int where,int here)
{
    if(Node[here].l==where&&Node[here].r==where) return Node[here].small1;
    UPD(here);
    if(where<=(Node[here].l+Node[here].r)/2) return Find1(where,Node[here].nxl);
    else return Find1(where,Node[here].nxr);
}
int Find2(int where,int here)
{
    if(Node[here].l==where&&Node[here].r==where) return Node[here].small1;
    UPD(here);
    if(where<=(Node[here].l+Node[here].r)/2) return Find2(where,Node[here].nxl);
    else return Find2(where,Node[here].nxr);
}
void New(int here)
{
    if(Node[here].l==Node[here].r)
    {
        ttt.push_back(Node[here].l);
        Node[here].con++;
        return;
    }
    UPD(here);
    if(Node[Node[here].nxl].con!=Node[Node[here].nxl].con1&&Node[Node[here].nxl].small2==0) New(Node[here].nxl);
    if(Node[Node[here].nxr].con!=Node[Node[here].nxr].con1&&Node[Node[here].nxr].small2==0) New(Node[here].nxr);
    Node[here].con=Node[Node[here].nxl].con+Node[Node[here].nxr].con;
}
void init(int k,vector<int> r)
{
    int a=0,b=0,i,j,ok=0,l,t,t2,x,ll,rr;
    all=r;
    N=r.size();
    if(k==2) tt=1;
    for(i=0;i<N;i++)
    {
        if(k==2)
        {
            if(r[(i+N-1)%N]!=r[i])
            {
                b=0;
                a++;
                con[i].push_back(make_pair(a,0));
                for(j=(i+1)%N;r[(j+N-1)%N]==r[i];j=(j+1)%N)
                {
                    if(j==N-1) ok=1;
                    if(r[i]==0) b--;
                    else b++;
                    con[j].push_back(make_pair(a,b));
                }
            }
        }
        else
        {
            build(0,N-1,0);
            ttt.clear();
            New(0);
            for(auto t:ttt)
            {
                t2=(t+k-1)%N;
                if(t2>=t) cha1(t+1,t2,1,0);
                else
                {
                    cha1(t+1,N-1,1,0);
                    cha1(0,t2,1,0);
                }
            }
            for(i=0;i<N;i++)
            {
                for(j=0;j<N;j++)
                {
                    if(use[j]==0&&Find1(j,0)==0&&Find2(j,0))
                    {
                        x=j;
                        break;
                    }
                }
                what[x]=i;
                use[x]=1;
                t=(x+k-1)%N;
                if(t>=x) cha1(x+1,t,-1,0);
                else
                {
                    cha1(x+1,N-1,-1,0);
                    cha1(0,t,-1,0);
                }

                ll=(x-(k-1)+N)%N;
                rr=(x-1+N)%N;
                if(rr>=ll) cha2(ll,rr,-1,0);
                else
                {
                    cha2(ll,N-1,-1,0);
                    cha2(0,rr,-1,0);
                }
                ttt.clear();
                New(0);
                for(auto t:ttt)
                {
                    t2=(t+k-1)%N;
                    if(t2>=t) cha1(t+1,t2,1,0);
                    else
                    {
                        cha1(t+1,N-1,1,0);
                        cha1(0,t2,1,0);
                    }
                }

            }
        }
    }
	return;
}
bool F(int A,int B)
{
    if(A==B) return 1;
    if(use[A]) return 0;
    use[A]=1;
    for(auto i:Next[A]) if(F(i,B)) return 1;
    return 0;
}
int compare_plants(int x, int y)
{
    int i;
    if(tt)
    {
        for(auto i:con[x])
        {
            for(auto j:con[y])
            {
                if(i.first==j.first)
                {
                    if(i.second<j.second) return -1;
                    return 1;
                }
            }
        }

    }
    else
    {
        if(what[x]<what[y]) return 1;
        else return -1;
    }

	return 0;
}

Compilation message

plants.cpp: In function 'void init(int, std::vector<int>)':
plants.cpp:136:21: warning: variable 'ok' set but not used [-Wunused-but-set-variable]
  136 |     int a=0,b=0,i,j,ok=0,l,t,t2,x,ll,rr;
      |                     ^~
plants.cpp:136:26: warning: unused variable 'l' [-Wunused-variable]
  136 |     int a=0,b=0,i,j,ok=0,l,t,t2,x,ll,rr;
      |                          ^
plants.cpp: In function 'int compare_plants(int, int)':
plants.cpp:229:9: warning: unused variable 'i' [-Wunused-variable]
  229 |     int i;
      |         ^
plants.cpp: In function 'void init(int, std::vector<int>)':
plants.cpp:194:22: warning: 'x' may be used uninitialized in this function [-Wmaybe-uninitialized]
  194 |                 rr=(x-1+N)%N;
      |                     ~^~
# Verdict Execution time Memory Grader output
1 Correct 47 ms 87928 KB Output is correct
2 Correct 47 ms 88056 KB Output is correct
3 Correct 47 ms 87928 KB Output is correct
4 Correct 47 ms 87928 KB Output is correct
5 Correct 48 ms 87928 KB Output is correct
6 Correct 116 ms 90796 KB Output is correct
7 Correct 133 ms 91672 KB Output is correct
8 Correct 182 ms 98936 KB Output is correct
9 Correct 182 ms 99068 KB Output is correct
10 Correct 185 ms 99064 KB Output is correct
11 Correct 184 ms 98936 KB Output is correct
12 Correct 184 ms 98936 KB Output is correct
13 Correct 181 ms 98936 KB Output is correct
14 Correct 182 ms 98936 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 47 ms 87928 KB Output is correct
2 Correct 48 ms 87928 KB Output is correct
3 Runtime error 169 ms 178040 KB Execution killed with signal 11 (could be triggered by violating memory limits)
4 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 47 ms 87928 KB Output is correct
2 Correct 48 ms 87928 KB Output is correct
3 Runtime error 169 ms 178040 KB Execution killed with signal 11 (could be triggered by violating memory limits)
4 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 47 ms 87928 KB Output is correct
2 Runtime error 168 ms 178040 KB Execution killed with signal 11 (could be triggered by violating memory limits)
3 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 47 ms 88056 KB Output is correct
2 Correct 47 ms 87928 KB Output is correct
3 Correct 50 ms 88056 KB Output is correct
4 Runtime error 167 ms 178028 KB Execution killed with signal 11 (could be triggered by violating memory limits)
5 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 48 ms 88060 KB Output is correct
2 Correct 48 ms 87932 KB Output is correct
3 Correct 47 ms 87936 KB Output is correct
4 Runtime error 166 ms 178040 KB Execution killed with signal 11 (could be triggered by violating memory limits)
5 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 47 ms 87928 KB Output is correct
2 Correct 47 ms 88056 KB Output is correct
3 Correct 47 ms 87928 KB Output is correct
4 Correct 47 ms 87928 KB Output is correct
5 Correct 48 ms 87928 KB Output is correct
6 Correct 116 ms 90796 KB Output is correct
7 Correct 133 ms 91672 KB Output is correct
8 Correct 182 ms 98936 KB Output is correct
9 Correct 182 ms 99068 KB Output is correct
10 Correct 185 ms 99064 KB Output is correct
11 Correct 184 ms 98936 KB Output is correct
12 Correct 184 ms 98936 KB Output is correct
13 Correct 181 ms 98936 KB Output is correct
14 Correct 182 ms 98936 KB Output is correct
15 Correct 47 ms 87928 KB Output is correct
16 Correct 48 ms 87928 KB Output is correct
17 Runtime error 169 ms 178040 KB Execution killed with signal 11 (could be triggered by violating memory limits)
18 Halted 0 ms 0 KB -