이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#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;
Loop (i,-(1<<12)+1,1<<18)
nonopt += a[i];
unsigned char *al = a-(1<<12)+1;
unsigned char *ar = a + (1<<18);
void *qc;
for (;;) {
while (a < ar && a[3] != 0x00 && a[3] != 0xff)
++a;
if (a >= ar)
return -12;
//cerr << "a = " << a - (unsigned char *)ask << endl;
qc = (void *)(a+4);
qc += *(int *)(a);
//cerr << "test = " << qc << '\n';
if (al <= qc && qc < ar && *(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:55:6: warning: pointer of type 'void *' used in arithmetic [-Wpointer-arith]
55 | qc += *(int *)(a);
| ~~~^~~~~~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |