답안 #767028

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
767028 2023-06-26T10:24:09 Z DJeniUp 자동 인형 (IOI18_doll) C++17
53 / 100
702 ms 36952 KB
#include "doll.h"
#include <bits/stdc++.h>
using namespace std;

typedef int ll;
typedef pair<ll,ll>pairll;

#define pb push_back
#define fr first
#define sc second

ll h,a[400007],b[400007],f[400007],u[400007];

vector<ll>v[200007];

priority_queue<pairll,vector<pairll>, greater<pairll> >p;

vector<ll>c,x,y;

void create_circuit(int M, std::vector<int> A) {
    A.pb(0);
    for(int i=0;i<A.size()-1;i++){
        v[A[i]].pb(A[i+1]);
    }
    c.pb(A[0]);
    for(int i=1;i<=M;i++){
        if(v[i].size()==0)c.pb(0);
        else if(v[i].size()==1)c.pb(v[i][0]);
        else{
            h++;
            x.pb(-h);
            y.pb(-h);
            c.pb(-h);
            for(int j=0;j<v[i].size();j++){
                ll k=-c[i]-1;
                while(1){
                    if(f[k]%2==0){
                        f[k]++;
                        if(x[k]==-k-1){
                            x[k]=v[i][j];
                            break;
                        }else if(x[k]<0){
                            k=-x[k]-1;
                        }else{
                            h++;
                            f[h-1]=1;
                            x.pb(-h);
                            y.pb(-h);
                            x[h-1]=x[k];
                            x[k]=-h;
                            k=h-1;
                        }
                    }else{
                        f[k]++;
                        if(y[k]==-k-1){
                            y[k]=v[i][j];
                            break;
                        }else if(y[k]<0){
                            k=-y[k]-1;
                        }else{
                            h++;
                            f[h-1]=1;
                            x.pb(-h);
                            y.pb(-h);
                            x[h-1]=y[k];
                            y[k]=-h;
                            k=h-1;
                        }
                    }
                }
            }
        }
    }
    while(1){
        ll k=c[0];
        ll z=0;
        ll r=0;
        for(int i=0;i<h;i++){
            f[i]=0;
            u[i]=0;
        }
        while(p.size()>0)p.pop();
        ll pr=0;
        while(k!=0){
                r++;
            pr=k;
            if(k>0){
                k=c[k];
            }else{
                if(u[-k-1]==0)u[-k-1]=r;
                if(f[-k-1]%2==0){
                    p.push({u[-k-1],k});
                    f[-k-1]++;
                    k=x[-k-1];
                }else{

                    f[-k-1]++;
                    k=y[-k-1];
                }
            }
        }
        //cout<<p.back()<<" "<<f[-p.back()-1]<<endl;
        while(p.size()>0 && f[-p.top().sc-1]%2==0)p.pop();
        if(p.size()==0)break;
        while(p.size()>0){
            while(p.size()>0 && f[-p.top().sc-1]%2==0)p.pop();
            if(p.size()==0)break;
            z=p.top().sc;
            p.pop();
            //cout<<z<<endl;
            if(f[-z-1]%2==0){
                break;
            }else{
                if(pr>0)c[pr]=z;
                else{
                    if(f[-pr-1]%2==1)x[-pr-1]=z;
                    else y[-pr-1]=z;
                }
                k=-z-1;
                while(1){
                    pr=-k-1;
                    if(f[k]%2==0){
                        p.push({u[k],-k-1});
                        f[k]++;
                        if(x[k]==-k-1){
                            x[k]=0;
                            break;
                        }else if(x[k]<0){
                            k=-x[k]-1;
                        }else{
                            h++;
                            f[h-1]=1;
                            x.pb(-h);
                            y.pb(-h);
                            x[h-1]=x[k];
                            x[k]=-h;
                            k=h-1;
                        }
                    }else{
                        f[k]++;
                        if(y[k]==-k-1){
                            y[k]=0;
                            break;
                        }else if(y[k]<0){
                            k=-y[k]-1;
                        }else{
                            h++;
                            f[h-1]=1;
                            x.pb(-h);
                            y.pb(-h);
                            x[h-1]=y[k];
                            y[k]=-h;
                            k=h-1;
                        }
                    }
                }
            }
        }
    }
    //cout<<c.size()<<" "<<x.size()<<" "<<y.size()<<endl;
    for(int i=0;i<=M;i++){
       // cout<<i<<" "<<c[i]<<endl;
    }
    for(int i=0;i<x.size();i++){
       //if(x[i]==-i-1)swap(x[i],y[i]);
       //cout<<-i-1<<" "<<x[i]<<" "<<y[i]<<endl;
    }
    if(h>2*A.size()-2)exit(1);
    answer(c,x,y);
    return ;
}

