답안 #304022

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
304022 2020-09-21T01:01:37 Z daniel920712 식물 비교 (IOI20_plants) C++14
5 / 100
511 ms 99064 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);
    Node[here].con1=0;
    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);
    Node[here].con1=0;
    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);
    Node[here].con1=0;
    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].small2;
    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)==0)
                    {
                        x=j;
                        break;
                    }
                }
                //printf("aa %d\n",x);
                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:139:21: warning: variable 'ok' set but not used [-Wunused-but-set-variable]
  139 |     int a=0,b=0,i,j,ok=0,l,t,t2,x,ll,rr;
      |                     ^~
plants.cpp:139:26: warning: unused variable 'l' [-Wunused-variable]
  139 |     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:233:9: warning: unused variable 'i' [-Wunused-variable]
  233 |     int i;
      |         ^
plants.cpp: In function 'void init(int, std::vector<int>)':
plants.cpp:198:22: warning: 'x' may be used uninitialized in this function [-Wmaybe-uninitialized]
  198 |                 rr=(x-1+N)%N;
      |                     ~^~
# 결과 실행 시간 메모리 Grader output
1 Correct 48 ms 87928 KB Output is correct
2 Correct 48 ms 87932 KB Output is correct
3 Correct 48 ms 88056 KB Output is correct
4 Correct 47 ms 88056 KB Output is correct
5 Correct 48 ms 88056 KB Output is correct
6 Correct 116 ms 90872 KB Output is correct
7 Correct 134 ms 91640 KB Output is correct
8 Correct 181 ms 98912 KB Output is correct
9 Correct 181 ms 98992 KB Output is correct
10 Correct 180 ms 99064 KB Output is correct
11 Correct 183 ms 98936 KB Output is correct
12 Correct 183 ms 98936 KB Output is correct
13 Correct 177 ms 98984 KB Output is correct
14 Correct 178 ms 98936 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 48 ms 87928 KB Output is correct
2 Correct 48 ms 87936 KB Output is correct
3 Correct 47 ms 87948 KB Output is correct
4 Correct 48 ms 87928 KB Output is correct
5 Incorrect 49 ms 87928 KB Output isn't correct
6 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 48 ms 87928 KB Output is correct
2 Correct 48 ms 87936 KB Output is correct
3 Correct 47 ms 87948 KB Output is correct
4 Correct 48 ms 87928 KB Output is correct
5 Incorrect 49 ms 87928 KB Output isn't correct
6 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 47 ms 87928 KB Output is correct
2 Correct 47 ms 87928 KB Output is correct
3 Incorrect 511 ms 91000 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 50 ms 88056 KB Output is correct
2 Correct 47 ms 87928 KB Output is correct
3 Correct 49 ms 87928 KB Output is correct
4 Correct 48 ms 87928 KB Output is correct
5 Incorrect 49 ms 88056 KB Output isn't correct
6 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 47 ms 87928 KB Output is correct
2 Correct 48 ms 88072 KB Output is correct
3 Correct 48 ms 87928 KB Output is correct
4 Incorrect 48 ms 87928 KB Output isn't correct
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 48 ms 87928 KB Output is correct
2 Correct 48 ms 87932 KB Output is correct
3 Correct 48 ms 88056 KB Output is correct
4 Correct 47 ms 88056 KB Output is correct
5 Correct 48 ms 88056 KB Output is correct
6 Correct 116 ms 90872 KB Output is correct
7 Correct 134 ms 91640 KB Output is correct
8 Correct 181 ms 98912 KB Output is correct
9 Correct 181 ms 98992 KB Output is correct
10 Correct 180 ms 99064 KB Output is correct
11 Correct 183 ms 98936 KB Output is correct
12 Correct 183 ms 98936 KB Output is correct
13 Correct 177 ms 98984 KB Output is correct
14 Correct 178 ms 98936 KB Output is correct
15 Correct 48 ms 87928 KB Output is correct
16 Correct 48 ms 87936 KB Output is correct
17 Correct 47 ms 87948 KB Output is correct
18 Correct 48 ms 87928 KB Output is correct
19 Incorrect 49 ms 87928 KB Output isn't correct
20 Halted 0 ms 0 KB -