# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
485888 | gavgav | Fountain (eJOI20_fountain) | C++17 | 107 ms | 6588 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <stdio.h>
#define MAX_N 100000
#define MAX_M 200000
#define MAX_D 1000000000
#define MAX_S 100000000000000
struct rezervor {
int d, v;
};
struct query {
int s, v, rasp;
};
int stiva[MAX_N + 1], next[MAX_M + 1], liste[MAX_N + 1];
long long sumaNec[MAX_N + 1];
struct rezervor rez[MAX_N + 1];
struct query q[MAX_M + 1];
int main() {
int height, queries_number, top, st, dr, mij, i, j;
long long sumaV;
scanf( "%d%d", &height, &queries_number);
rez[0].d = MAX_D + 1;
rez[0].v = 0;
for ( i = 1; i <= height; i++ )
scanf( "%d%d", &rez[i].d, &rez[i].v );
for ( i = 1; i <= queries_number; i++ ) {
scanf( "%d%d", &q[i].s, &q[i].v );
next[i] = liste[q[i].s];
liste[q[i].s] = i;
}
stiva[0] = 0;
sumaNec[0] = -MAX_S - 1;
top = 0;
sumaV = 0;
for ( i = height; i >= 1; i-- ) {
while ( rez[i].d >= rez[stiva[top]].d ) {
sumaV -= rez[stiva[top]].v;
top--;
}
top++;
stiva[top] = i;
sumaNec[top] = sumaV;
sumaV += rez[i].v;
j = liste[i];
while ( j != 0 ) {
st = top + 1;
dr = 0;
while ( st - dr > 1 ) {
mij = (st + dr) / 2;
if ( sumaV - sumaNec[mij] >= q[j].v )
dr = mij;
else
st = mij;
}
q[j].rasp = stiva[dr];
j = next[j];
}
}
for ( i = 1; i <= queries_number; i++ )
printf( "%d\n", q[i].rasp );
}
컴파일 시 표준 에러 (stderr) 메시지
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |