Submission #996301

#TimeUsernameProblemLanguageResultExecution timeMemory
996301PCTprobabilityMechanical Doll (IOI18_doll)C++17
100 / 100
88 ms17260 KiB
#include "doll.h"
#include <bits/stdc++.h>
using namespace std;
void create_circuit(int m, std::vector<int> a) {
  a.push_back(0);
  int n=a.size();
  vector<int> c(m+1);
  for(int i=0;i<=m;i++){
    c[i]=-1;
  }
  int nowi=2,s=1,bt=0;
  while(nowi<n){
    nowi*=2;
    s*=2;
    s++;
    bt++;
  }
  vector<int> x(s+1,-1),y(s+1,-1);
  int now=0;
  x[0]=0;
  y[0]=0;
  for(int i=1;i<=s;i++){
    if(i*2<=s){
      x[i]=-i*2;
      y[i]=-i*2-1;
    }
  }
  vector<pair<int,int>> pq;
  for(int i=0;i<(s+1)/2;i++){
    int id=0;
    for(int j=0;j<bt;j++){
      if((i>>j)&1) id^=(1<<(bt-1-j));
    }
    pq.push_back({id,i+(s+1)/2});
  }
  sort(pq.begin(),pq.end());
  vector<int> xs(s+1),ys(s+1);
  for(int i=0;i<pq.size();i++){
    xs[pq[i].second]=i;
    ys[pq[i].second]=i+(s+1)/2;
  }
  pq.clear();
  for(int i=s;i>=(s+1)/2;i--){
    if(pq.size()<a.size()){
      pq.push_back({xs[i],i});
    }
    if(pq.size()<a.size()){
      pq.push_back({ys[i],i});
    }
  }
  sort(pq.begin(),pq.end());
  //for(auto e:pq) cout<<e.first<<" "<<e.second<<endl;
  for(int i=0;i<pq.size();i++){
    //cout<<pq[i].second<<" "<<a[i]<<endl;
    if(x[pq[i].second]==-1){
      x[pq[i].second]=a[i];
    }
    else{
      y[pq[i].second]=a[i];
    }
  }
  /*for(auto e:x) cout<<e<<" ";
  cout<<endl;
  for(auto e:y) cout<<e<<" ";
  cout<<endl;*/
  vector<int> use(s+1);
  for(int i=s;i>=1;i--){
    if(x[i]>=0||y[i]>=0) continue;
    if((x[i]==-1||use[-x[i]]==-1)&&(y[i]==-1||use[-y[i]]==-1)){
      use[i]=-1;
    }
  }
  vector<int> nid(s+1,1);
  int z=1;
  for(int i=1;i<=s;i++){
    if(use[i]!=-1){
      nid[i]=z;
      z++;
    }
  }
  /*for(auto e:nid) cout<<e<<" ";
  cout<<endl;*/
  vector<int> X,Y;
  for(int i=1;i<=s;i++){
    if(use[i]!=-1){
      //cout<<i<<" "<<x[i]<<" "<<y[i]<<endl;
      if(x[i]>=0) X.push_back(x[i]);
      else X.push_back(-nid[-x[i]]);
      if(y[i]>=0) Y.push_back(y[i]);
      else Y.push_back(-nid[-y[i]]);
    }
  }
  /*for(auto e:x) cout<<e<<" ";
  cout<<endl;
  for(auto e:y) cout<<e<<" ";
  cout<<endl;
  for(auto e:X) cout<<e<<" ";
  cout<<endl;
  for(auto e:Y) cout<<e<<" ";
  cout<<endl;*/
  answer(c,X,Y);
}

Compilation message (stderr)

doll.cpp: In function 'void create_circuit(int, std::vector<int>)':
doll.cpp:38:16: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   38 |   for(int i=0;i<pq.size();i++){
      |               ~^~~~~~~~~~
doll.cpp:53:16: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   53 |   for(int i=0;i<pq.size();i++){
      |               ~^~~~~~~~~~
doll.cpp:19:7: warning: unused variable 'now' [-Wunused-variable]
   19 |   int now=0;
      |       ^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...