답안 #304273

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
304273 2020-09-21T05:30:02 Z daniel920712 식물 비교 (IOI20_plants) C++14
60 / 100
1618 ms 106872 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;
bool can[305][305];
struct A
{
    int l,r;
    int nxl,nxr;
    int small1,small2,small3;
    int big2;
    int add1,add2;
    int ok=0;
}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].small3=1e9;
    Node[here].ok=0;
    if(l==r)
    {
        Node[here].small2=all[l];
        Node[here].big2=all[l];
        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].small3=min(Node[Node[here].nxl].small3,Node[Node[here].nxr].small3);
    Node[here].small1=min(Node[Node[here].nxl].small1,Node[Node[here].nxr].small1);
    Node[here].big2=max(Node[Node[here].nxl].big2,Node[Node[here].nxr].big2);

}
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[Node[here].nxr].small3+=Node[here].add1;
    Node[Node[here].nxl].small3+=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[Node[here].nxl].big2+=Node[here].add2;
    Node[Node[here].nxr].big2+=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;
        Node[here].small3+=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].big2=max(Node[Node[here].nxl].big2,Node[Node[here].nxr].big2);
    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].small3=min(Node[Node[here].nxl].small3,Node[Node[here].nxr].small3);
    Node[here].ok=Node[Node[here].nxl].ok||Node[Node[here].nxr].ok;
}

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;
        Node[here].big2+=con;
        if(l==r&&con==1000000000) Node[here].small3=Node[here].small1;
        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].big2=max(Node[Node[here].nxl].big2,Node[Node[here].nxr].big2);
    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].small3=min(Node[Node[here].nxl].small3,Node[Node[here].nxr].small3);
    Node[here].ok=Node[Node[here].nxl].ok||Node[Node[here].nxr].ok;
}
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);
        return;
    }
    UPD(here);
    if(Node[Node[here].nxl].small2==0) New(Node[here].nxl);
    if(Node[Node[here].nxr].small2==0) New(Node[here].nxr);

}
int New2(int here)
{
    //printf("%d %d %d %d %d %d\n",Node[here].l,Node[here].r,Node[Node[here].nxl].big2,Node[Node[here].nxl].small1,Node[Node[here].nxr].big2,Node[Node[here].nxr].small1);
    if(Node[here].l==Node[here].r) return Node[here].l;
    UPD(here);
    if(Node[Node[here].nxl].small3==0&&Node[Node[here].nxl].big2>N) return New2(Node[here].nxl);
    else return New2(Node[here].nxr);

}
void F(int a,int b)
{
    if(use[b]) return ;
    use[b]=1;
    can[a][b]=1;
    for(auto i:Next[b]) F(a,i);

}
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(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 if(N<=300)
    {
        tt=2;
        for(i=0;i<N;i++)
        {
            if(r[i]==0)
            {
                for(j=1;j<k;j++)
                {
                    t=(i+j)%N;
                    Con[t]++;
                }
            }
        }
        for(i=0;i<N;i++)
        {
            for(j=0;j<N;j++)
            {
                if(use[j]==0&&Con[j]==0&&r[j]==0)
                {
                    x=j;
                    break;
                }
            }

            use[x]=1;
            for(j=1;j<k;j++)
            {
                t=(x+j)%N;
                Con[t]--;
                if(!use[t]) Next[t].push_back(x);
                else Next[x].push_back(t);
            }
            for(j=1;j<k;j++)
            {
                t=(x-j+2*N)%N;
                r[t]--;
                if(use[t]) Next[x].push_back(t);
                else Next[t].push_back(x);
                if(r[t]==0)
                {
                    for(l=1;l<k;l++)
                    {
                        t2=(t+l)%N;
                        Con[t2]++;
                    }
                }
            }
        }
        for(i=0;i<N;i++)
        {
            for(j=0;j<N;j++) use[j]=0;
            F(i,i);
        }
    }
    else
    {
        build(0,N-1,0);
        ttt.clear();
        New(0);
        for(auto t:ttt)
        {
            cha2(t,t,1e9,0);
            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++)
        {
            x=New2(0);
            cha1(x,x,1e9,0);
            what[x]=i;
            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)
            {
                cha2(t,t,1e9,0);
                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;
}

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

    }
    else if(tt==2)
    {
        if(can[x][y]) return -1;
        if(can[y][x]) return 1;
        return 0;
    }
    else
    {
        if(what[x]<what[y]) return 1;
        else return -1;
    }
}

