답안 #1028810

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1028810 2024-07-20T09:00:59 Z mindiyak 자동 인형 (IOI18_doll) C++14
63 / 100
242 ms 28100 KB
#include "doll.h"
#pragma GCC optimize("O1,O2,O3,Ofast,unroll-loops")
#include <bits/stdc++.h>
#include <string>
#include <iostream>
#include <cmath>
#include <numeric>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
typedef pair<int, int> pi;
typedef pair<int, int> pl;
typedef pair<ld, ld> pd;
typedef vector<int> vi;
typedef vector<bool> vb;
typedef vector<vector<int>> vvi;
typedef vector<ld> vd;
typedef vector<ll> vl;
typedef vector<pi> vpi;
typedef vector<pl> vpl;
#define FOR(i, a, b) for (int i = a; i < (b); i++)
#define F0R(i, a) for (int i = 0; i < (a); i++)
#define FORd(i, a, b) for (int i = (b)-1; i >= a; i--)
#define F0Rd(i, a) for (int i = (a)-1; i >= 0; i--)
#define trav(a, x) for (auto &a : x)
#define uid(a, b) uniform_int_distribution<int>(a, b)(rng)
#define len(x) (int)(x).size()
#define mp make_pair
#define pb push_back
#define F first
#define nl endl
#define S second
#define lb lower_bound
#define ub upper_bound
#define aint(x) x.begin(), x.end()
#define raint(x) x.rbegin(), x.rend()
#define ins insert
const int MOD = 1000000007;

int N,M;

