Submission #771577

#TimeUsernameProblemLanguageResultExecution timeMemory
771577ttamx자동 인형 (IOI18_doll)C++14
53 / 100
94 ms15504 KiB
#include "doll.h"
#include<bits/stdc++.h>

using namespace std;

void create_circuit(int m,vector<int> a) {
	int n = a.size();
	vector<int> c(m+1);
	vector<int> lg(n+1);
	for(int i=2;i<=n;i++)lg[i]=lg[i/2]+1;
	c[0]=a[0];
	vector<int> x,y;
	auto add=[&](int u,int v){
		x.emplace_back(u);
		y.emplace_back(v);
		return -x.size();
	};
	vector<vector<int>> vec(m+1);
	a.emplace_back(0);
	for(int i=0;i<n;i++)vec[a[i]].emplace_back(a[i+1]);
	for(int i=1;i<=m;i++){
		int sz=vec[i].size();
		if(sz==0){
			c[i]=0;
			continue;
		}
		if(sz==1){
			c[i]=vec[i][0];
			continue;
		}
		int lv=lg[sz-1]+1;
		vector<int> res;
		int cnt=1<<(lv-1);
		int tar=-(x.size()+(1<<lv)-1);
		int st=(1<<lv)-sz+1;
		vector<int> pos(1<<lv);
		for(int j=0;j<1<<lv;j++){
			for(int k=0;k<lv;k++)if((j>>k)&1)pos[j]+=1<<(lv-k-1);
			pos[j]++;
		}
		for(int k=0;k<cnt;k++){
			int u=pos[k*2],v=pos[k*2+1];
			res.emplace_back(add(u<st?tar:vec[i][u-st],v<st?tar:vec[i][v-st]));
		}
		while(res.size()>1){
			vector<int> tmp;
			for(int i=0;i<res.size();i+=2)tmp.emplace_back(add(res[i],res[i+1]));
			res=tmp;
		}
		c[i]=res[0];
	}
	answer(c,x,y);
}

Compilation message (stderr)

doll.cpp: In function 'void create_circuit(int, std::vector<int>)':
doll.cpp:47:17: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   47 |    for(int i=0;i<res.size();i+=2)tmp.emplace_back(add(res[i],res[i+1]));
      |                ~^~~~~~~~~~~
#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...