제출 #1263114

#제출 시각아이디문제언어결과실행 시간메모리
1263114Aviansh장애물 (IOI25_obstacles)C++20
10 / 100
400 ms54640 KiB
#include <bits/stdc++.h> using namespace std; //min segTree struct segTree{ int *st; int n; segTree(int siz){ int x = ceil(log2(siz)); x++; n=siz-1; st = new int[(1<<x)]; fill(st,st+(1<<x),0); } void rupdate(int l, int r, int ind, int i, int val){ if(i<l||i>r){ return; } if(l==r){ st[ind]=val; return; } int mid = (l+r)/2; rupdate(l,mid,ind*2+1,i,val); rupdate(mid+1,r,ind*2+2,i,val); st[ind]=min(st[ind*2+1],st[ind*2+2]); } void update(int i, int val){ rupdate(0,n,0,i,val); } int rquery(int l, int r, int s, int e, int ind){ if(e<l||s>r){ return 1e9; } if(s<=l&&r<=e){ return st[ind]; } int mid = (l+r)/2; return min(rquery(l,mid,s,e,ind*2+1),rquery(mid+1,r,s,e,ind*2+2)); } int query(int l, int r){ return rquery(0,n,l,r,0); } }; map<array<int,2>,vector<array<int,2>>>g; map<array<int,2>,array<int,2>>tp; set<array<int,2>>rs; array<int,2> dfs(array<int,2>st){ if(g[st].size()==0){ tp[st]=st; return st; } if(tp.find(st)!=tp.end()){ return tp[st]; } assert(g[st].size()==1); tp[st]=dfs(g[st][0]); } void initialize(vector<int> T, vector<int> H) { int n = T.size(); int m = H.size(); segTree st(m); set<array<int,2>>elems; for(int i = 0;i<m;i++) { st.update(i,H[i]); elems.insert({H[i],i}); } segTree stt(n); for(int i = 0;i<n;i++){ stt.update(i,T[i]); } //current ranges set<array<int,2>>rangs; int las = -1; for(int i = 0;i<m;i++){ if(T[0]<=H[i]){ //bad if(las!=-1){ rs.insert({las,i-1}); } las=-1; } else{ if(las==-1) las=i; } } if(las!=-1){ rs.insert({las,m-1}); } //graph between ranges //stores when the range was first found map<array<int,2>,int>mp; auto it = elems.begin(); for(int i = 0;i<n;i++){ while(it!=elems.end()&&(*it)[0]<T[i]){ int ind = (*it)[1]; array<int,2>rang = {ind,ind}; bool wor = 0; array<int,2>up = {-1,-1}; auto itup = rangs.lower_bound(rang); if(itup != rangs.end()){ //check if reachable, if yes then nice up = *itup; if(up[0]==ind+1){ rang[1]=up[1]; if(stt.query(mp[up],i)>st.query(up[0],up[1])){ wor=1; } rangs.erase(up); } } rangs.insert(rang); auto itdow = rangs.lower_bound(rang); if(itdow != rangs.begin()){ itdow--; array<int,2>dow = *itdow; rangs.erase(rang); if(dow[1]==ind-1){ rang[0]=dow[0]; if(stt.query(mp[dow],i)>st.query(dow[0],dow[1])){ g[dow].push_back(rang); } rangs.erase(dow); } rangs.insert(rang); } if(wor){ g[up].push_back(rang); } it++; } } for(array<int,2>a:rs){ dfs(a); } } bool can_reach(int L, int R, int S, int D) { if(S>D){ swap(S,D); } array<int,2> rangs = *(--rs.upper_bound({S,1000000000})); array<int,2> rangd = *(--rs.upper_bound({D,1000000000})); rangs=tp[rangs]; rangd=tp[rangd]; if(rangs==rangd){ return 1; } return 0; }

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

obstacles.cpp: In function 'std::array<int, 2> dfs(std::array<int, 2>)':
obstacles.cpp:66:11: warning: control reaches end of non-void function [-Wreturn-type]
   66 |     tp[st]=dfs(g[st][0]);
#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...