Compilation message

doll.cpp: In function 'void create_circuit(int, std::vector<int>)':
doll.cpp:22:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   22 |     for(int i=0;i<A.size()-1;i++){
      |                 ~^~~~~~~~~~~
doll.cpp:34:26: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   34 |             for(int j=0;j<v[i].size();j++){
      |                         ~^~~~~~~~~~~~
doll.cpp:164:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  164 |     for(int i=0;i<x.size();i++){
      |                 ~^~~~~~~~~
doll.cpp:168:9: warning: comparison of integer expressions of different signedness: 'll' {aka 'int'} and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  168 |     if(h>2*A.size()-2)exit(1);
      |        ~^~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 4948 KB Output is correct
2 Correct 26 ms 8792 KB Output is correct
3 Correct 16 ms 8400 KB Output is correct
4 Correct 2 ms 4948 KB Output is correct
5 Correct 9 ms 6220 KB Output is correct
6 Correct 25 ms 10208 KB Output is correct
7 Correct 2 ms 4992 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 4948 KB Output is correct
2 Correct 26 ms 8792 KB Output is correct
3 Correct 16 ms 8400 KB Output is correct
4 Correct 2 ms 4948 KB Output is correct
5 Correct 9 ms 6220 KB Output is correct
6 Correct 25 ms 10208 KB Output is correct
7 Correct 2 ms 4992 KB Output is correct
8 Correct 52 ms 12332 KB Output is correct
9 Correct 44 ms 12484 KB Output is correct
10 Correct 64 ms 16016 KB Output is correct
11 Correct 2 ms 4948 KB Output is correct
12 Correct 2 ms 4948 KB Output is correct
13 Correct 2 ms 4924 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 4948 KB Output is correct
2 Correct 26 ms 8792 KB Output is correct
3 Correct 16 ms 8400 KB Output is correct
4 Correct 2 ms 4948 KB Output is correct
5 Correct 9 ms 6220 KB Output is correct
6 Correct 25 ms 10208 KB Output is correct
7 Correct 2 ms 4992 KB Output is correct
8 Correct 52 ms 12332 KB Output is correct
9 Correct 44 ms 12484 KB Output is correct
10 Correct 64 ms 16016 KB Output is correct
11 Correct 2 ms 4948 KB Output is correct
12 Correct 2 ms 4948 KB Output is correct
13 Correct 2 ms 4924 KB Output is correct
14 Correct 130 ms 20676 KB Output is correct
15 Correct 67 ms 13396 KB Output is correct
16 Correct 82 ms 17336 KB Output is correct
17 Correct 2 ms 4948 KB Output is correct
18 Correct 3 ms 4948 KB Output is correct
19 Correct 3 ms 4948 KB Output is correct
20 Correct 109 ms 19268 KB Output is correct
21 Correct 3 ms 4992 KB Output is correct
22 Correct 3 ms 4948 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 4948 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Partially correct 2 ms 4948 KB Output is partially correct
2 Correct 218 ms 26316 KB Output is correct
3 Partially correct 475 ms 28552 KB Output is partially correct
4 Partially correct 702 ms 33332 KB Output is partially correct
# 결과 실행 시간 메모리 Grader output
1 Partially correct 2 ms 4948 KB Output is partially correct
2 Correct 218 ms 26316 KB Output is correct
3 Partially correct 475 ms 28552 KB Output is partially correct
4 Partially correct 702 ms 33332 KB Output is partially correct
5 Partially correct 195 ms 25420 KB Output is partially correct
6 Partially correct 241 ms 28832 KB Output is partially correct
7 Partially correct 235 ms 27676 KB Output is partially correct
8 Partially correct 280 ms 30984 KB Output is partially correct
9 Partially correct 450 ms 29556 KB Output is partially correct
10 Partially correct 543 ms 36952 KB Output is partially correct
11 Partially correct 469 ms 36444 KB Output is partially correct
12 Partially correct 291 ms 25516 KB Output is partially correct
13 Partially correct 163 ms 20764 KB Output is partially correct
14 Partially correct 154 ms 20764 KB Output is partially correct
15 Partially correct 118 ms 19132 KB Output is partially correct
16 Partially correct 7 ms 5476 KB Output is partially correct
17 Partially correct 221 ms 20800 KB Output is partially correct
18 Partially correct 286 ms 21940 KB Output is partially correct
19 Partially correct 256 ms 22820 KB Output is partially correct
20 Partially correct 293 ms 25708 KB Output is partially correct
21 Partially correct 468 ms 32136 KB Output is partially correct
22 Partially correct 352 ms 25928 KB Output is partially correct