void create_circuit(int m, vi A) {
  A.pb(0);
  N = A.size();M=m;
  vi C(M + 1,0),X,Y;

  vvi counters(M+1,vi());
  FOR(i,0,N-1){
    counters[A[i]].pb(A[i+1]);
  }

  int mx = 0;
  FOR(i,0,M+1){
    mx = max(mx,int(counters[i].size()));
  }
  counters[0].pb(A[0]);

  // FOR(i,0,M+1){
  //   cout << i << " {";
  //   for(int j:counters[i])cout<<j << " ,";
  //   cout<<"}"<<endl;
  // }

  // if(false){
  if(mx<=4){
    FOR(i,0,M+1){
      if(counters[i].size() == 1){
        C[i] = counters[i][0];
      }else if(counters[i].size() == 2){
        X.pb(counters[i][0]);
        Y.pb(counters[i][1]);
        C[i] = X.size()*-1;
      }else if(counters[i].size() == 3){
        int k = -X.size();
        C[i] = k-1;
        X.pb(k-2);
        Y.pb(k-3);
        X.pb(counters[i][0]);
        Y.pb(k-1);
        X.pb(counters[i][1]);
        Y.pb(counters[i][2]);
      }else if(counters[i].size() == 4){
        int k = -X.size();
        C[i] = k-1;
        X.pb(k-2);
        Y.pb(k-3);
        X.pb(counters[i][0]);
        Y.pb(counters[i][2]);
        X.pb(counters[i][1]);
        Y.pb(counters[i][3]);
      }
    }

    // FOR(i,0,M+1)cout << C[i] << " ";
    // cout << endl;
    // FOR(i,0,X.size())cout << X[i] << " " << Y[i] << endl;

    answer(C, X, Y);
    return;
  }
  if(N==17){
    int j = 0,sum = 2;
    while(sum < 16){
      X.pb(-2-j);
      j++;
      Y.pb(-2-j);
      j++;
      sum+=2;
    }
    FOR(i,0,M+1){
      if(counters[i].size()>0)C[i] = -1;
    }
    C[0] = A[0];
    A.erase(A.begin());

    vector<pair<string,int>> arr(16);
    FOR(j,0,16){
      string a = "";
      int k = j;
      FOR(l,0,4){
        if(k%2 == 1)a += "1";
        else a += "0";
        k/=2;
      }
      // reverse(a.begin(),a.end());
      arr[j] = {a,j};
    }
    sort(arr.begin(),arr.end());

    for(int j = 0;j < 16;j+=2){
      X.pb(A[arr[j].S]);
      Y.pb(A[arr[j+1].S]);
    }

    // FOR(i,1,16){
    //   X.pb(A[i]);
    //   i++;
    //   Y.pb(A[i]);
    // }
    answer(C, X, Y);

    // FOR(i,0,M+1)cout << C[i] << " ";
    // cout << endl;
    // FOR(i,0,X.size())cout << X[i] << " " << Y[i] << endl;

    return;
  }

  FOR(i,0,M+1){
    if(counters[i].size() == 0)continue;
    if(counters[i].size() == 1){
      C[i] = counters[i][0];
      continue;
    }
    if(counters[i].size() == 2){
      X.pb(counters[i][0]);
      Y.pb(counters[i][1]);
      C[i] = -X.size();
      continue;
    }

    int num = ceil(log2(counters[i].size()));

    // int k = -X.size();

    // cout << num << " " << pow(2,num) << endl;

    vi X1,Y1;

    int j = 0,sum = 2;
    while(sum < pow(2,num)){
      X1.pb(-2-j);
      j++;
      Y1.pb(-2-j);
      j++;
      sum+=2;
    }

    counters[i].insert(counters[i].end()-1,pow(2,num)-counters[i].size(),-1);

    // cout << i << " {";
    // for(int j:counters[i])cout<<j << " ,";
    // cout<<"}"<<endl;

    // cout << i << " " << counters[i].size() << " " << num << endl;

    vector<pair<string,int>> arr(pow(2,num));
    FOR(j,0,pow(2,num)){
      string a = "";
      int k = j;
      FOR(l,0,num){
        if(k%2 == 1)a += "1";
        else a += "0";
        k/=2;
      }
      // reverse(a.begin(),a.end());
      arr[j] = {a,j};
    }
    sort(arr.begin(),arr.end());

    for(int j = 0;j < pow(2,num);j+=2){
      if(arr[j].S < counters[i].size())
        X1.pb(counters[i][arr[j].S]);
      else 
        X1.pb(-1);

      if(arr[j+1].S < counters[i].size())
        Y1.pb(counters[i][arr[j+1].S]);
      else
        Y1.pb(-1);
    }
    // cout << endl;

    // cout << "INITIAL" << endl;
    // for(int x:X1)cout << x << " ";
    // cout << endl;
    // for(int y:Y1)cout << y << " ";
    // cout << endl;

    // cout << endl;

    vi used(X1.size(),0);
    for(int j = X1.size()-1;j>-1;j--){
      // cout << j << " " << (j-1)/2 << endl;
      if(X1[j] != -1){
        used[j]++;
      }
      if(Y1[j] != -1){
        used[j]++;
      }
      if(used[j] == 0){
        if((j-1)/2 == 2*((j-1)/2)+1)X[(j-1)/2] = -1;
        else  Y[(j-1)/2] = -1;
      }
    }

    // cout << "TRYING TO SHORT " << endl;
    // for(int x:X1)cout << x << " ";
    // cout << endl;
    // for(int y:Y1)cout << y << " ";
    // cout << endl;
    // for(int y:used)cout << y << " ";
    // cout << endl;

    int k = -X.size();

    C[i] = k-1;
    FOR(j,0,X1.size()){
      if(X1[j]<0)X.pb(X1[j]+k);
      else X.pb(X1[j]);

      if(Y1[j]<0)Y.pb(Y1[j]+k);
      else Y.pb(Y1[j]);
    }
  }

  // cout << "FINAL" << endl;
  // for(int x:C)cout << x << " ";
  // cout << endl;
  // FOR(i,0,X.size()){
  //   cout << -i-1 << " " << X[i] << " " << Y[i] << endl;
  // }

  answer(C, X, Y);
}

Compilation message

doll.cpp: In function 'void create_circuit(int, vi)':
doll.cpp:203:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  203 |       if(arr[j].S < counters[i].size())
doll.cpp:208:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  208 |       if(arr[j+1].S < counters[i].size())
doll.cpp:22:40: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   22 | #define FOR(i, a, b) for (int i = a; i < (b); i++)
      |                                        ^
