제출 #1137189

#제출 시각아이디문제언어결과실행 시간메모리
1137189owoovoRoller Coaster Railroad (IOI16_railroad)C++20
100 / 100
192 ms20680 KiB
#include "railroad.h" #include<bits/stdc++.h> #define ll long long #define F first #define S second using namespace std; const int maxn=1e9+10; int dsu[4000010]; vector<int> s,t; int f(int a){ if(dsu[a]==a)return a; dsu[a]=f(dsu[a]); return dsu[a]; } bool onion(int a,int b){ a=f(a); b=f(b); if(a==b)return 0; dsu[a]=b; return 1; } ll plan_roller_coaster(vector<int> S, vector<int> T) { int n = (int) S.size(); ll ans=0; s=S,t=T; vector<int> use; s.push_back(maxn); t.push_back(0); for(int i=0;i<=n;i++){ use.push_back(t[i]); use.push_back(s[i]); } sort(use.begin(),use.end()); use.erase(unique(use.begin(),use.end()),use.end()); int sz=use.size(); for(int i=0;i<sz;i++)dsu[i]=i; for(int i=0;i<=n;i++){ t[i]=lower_bound(use.begin(),use.end(),t[i])-use.begin(); s[i]=lower_bound(use.begin(),use.end(),s[i])-use.begin(); onion(s[i],t[i]); } vector<int> ns=s,nt=t; int cnt=0,spos=0,tpos=0; sort(ns.begin(),ns.end()); sort(nt.begin(),nt.end()); for(int i=0;i<sz-1;i++){ while(spos<=n&&ns[spos]==i)cnt++,spos++; while(tpos<=n&&nt[tpos]==i)cnt--,tpos++; if(cnt<0){ onion(i,i+1); }else if(cnt>0){ onion(i,i+1); ans+=cnt*(ll)(use[i+1]-use[i]); } } vector<pair<ll,pair<int,int>>> edge; for(int i=0;i<sz-1;i++){ edge.push_back({use[i+1]-use[i],{i,i+1}}); } sort(edge.begin(),edge.end()); for(auto x:edge){ if(onion(x.S.F,x.S.S)){ ans+=x.F; } } return ans; }

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

railroad.h:1:9: warning: #pragma once in main file
    1 | #pragma once
      |         ^~~~
railroad_c.h:1:9: warning: #pragma once in main file
    1 | #pragma once
      |         ^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...