제출 #581092

#제출 시각아이디문제언어결과실행 시간메모리
581092Koosha_mv전선 연결 (IOI17_wiring)C++14
100 / 100
476 ms22552 KiB
#include <bits/stdc++.h>
using namespace std;
#define dbgv(v) cout<<#v<<" = "; f(i,0,v.size()) cout<<v[i]<<" "; cout<<endl
#define dbga(a,x,y) cout<<#a<<" = "; f(i,x,y) cout<<a[i]<<" "; cout<<endl
#define erorp(x) cout<<#x<<"={"<<x.F<<" , "<<x.S<<"}"<<endl
#define eror(x) cout<<#x<<'='<<(x)<<endl
#define f_(i,a,b) for(int i=a;i>=b;i--)
#define f(i,a,b) for(int i=a;i<b;i++)
#define nb(x) __builtin_popcount(x)
#define all(v) v.begin(),v.end()
#define bit(n,k) (((n)>>(k))&1)
#define Add(x,y) x=(x+y)%mod
#define maxm(a,b) a=max(a,b)
#define minm(a,b) a=min(a,b)
#define lst(x) x[x.size()-1]
#define sz(x) int(x.size())
#define mp make_pair
#define ll long long
#define pb push_back
#define S second
#define F first
#include "wiring.h"

const int N=2e5+99;
const ll inf=1e15+99;

int n;
ll last[2],st[2],dp[N],seg[N<<2],lz[N<<2];
vector<pair<ll,ll>> A;
vector<pair<pair<ll,ll>,ll>> op;

void shift(int id){
  seg[id*2+0]+=lz[id];
  seg[id*2+1]+=lz[id];
  lz[id*2+0]+=lz[id];
  lz[id*2+1]+=lz[id];
  lz[id]=0;
}
void add(int L,int R,ll val,int id=1, int l=1,int r=n+1){
  if(r<=L || R<=l) return ;
  if(L<=l && r<=R){
    lz[id]+=val;
    seg[id]+=val;
    return ;   
  }
  int mid=(l+r)>>1;
  shift(id);
  add(L,R,val,id*2+0,l,mid);
  add(L,R,val,id*2+1,mid,r);
  seg[id]=min(seg[id*2+0],seg[id*2+1]);
}
void clear(){
	for(auto p : op){
		add(p.F.F,p.F.S,p.S);
	}
	op.clear();
}
void addseg(int l,int r,ll val){
	op.pb({{l,r},val});
	add(l,r,val);
}
ll query(int L,int R,int id=1,int l=1,int r=n+1){
  if(r<=L || R<=l) return inf;
  if(L<=l && r<=R){
  	return seg[id];
  }
  shift(id);
  int mid=(l+r)>>1;
  return min(query(L,R,id*2+0,l,mid),query(L,R,id*2+1,mid,r));
}
ll min_total_length(vector<int> r,vector<int> b){
	last[0]=-inf,last[1]=-inf;
	for(auto x : r) A.pb({x,0});
	for(auto x : b) A.pb({x,1});
	A.pb({-1,-1});
	sort(all(A));
	n=A.size()-1;
	f(i,1,n+1){
		dp[i]=inf;
		if(A[i].S!=A[i-1].S){
			st[A[i].S]=i;
			clear();
			f_(j,i-1,1){
				if(A[j].S==A[i].S) break;
				addseg(1,j+1,A[i].F-A[j].F);
			}
		}
		if(i-st[A[i].S]<st[A[i].S]-st[A[i].S^1] && st[A[i].S]!=1){
			ll len=A[i].F-A[st[A[i].S]].F,prt=i-st[A[i].S];
			addseg(st[A[i].S^1],i-prt-prt,len);
			dp[i]=query(st[A[i].S^1],i-prt-prt);
		}
		maxm(last[A[i].S],1ll*A[i].F);
		minm(dp[i],dp[i-1]+A[i].F-last[A[i].S^1]);
		ll res=0;
		f_(j,i-1,1){
			if(A[j].S==A[i].S) break;
			res+=A[i].F-A[j].F;
			minm(dp[i],dp[j-1]+res);
		}
		if(i!=n){
			add(i+1,i+2,dp[i]);
		}
	}
	return dp[A.size()-1];
}
#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...