제출 #1299080

#제출 시각아이디문제언어결과실행 시간메모리
1299080nikakh장애물 (IOI25_obstacles)C++17
10 / 100
95 ms9952 KiB
#include "obstacles.h"
#include<bits/stdc++.h>
using namespace std;

int n,m,lenA,lenB,lenT;
vector<int>t,h,a,b,ter;

void initialize(vector<int>T,vector<int>H){
  n=(int)T.size(),m=(int)H.size();
  t=T;
  for(int i=0;i<m;i++){
  	h.push_back(H[i]);
  	if(h[i]>=3)ter.push_back(i);
  	if(h[i]>=t[0])a.push_back(i);
  	if(!h[i])b.push_back(i);
	}
	lenA=(int)a.size(),lenB=(int)b.size(),lenT=(int)ter.size();
  return;
}

bool can_reach(int l,int r,int s,int d){
	if(s>d)swap(s,d);
	if(t==vector<int>{2,1,3}){
		int idx=upper_bound(ter.begin(),ter.end(),s)-ter.begin();
		if(idx!=lenT&&ter[idx]<d)return 0;
		int i1=upper_bound(a.begin(),a.end(),s)-a.begin();
		if(i1==lenA||a[i1]>d)return 1;
		int i2=upper_bound(b.begin(),b.end(),s)-b.begin();
		if(i2==lenB||b[i2]>a[i1])return 0;
		int ub=upper_bound(a.begin(),a.end(),d)-a.begin();
		int lb=lower_bound(b.begin(),b.end(),d)-b.begin();
		if(lb-1>=0&&(ub-1<0||b[lb-1]>a[ub-1]))return 1;
		if(lb!=lenB&&(ub==lenA||b[lb]<a[ub]))return 1;
		return 0;
	}
	int ub=upper_bound(a.begin(),a.end(),s)-a.begin();
	if(ub==lenA)return 1;
	return a[ub]>d;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...