| # | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
|---|---|---|---|---|---|---|---|
| 1360049 | cpdreamer | 장애물 (IOI25_obstacles) | C++20 | 2092 ms | 71688 KiB |
#include "obstacles.h"
#include<bits/stdc++.h>
using namespace std;
void file() {
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
}
#define all(v) v.begin(),v.end()
#define pb push_back
#define V vector
#define P pair
#define F first
typedef long long ll;
int mx[(int)2e5+1][20];
int imx[(int)2e5+1][20];
int imn[(int)2e5+1][20];
int mn[(int)2e5+1][20];
int lg[(int)2e5+1];
int t[(int)2e5+1];
int h[(int)2e5+1];
int n,m;
void init(int s) {
for (int i=0;i<s;i++) {
mx[i][0]=h[i];
imx[i][0]=i;
imn[i][0]=i;
mn[i][0]=h[i];
}
for (int k=1;k<20;k++) {
for (int i=0;i<s;i++) {
if (i+(1<<k)-1<s) {
mx[i][k]=max(mx[i][k-1],mx[i+(1<<(k-1))][k-1]);
if (mx[i][k-1]>=mx[i+(1<<(k-1))][k-1]) {
imx[i][k]=imx[i][k-1];
}
else {
imx[i][k]=imx[i+(1<<(k-1))][k-1];
}
mn[i][k]=min(mn[i][k-1],mn[i+(1<<(k-1))][k-1]);
if (mn[i][k-1]<=mn[i+(1<<(k-1))][k-1]) {
imn[i][k]=imn[i][k-1];
}
else {
imn[i][k]=imn[i+(1<<(k-1))][k-1];
}
}
}
}
}
int qmx(int l,int r) {
int x=lg[r-l+1];
return max(mx[l][x],mx[r-(1<<x)+1][x]);
}
int qmn(int l,int r) {
int x=lg[r-l+1];
if (mn[l][x]<=mn[r-(1<<x)+1][x]) {
return imn[l][x];
}
return imn[r-(1<<x)+1][x];
}
void initialize(std::vector<int> T, std::vector<int> H) {
lg[1]=0;
for (int i=2;i<=(int)2e5;i++) {
lg[i]=lg[i/2]+1;
}
n=(int)T.size();
m=(int)H.size();
for (int i=0;i<n;i++) {
t[i]=T[i];
}
for (int i=0;i<m;i++) {
h[i]=H[i];
}
init(m);
}
int find_min(int id,int row) {
int l=id,r=m-1;
int ans1=-1;
while (l<=r) {
int mid=l+(r-l)/2;
if (qmx(id,mid)<t[row]) {
ans1=mid;
l=mid+1;
}
else {
r=mid-1;
}
}
l=0,r=id;
int ans2=-1;
while (l<=r) {
int mid=l+(r-l)/2;
if (qmx(mid,id)<t[row]) {
ans2=mid;
r=mid-1;
}
else {
l=mid+1;
}
}
return qmn(ans2,ans1);
}
bool check(int i,int l,int r) {
if (l>=r) {
swap(l,r);
}
int x=qmx(l,r);
if (x<t[i])return true;
return false;
}
bool can_reach(int L, int R, int S, int D) {
if (S>D) {
swap(S,D);
}
int p1[n];
int p2[n];
p1[0]=find_min(S,0);
p2[0]=find_min(D,0);
for (int i=1;i<n;i++) {
p1[i]=find_min(p1[i-1],i);
p2[i]=find_min(p2[i-1],i);
}
for (int i=0;i<n;i++) {
if (check(i,p1[i],p2[i]))return true;
}
return false;
}컴파일 시 표준 에러 (stderr) 메시지
| # | 결과 | 실행 시간 | 메모리 | 채점기 출력 |
|---|---|---|---|---|
| 결과를 불러오는 중입니다… | ||||
| # | 결과 | 실행 시간 | 메모리 | 채점기 출력 |
|---|---|---|---|---|
| 결과를 불러오는 중입니다… | ||||
| # | 결과 | 실행 시간 | 메모리 | 채점기 출력 |
|---|---|---|---|---|
| 결과를 불러오는 중입니다… | ||||
| # | 결과 | 실행 시간 | 메모리 | 채점기 출력 |
|---|---|---|---|---|
| 결과를 불러오는 중입니다… | ||||
| # | 결과 | 실행 시간 | 메모리 | 채점기 출력 |
|---|---|---|---|---|
| 결과를 불러오는 중입니다… | ||||
| # | 결과 | 실행 시간 | 메모리 | 채점기 출력 |
|---|---|---|---|---|
| 결과를 불러오는 중입니다… | ||||
| # | 결과 | 실행 시간 | 메모리 | 채점기 출력 |
|---|---|---|---|---|
| 결과를 불러오는 중입니다… | ||||