doll.cpp:249:5: note: in expansion of macro 'FOR'
  249 |     FOR(j,0,X1.size()){
      |     ^~~
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 19 ms 6744 KB Output is correct
3 Correct 15 ms 5720 KB Output is correct
4 Correct 1 ms 344 KB Output is correct
5 Correct 7 ms 3932 KB Output is correct
6 Correct 25 ms 8404 KB Output is correct
7 Correct 0 ms 344 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 19 ms 6744 KB Output is correct
3 Correct 15 ms 5720 KB Output is correct
4 Correct 1 ms 344 KB Output is correct
5 Correct 7 ms 3932 KB Output is correct
6 Correct 25 ms 8404 KB Output is correct
7 Correct 0 ms 344 KB Output is correct
8 Correct 30 ms 8272 KB Output is correct
9 Correct 50 ms 9548 KB Output is correct
10 Correct 43 ms 12872 KB Output is correct
11 Correct 0 ms 348 KB Output is correct
12 Correct 0 ms 348 KB Output is correct
13 Correct 0 ms 348 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 19 ms 6744 KB Output is correct
3 Correct 15 ms 5720 KB Output is correct
4 Correct 1 ms 344 KB Output is correct
5 Correct 7 ms 3932 KB Output is correct
6 Correct 25 ms 8404 KB Output is correct
7 Correct 0 ms 344 KB Output is correct
8 Correct 30 ms 8272 KB Output is correct
9 Correct 50 ms 9548 KB Output is correct
10 Correct 43 ms 12872 KB Output is correct
11 Correct 0 ms 348 KB Output is correct
12 Correct 0 ms 348 KB Output is correct
13 Correct 0 ms 348 KB Output is correct
14 Correct 53 ms 12356 KB Output is correct
15 Correct 41 ms 7192 KB Output is correct
16 Correct 44 ms 10308 KB Output is correct
17 Correct 0 ms 344 KB Output is correct
18 Correct 0 ms 348 KB Output is correct
19 Correct 0 ms 348 KB Output is correct
20 Correct 50 ms 12100 KB Output is correct
21 Correct 1 ms 348 KB Output is correct
22 Correct 1 ms 348 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 348 KB Output is correct
2 Correct 1 ms 348 KB Output is correct
3 Correct 1 ms 348 KB Output is correct
4 Correct 1 ms 348 KB Output is correct
5 Correct 1 ms 344 KB Output is correct
6 Correct 1 ms 348 KB Output is correct
7 Correct 1 ms 348 KB Output is correct
8 Correct 0 ms 348 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Partially correct 1 ms 348 KB Output is partially correct
2 Correct 116 ms 14404 KB Output is correct
3 Partially correct 227 ms 27440 KB Output is partially correct
4 Partially correct 198 ms 28100 KB Output is partially correct
# 결과 실행 시간 메모리 Grader output
1 Partially correct 1 ms 348 KB Output is partially correct
2 Correct 116 ms 14404 KB Output is correct
3 Partially correct 227 ms 27440 KB Output is partially correct
4 Partially correct 198 ms 28100 KB Output is partially correct
5 Partially correct 102 ms 12204 KB Output is partially correct
6 Partially correct 155 ms 12824 KB Output is partially correct
7 Partially correct 106 ms 12448 KB Output is partially correct
8 Partially correct 111 ms 12776 KB Output is partially correct
9 Partially correct 185 ms 19516 KB Output is partially correct
10 Partially correct 242 ms 22496 KB Output is partially correct
11 Partially correct 162 ms 13252 KB Output is partially correct
12 Partially correct 123 ms 9520 KB Output is partially correct
13 Partially correct 70 ms 8316 KB Output is partially correct
14 Partially correct 68 ms 8212 KB Output is partially correct
15 Partially correct 65 ms 8060 KB Output is partially correct
16 Partially correct 2 ms 604 KB Output is partially correct
17 Partially correct 70 ms 7232 KB Output is partially correct
18 Partially correct 89 ms 7184 KB Output is partially correct
19 Partially correct 79 ms 7544 KB Output is partially correct
20 Partially correct 99 ms 10160 KB Output is partially correct
21 Partially correct 154 ms 11836 KB Output is partially correct
22 Partially correct 101 ms 9372 KB Output is partially correct