제출 #679301

#제출 시각아이디문제언어결과실행 시간메모리
679301penguin133Palembang Bridges (APIO15_bridge)C++17
49 / 100
616 ms18336 KiB
#include <bits/stdc++.h> using namespace std; #define int long long #define pi pair<int, int> #define pii pair<int, pi> #define fi first #define se second #ifdef _WIN32 #define getchar_unlocked _getchar_nolock #endif int n, k; vector<int> st, en; int stuf[100005], stuf2[100005]; int P[100005], S[100005], dp[1000005]; vector<int> pos; vector<pi> brute; int mini = 1e18; void dnc(int l, int r, int optl, int optr){ if(l > r)return; int mid = (l + r) >> 1; int mn = 1e18, opt = optr; for(int i=max(mid+1, optl);i<=optr;i++){ int cur = 0; for(auto [a, b] : brute){ cur += min(abs(pos[mid]-a) + abs(pos[mid]-b), abs(pos[i]-a) + abs(pos[i]-b)); cur -= abs(a - b); } //cout << cur << " " << pos[mid] << " " << pos[i] << '\n'; if(mn > cur)mn = cur, opt = i; } dp[mid] = pos[opt]; mini = min(mini, mn); dnc(l, mid - 1, optl, opt); dnc(mid+1, r, opt, optr); } void solve(){ cin >> k >> n; int ans = 0, tmp = 0; for(int i=1;i<=n;i++){ char a, c; int b, d; cin >> a >> b >> c >> d; if(a == c)ans += abs(b - d); else st.push_back(max(b, d)), en.push_back(min(b, d)), tmp+= abs(b - d) + 1, pos.push_back(b), pos.push_back(d), brute.push_back({min(b, d), max(b, d)}); } sort(st.begin(), st.end()); sort(en.begin(), en.end()); P[0] = (st.size() ? st[0] : 0); int mn = (st.size() ? 1e18 : 0); for(int i=1;i<(int)st.size();i++)P[i] = P[i-1] + st[i]; for(int i=(int)en.size()-1;i>=0;i--)S[i] = S[i+1] + en[i]; sort(pos.begin(), pos.end()); pos.erase(unique(pos.begin(), pos.end()), pos.end()); int cnt = 0; for(auto i : pos){ int cur = 0; int x = upper_bound(st.begin(), st.end(), i) - st.begin(); if(x != 0){ x--; cur += 2 * ((x + 1) * i - P[x]); } stuf[cnt] = cur; x = upper_bound(en.begin(), en.end(), i) - en.begin(); if(x != (int)en.size()){ cur += 2 * (S[x] - i * ((int)en.size() - x)); stuf2[cnt] = 2 * (S[x] - i * ((int)en.size() - x)); } cnt++; //cout << i << " " << cur << '\n'; mn = min(mn, cur); } if(k == 1){ cout << ans + tmp + mn; return; } mn = (st.size() ? 1e18 : 0); cnt = 0; for(auto i : pos){ priority_queue<pii, vector<pii>, greater<pii> > pq; vector<pi> rem; for(auto [a, b] : brute)if(a > i)rem.push_back({b, a}); sort(rem.begin(), rem.end()); int cur = 0, in = 0, cur2 = 0, grr = 0, grr2 = 0, id = cnt; for(auto j : pos){ if(i >= j)continue; id++; while(in < (int)rem.size() && rem[in].fi <= j){ cur += rem[in].fi; grr++; pq.push({rem[in].fi + rem[in].se, {rem[in].fi, rem[in].se}}); in++; } while(!pq.empty() && pq.top().fi < i + j){ pi lol = pq.top().se; pq.pop(); cur -= lol.fi; cur2 += lol.se; grr--; grr2++; } mn = min(mn, stuf[cnt] + stuf2[id] + 2 * (grr * j - cur) + 2 * (cur2 - grr2 * i)); //cout << stuf[cnt] << " " << stuf2[id] << " " << 2 * (grr * j - cur) << " " << 2 * (cur2 - grr2 * i) << " " << i << " " << j << '\n'; } cnt++; } cout << ans + mn + tmp; } main(){ ios::sync_with_stdio(0);cin.tie(0); int tc = 1; //cin >> tc; for(int tc1=1;tc1<=tc;tc1++){ // cout << "Case #" << tc1 << ": "; solve(); } }

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

bridge.cpp:110:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
  110 | main(){
      | ^~~~
#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...