Compilation message

plants.cpp: In function 'void init(int, std::vector<int>)':
plants.cpp:164:21: warning: variable 'ok' set but not used [-Wunused-but-set-variable]
  164 |     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:299:9: warning: unused variable 'i' [-Wunused-variable]
  299 |     int i;
      |         ^
# 결과 실행 시간 메모리 Grader output
1 Correct 46 ms 95740 KB Output is correct
2 Correct 47 ms 95736 KB Output is correct
3 Correct 48 ms 95864 KB Output is correct
4 Correct 47 ms 95740 KB Output is correct
5 Correct 53 ms 95736 KB Output is correct
6 Correct 111 ms 98680 KB Output is correct
7 Correct 131 ms 99576 KB Output is correct
8 Correct 182 ms 106744 KB Output is correct
9 Correct 182 ms 106872 KB Output is correct
10 Correct 177 ms 106752 KB Output is correct
11 Correct 175 ms 106744 KB Output is correct
12 Correct 174 ms 106744 KB Output is correct
13 Correct 172 ms 106744 KB Output is correct
14 Correct 179 ms 106744 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 47 ms 95736 KB Output is correct
2 Correct 47 ms 95740 KB Output is correct
3 Correct 48 ms 95864 KB Output is correct
4 Correct 47 ms 95864 KB Output is correct
5 Correct 48 ms 95992 KB Output is correct
6 Correct 51 ms 95864 KB Output is correct
7 Correct 137 ms 98808 KB Output is correct
8 Correct 50 ms 96120 KB Output is correct
9 Correct 51 ms 95864 KB Output is correct
10 Correct 137 ms 98808 KB Output is correct
11 Correct 137 ms 98680 KB Output is correct
12 Correct 136 ms 98808 KB Output is correct
13 Correct 138 ms 98788 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 47 ms 95736 KB Output is correct
2 Correct 47 ms 95740 KB Output is correct
3 Correct 48 ms 95864 KB Output is correct
4 Correct 47 ms 95864 KB Output is correct
5 Correct 48 ms 95992 KB Output is correct
6 Correct 51 ms 95864 KB Output is correct
7 Correct 137 ms 98808 KB Output is correct
8 Correct 50 ms 96120 KB Output is correct
9 Correct 51 ms 95864 KB Output is correct
10 Correct 137 ms 98808 KB Output is correct
11 Correct 137 ms 98680 KB Output is correct
12 Correct 136 ms 98808 KB Output is correct
13 Correct 138 ms 98788 KB Output is correct
14 Correct 224 ms 99064 KB Output is correct
15 Correct 1618 ms 101496 KB Output is correct
16 Correct 231 ms 99064 KB Output is correct
17 Correct 1616 ms 101368 KB Output is correct
18 Correct 1219 ms 102000 KB Output is correct
19 Correct 1250 ms 101368 KB Output is correct
20 Correct 1491 ms 101368 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 46 ms 95864 KB Output is correct
2 Correct 48 ms 95872 KB Output is correct
3 Correct 122 ms 98808 KB Output is correct
4 Correct 929 ms 101692 KB Output is correct
5 Correct 1067 ms 101740 KB Output is correct
6 Correct 1323 ms 101368 KB Output is correct
7 Correct 1517 ms 101372 KB Output is correct
8 Correct 1601 ms 101244 KB Output is correct
9 Correct 981 ms 101620 KB Output is correct
10 Correct 977 ms 101368 KB Output is correct
11 Correct 176 ms 106820 KB Output is correct
12 Correct 1039 ms 101368 KB Output is correct
13 Correct 1201 ms 102036 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 47 ms 95736 KB Output is correct
2 Correct 46 ms 95736 KB Output is correct
3 Correct 47 ms 95864 KB Output is correct
4 Correct 46 ms 95864 KB Output is correct
5 Correct 47 ms 95864 KB Output is correct
6 Correct 49 ms 95864 KB Output is correct
7 Correct 63 ms 96632 KB Output is correct
8 Correct 77 ms 97016 KB Output is correct
9 Correct 65 ms 96632 KB Output is correct
10 Correct 82 ms 97016 KB Output is correct
11 Correct 64 ms 96632 KB Output is correct
12 Correct 63 ms 96632 KB Output is correct
13 Correct 107 ms 97912 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 52 ms 95864 KB Output is correct
2 Correct 47 ms 95736 KB Output is correct
3 Correct 46 ms 95864 KB Output is correct
4 Correct 46 ms 95864 KB Output is correct
5 Incorrect 52 ms 95868 KB Output isn't correct
6 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 46 ms 95740 KB Output is correct
2 Correct 47 ms 95736 KB Output is correct
3 Correct 48 ms 95864 KB Output is correct
4 Correct 47 ms 95740 KB Output is correct
5 Correct 53 ms 95736 KB Output is correct
6 Correct 111 ms 98680 KB Output is correct
7 Correct 131 ms 99576 KB Output is correct
8 Correct 182 ms 106744 KB Output is correct
9 Correct 182 ms 106872 KB Output is correct
10 Correct 177 ms 106752 KB Output is correct
11 Correct 175 ms 106744 KB Output is correct
12 Correct 174 ms 106744 KB Output is correct
13 Correct 172 ms 106744 KB Output is correct
14 Correct 179 ms 106744 KB Output is correct
15 Correct 47 ms 95736 KB Output is correct
16 Correct 47 ms 95740 KB Output is correct
17 Correct 48 ms 95864 KB Output is correct
18 Correct 47 ms 95864 KB Output is correct
19 Correct 48 ms 95992 KB Output is correct
20 Correct 51 ms 95864 KB Output is correct
21 Correct 137 ms 98808 KB Output is correct
22 Correct 50 ms 96120 KB Output is correct
23 Correct 51 ms 95864 KB Output is correct
24 Correct 137 ms 98808 KB Output is correct
25 Correct 137 ms 98680 KB Output is correct
26 Correct 136 ms 98808 KB Output is correct
27 Correct 138 ms 98788 KB Output is correct
28 Correct 224 ms 99064 KB Output is correct
29 Correct 1618 ms 101496 KB Output is correct
30 Correct 231 ms 99064 KB Output is correct
31 Correct 1616 ms 101368 KB Output is correct
32 Correct 1219 ms 102000 KB Output is correct
33 Correct 1250 ms 101368 KB Output is correct
34 Correct 1491 ms 101368 KB Output is correct
35 Correct 46 ms 95864 KB Output is correct
36 Correct 48 ms 95872 KB Output is correct
37 Correct 122 ms 98808 KB Output is correct
38 Correct 929 ms 101692 KB Output is correct
39 Correct 1067 ms 101740 KB Output is correct
40 Correct 1323 ms 101368 KB Output is correct
41 Correct 1517 ms 101372 KB Output is correct
42 Correct 1601 ms 101244 KB Output is correct
43 Correct 981 ms 101620 KB Output is correct
44 Correct 977 ms 101368 KB Output is correct
45 Correct 176 ms 106820 KB Output is correct
46 Correct 1039 ms 101368 KB Output is correct
47 Correct 1201 ms 102036 KB Output is correct
48 Correct 47 ms 95736 KB Output is correct
49 Correct 46 ms 95736 KB Output is correct
50 Correct 47 ms 95864 KB Output is correct
51 Correct 46 ms 95864 KB Output is correct
52 Correct 47 ms 95864 KB Output is correct
53 Correct 49 ms 95864 KB Output is correct
54 Correct 63 ms 96632 KB Output is correct
55 Correct 77 ms 97016 KB Output is correct
56 Correct 65 ms 96632 KB Output is correct
57 Correct 82 ms 97016 KB Output is correct
58 Correct 64 ms 96632 KB Output is correct
59 Correct 63 ms 96632 KB Output is correct
60 Correct 107 ms 97912 KB Output is correct
61 Incorrect 123 ms 98640 KB Output isn't correct
62 Halted 0 ms 0 KB -