제출 #236219

#제출 시각아이디문제언어결과실행 시간메모리
236219MarcoMeijer전선 연결 (IOI17_wiring)C++14
17 / 100
1089 ms6792 KiB
#include "wiring.h" #include <bits/stdc++.h> using namespace std; //macros typedef long long ll; typedef pair<ll, ll> ii; typedef tuple<ll, ll, ll> iii; typedef vector<ll> vi; typedef vector<ii> vii; typedef vector<iii> viii; typedef vector<ll> vll; #define REP(a,b,c) for(ll a=ll(b); a<ll(c); a++) #define RE(a,c) REP(a,0,c) #define RE1(a,c) REP(a,1,c+1) #define REI(a,b,c) REP(a,b,c+1) #define REV(a,b,c) for(ll a=ll(c-1); a>=ll(b); a--) #define INF 1e18 #define pb push_back #define fi first #define se second #define sz size() // min segment tree library template <class T=int, T MAX=1000000000, T DEF=0> class MinSegmentTree { public: void resize(int _size) { size = _size; SEG.assign(size*4, DEF); LAZ.assign(size*4, 0); } void add(int i, int j, T x, T lazy, int p, int l, int r) { SEG[p] += lazy; LAZ[p] += lazy; if(j < l || i > r) return; if(i <= l && j >= r) { SEG[p] += x; LAZ[p] += x; return; } int m=(l+r)/2; add(i,j,x,LAZ[p],p*2+1,l,m); add(i,j,x,LAZ[p],p*2+2,m+1,r); SEG[p] = min(SEG[p*2+1], SEG[p*2+2]); LAZ[p] = 0; } void set(int i, T x, T lazy, int p, int l, int r) { SEG[p] += lazy; LAZ[p] += lazy; if(i < l || i > r) return; if(l == r) { SEG[p] = x; return; } int m=(l+r)/2; set(i,x,LAZ[p],p*2+1,l,m); set(i,x,LAZ[p],p*2+2,m+1,r); SEG[p] = min(SEG[p*2+1], SEG[p*2+2]); LAZ[p] = 0; } T getMin(int i, int j, T lazy, int p, int l, int r) { SEG[p] += lazy; LAZ[p] += lazy; if(j < l || i > r) return MAX; if(i <= l && j >= r) return SEG[p]; int m=(l+r)/2; T a=getMin(i,j,LAZ[p],p*2+1,l,m); T b=getMin(i,j,LAZ[p],p*2+2,m+1,r); return max(a,b); } inline void add(int i, int j, T x) {add(i,j,x,0,0,0,size-1);} inline void add(int i, T x) {add(i,i,x,0,0,0,size-1);} inline void set(int i, T x) {set(i ,x,0,0,0,size-1);} inline T getMin(int i, int j) {return getMin(i,j,0,0,0,size-1);} inline T getMin(int i) {return getMin(i,i,0,0,0,size-1);} vector<T> SEG, LAZ; int size; }; typedef MinSegmentTree<int,1000000000,0> MinSegI; typedef MinSegmentTree<long long,1000000000000000000,0> MinSegLL; //===================// // begin program // //===================// const ll MX = 5e5; vi pos, col; bitset<MX> connected; ll n, m, N; ll nxtC[MX]; ll dp[MX]; ll gd(ll i, ll j) { return abs(pos[i] - pos[j]); } MinSegI seg; long long min_total_length(std::vector<int> r, std::vector<int> b) { n = r.sz, m = b.sz; N = n+m; { ll i=0, j=0; while(i != n || j != m) { if(j == m || (i != n && r[i] < b[j])) { pos.pb(r[i++]); col.pb(0); } else { pos.pb(b[j++]); col.pb(1); } } } dp[0] = 0; ll beg = -1, cent=-1, lastCol=-1; REP(i,1,N+1) { if(col[i-1] != lastCol) { lastCol = col[i-1]; beg = cent; cent = i-1; } dp[i] = INF; if(beg == -1) continue; ll y = i-1; REV(x,max(beg,2*cent-y),cent+1) { ll cst = 0; REP(i,x,cent) cst -= pos[i]; REP(i,cent,y+1) cst += pos[i]; cst += pos[cent - 1] * (2*cent - x - y - 1); dp[i] = min(dp[i], dp[x]+cst); } REV(x,beg,min(cent+1,2*cent-y)) { ll cst = 0; REP(i,x,cent) cst -= pos[i]; REP(i,cent,y+1) cst += pos[i]; cst += pos[cent] * (2*cent - x - y - 1); dp[i] = min(dp[i], dp[x]+cst); } } return dp[N]; }
#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...