답안 #766979

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
766979 2023-06-26T09:50:59 Z DJeniUp 자동 인형 (IOI18_doll) C++17
6 / 100
61 ms 15620 KB
#include "doll.h"
#include <bits/stdc++.h>
using namespace std;

typedef int ll;

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

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

vector<ll>v[200007];

vector<ll>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;
        for(int i=0;i<h;i++){
            f[i]=0;
        }
        while(p.size()>0)p.pop_back();
        ll pr=0;
        while(k!=0){
            pr=k;
            if(k>0){
                k=c[k];
            }else{
                if(f[-k-1]%2==0){
                    f[-k-1]++;
                    k=x[-k-1];
                }else{

                    f[-k-1]++;
                    k=y[-k-1];
                }
            }
        }
        for(int i=0;i<h;i++){
            if(f[i]%2==1)p.pb(i);

        }
        //cout<<p.back()<<" "<<f[-p.back()-1]<<endl;

        while(p.size()>0 && f[-p.back()-1]%2==0)p.pop_back();
        if(p.size()==0)break;
        while(p.size()>0){
            while(p.size()>0 && f[-p.back()-1]%2==0)p.pop_back();
            if(p.size()==0)break;
            z=p.back();
            p.pop_back();
            //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){
                        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:21:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   21 |     for(int i=0;i<A.size()-1;i++){
      |                 ~^~~~~~~~~~~
doll.cpp:33:26: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   33 |             for(int j=0;j<v[i].size();j++){
      |                         ~^~~~~~~~~~~~
doll.cpp:162:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  162 |     for(int i=0;i<x.size();i++){
      |                 ~^~~~~~~~~
doll.cpp:166:9: warning: comparison of integer expressions of different signedness: 'll' {aka 'int'} and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  166 |     if(h>2*A.size()-2)exit(1);
      |        ~^~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 4948 KB Output is correct
2 Correct 19 ms 8856 KB Output is correct
3 Correct 18 ms 8400 KB Output is correct
4 Correct 2 ms 4948 KB Output is correct
5 Correct 10 ms 6220 KB Output is correct
6 Correct 23 ms 10232 KB Output is correct
7 Correct 2 ms 4948 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 4948 KB Output is correct
2 Correct 19 ms 8856 KB Output is correct
3 Correct 18 ms 8400 KB Output is correct
4 Correct 2 ms 4948 KB Output is correct
5 Correct 10 ms 6220 KB Output is correct
6 Correct 23 ms 10232 KB Output is correct
7 Correct 2 ms 4948 KB Output is correct
8 Correct 37 ms 11544 KB Output is correct
9 Correct 39 ms 11968 KB Output is correct
10 Correct 57 ms 14860 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 4948 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 4948 KB Output is correct
2 Correct 19 ms 8856 KB Output is correct
3 Correct 18 ms 8400 KB Output is correct
4 Correct 2 ms 4948 KB Output is correct
5 Correct 10 ms 6220 KB Output is correct
6 Correct 23 ms 10232 KB Output is correct
7 Correct 2 ms 4948 KB Output is correct
8 Correct 37 ms 11544 KB Output is correct
9 Correct 39 ms 11968 KB Output is correct
10 Correct 57 ms 14860 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 4948 KB Output is correct
14 Incorrect 61 ms 15620 KB state 'Y'
15 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 4948 KB state 'Y'
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 4948 KB state 'Y'
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 4948 KB state 'Y'
2 Halted 0 ms 0 KB -