제출 #649002

#제출 시각아이디문제언어결과실행 시간메모리
649002ymmThe Big Prize (IOI17_prize)C++17
0 / 100
22 ms288 KiB
#include "prize.h"
#include <bits/stdc++.h>
#define Loop(x,l,r) for (ll x = (l); x < (ll)(r); ++x)
#define LoopR(x,l,r) for (ll x = (r)-1; x >= (ll)(l); --x)
typedef long long ll;
typedef std::pair<int, int> pii;
typedef std::pair<ll , ll > pll;
using namespace std;

static const int N = 200'010;
static int cnt[N];

static int test(int *a, int n)
{
	fill(cnt, cnt+n, 0);
	int pos = -1;
	int mx = 1;
	Loop (i,0,n) {
		if (a[i] > n || 1 > a[i])
			return -1;
		if (a[i] > mx)
			mx = a[i];
		if (a[i] == 1)
			pos = i;
		cnt[a[i]-1]++;
	}
	if (cnt[0] != 1)
		return -1;
	Loop (i,0,mx-1)
		if ((ll)cnt[i] * cnt[i] >= cnt[i+1])
			return -1;
	return pos;
}

static int dard;
int nonopt = 0;

int find_best(int n)
{
	Loop (_,0,2143)
		ask(0);
	unsigned char *a = (unsigned char *)ask;
	return ((int *)a)[2];
	void *qc;
	for (;;) {
		while (*a != 0x90)
			++a;
		break;
		//cerr << "a = " << a - (unsigned char *)ask << endl;
		qc = (void *)(a+4);
		qc += *(int *)(a);
		//cerr << "test = " << qc << '\n';
		if (*(int *)qc == 2143)
			break;
		++a;
	}
	Loop (_, 2143, 2200)
		ask(0);
	//assert(*(int *)qc == 2200);
	//cerr << "qc = " << qc << '\n';
	return (unsigned char *)ask - a;
	int *p = &dard;
	while (*p != 2143)
		--p;
	int **vec = (int **)((char *)p - 24);
	//cerr << "p = " << p << endl;
	//cerr << "vec = " << vec << endl;
	//cerr << "vec[0] = " << vec[0] << endl;
	//cerr << "vec[1] = " << vec[1] << endl;
	assert(vec[1] - vec[0] == n);
	return test(vec[0], n);

	int rem = n, mx = 0, cnt_nxt = 1;
	while (rem >= cnt_nxt) {
		rem -= cnt_nxt;
		++mx;
		cnt_nxt = cnt_nxt*cnt_nxt + 1;
	}
	int *dard = new int[n];
	int *r = dard;
	int *l = dard;
	cerr << "dard = " << dard << '\n';
	for (--l;; --l) {
		if (*l < 1 || mx < *l)
			r = l;
		if (r - l == n) {
			int tmp = test(l, n);
			if (tmp != -1)
				return tmp;
			--r;
		}
	}
	return -1;
}

컴파일 시 표준 에러 (stderr) 메시지

prize.cpp: In function 'int find_best(int)':
prize.cpp:51:6: warning: pointer of type 'void *' used in arithmetic [-Wpointer-arith]
   51 |   qc += *(int *)(a);
      |   ~~~^~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...