답안 #784173

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
784173 2023-07-15T20:23:29 Z testanmdp Minerals (JOI19_minerals) C++14
0 / 100
1 ms 336 KB
///#include "minerals.h"
#include <bits/stdc++.h>
#include <cstdlib>
#include <algorithm>
//#define DEBUG
void Solve(int N);
int Query(int x);

void Answer(int x, int y);
typedef std::pair<int,int> pii;
typedef std::pair<int,pii> pip;
int mid(pii k){
	return (k.first+k.second)/2;	
}
void Solve(int N) {
	std::vector<int> vec,bads;
  	for (int i = 1; i != 2*N+1; ++i) {
    	int x = Query(i);
    	//std::cout<<x<<"<\n";
    	if(x!=vec.size()){
    		vec.push_back(i);
		}else {
			bads.push_back(i);
			Query(i);
		}
  	}
  	std::vector<pip> queries[N];
  	for(int i=0;i!=N;++i){
  		pip range = {bads[i],pii(0,N-1)};
  		queries[mid(range.second)].push_back(range);
	}
	
  	int falta=N;
  	while(falta){
  		for(int i=N-1;i!=-1;--i){
  			if(!falta)break;
  			for(auto&x:queries[i]){
  				auto __ = x;
  				int p = Query(x.first);
  				///std::cout<<p<<" "<<i<<"\n";
  				if(p==i+1){///Estah contido
  					__.second.second=i;
				}else {
					__.second.first=i+1;
				}
				if(__.second.first!=__.second.second){
					queries[mid(__.second)].push_back(__);
					Query(x.first);
				}else {
					Answer(x.first,vec[__.second.first]);
					--falta;
				}
			}
			Query(vec[i]);
			//std::cout<<<<"!\n";
			queries[i].clear();
		}
		for(int i=0;i!=N;++i){
			if(!falta)break;
  			for(auto&x:queries[i]){
  				auto __ = x;
  				int p = Query(x.first);
  			//	std::cout<<p<<" "<<i<<"\n";
  				if(p==i+1){///Estah contido
  					__.second.second=i;
				}else {
					__.second.first=i+1;
				}
				if(__.second.first!=__.second.second){
					queries[mid(__.second)].push_back(__);
					Query(x.first);
				}else {
					Answer(x.first,vec[__.second.first]);
					--falta;
				}
			}
			Query(vec[i]);
			queries[i].clear();
		}
	}
  	
}

#ifdef DEBUG
constexpr int MAX_N = 43000;
constexpr int MAX_CALLS = 1000000;

namespace {

void WrongAnswer(int code) {
  printf("Wrong Answer [%d]\n", code);
  exit(0);
}

int N;
int counterpart[2 * MAX_N + 1];

int num_queries;
int num_kinds;
int on[2 * MAX_N + 1];
int count[2 * MAX_N + 1];

int num_answers;
int answer[2 * MAX_N + 1];

}  // namespace

int Query(int x) {
  if (!(1 <= x && x <= 2 * N)) {
    WrongAnswer(1);
  }
  if (++num_queries > MAX_CALLS) {
    WrongAnswer(2);
  }
  const int type = std::min(x, counterpart[x]);
  if (on[x]) {
    --on[x];
    --count[type];
    if (count[type] == 0) {
      --num_kinds;
    }
  } else {
    ++on[x];
    ++count[type];
    if (count[type] == 1) {
      ++num_kinds;
    }
  }
  return num_kinds;
}

void Answer(int a, int b) {
	std::cout<<"Match "<<a<<" "<<b<<"\n";
  if (++num_answers > N) {
    WrongAnswer(6);
  }
  if (!(1 <= a && a <= 2 * N && 1 <= b && b <= 2 * N)) {
    WrongAnswer(3);
  }
  if (answer[a] != 0) {
    WrongAnswer(4);
  }
  answer[a] = b;
  if (answer[b] != 0) {
    WrongAnswer(4);
  }
  answer[b] = a;
  if (!(counterpart[a] == b && counterpart[b] == a)) {
    WrongAnswer(5);
  }
}

int main() {
  if (scanf("%d", &N) != 1) {
    fprintf(stderr, "Error while reading input\n");
    exit(1);
  }
  for (int i = 1; i <= N; ++i) {
    int x, y;
    if (scanf("%d%d", &x, &y) != 2) {
      fprintf(stderr, "Error while reading input\n");
      exit(1);
    }
    counterpart[x] = y;
    counterpart[y] = x;
  }
  Solve(N);
  if (num_answers != N) {
    WrongAnswer(6);
  }
  printf("Accepted: %d\n", num_queries);
  return 0;
}
#endif

Compilation message

minerals.cpp: In function 'void Solve(int)':
minerals.cpp:20:10: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   20 |      if(x!=vec.size()){
      |         ~^~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 208 KB Wrong Answer [5]
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 336 KB Wrong Answer [5]
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 208 KB Wrong Answer [5]
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 208 KB Wrong Answer [5]
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 208 KB Wrong Answer [5]
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 208 KB Wrong Answer [5]
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 208 KB Wrong Answer [5]
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 208 KB Wrong Answer [5]
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 208 KB Wrong Answer [5]
2 Halted 0 ms 0 KB -