# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1159266 | AlgorithmWarrior | Palembang Bridges (APIO15_bridge) | C++20 | 0 ms | 0 KiB |
#include <bits/stdc++.h>
using namespace std;
long long const INF=1e18;
int const MAX=2e5+5;
struct location{
int pos;
char type;
int id;
bool operator<(location ot){
return pos<ot.pos;
}
}loc[MAX];
int k,n;
long long s_init;
int total_loc;
struct interval{
int l,r,mij;
}interv[MAX];
struct cmp{
bool operator()(int a,int b){
return interv[a].mij<interv[b].mij;
}
};
void read(){
cin>>k>>n;
int i;
for(i=1;i<=n;++i){
char t1,t2;
int p1,p2;
cin>>t1>>p1>>t2>>p2;
s_init+=abs(p2-p1);
if(t1!=t2){
loc[++total_loc]={p1,t1,i};
loc[++total_loc]={p2,t2,i};
++s_init;
}
if(p1>p2)
swap(p1,p2);
interv[i]={p1,p2,(p1+p2)/2};
}
sort(loc+1,loc+total_loc+1);
}
bool gasit_per[MAX];
void minself(long long&x,long long val){
if(x>val)
x=val;
}
long long spate[MAX],fata[MAX];
void precalc(int inc,int fin,long long v[],int incr){
long long nr=0;
int nrper=0;
int i;
for(i=inc;i!=fin+incr;i+=incr){
if(i!=inc)
nr+=2LL*nrper*abs(loc[i-incr].pos-loc[i].pos);
v[i]=nr;
if(!gasit_per[loc[i].id])
gasit_per[loc[i].id]=1;
else
++nrper;
}
for(i=1;i<=n;++i)
gasit_per[i]=0;
}
long long solve1(){
long long rasp=INF;
int i;
for(i=1;i<=total_loc;++i)
minself(rasp,spate[i]+fata[i]);
return rasp;
}
set<int,cmp>inside;
long long better(int st,int dr){
long long total=0;
for(auto id : inside){
}
}
long long solve2(){
int st=1,dr;
for(dr=1;dr<=total_loc;++dr){
if(!gasit_per[loc[dr].id])
gasit_per[loc[dr].id]=1;
else
inside.insert(loc[dr].id);
while(st<dr);
}
}
long long get_final_answer(){
if(!total_loc)
return s_init;
precalc(1,total_loc,spate,1);
precalc(total_loc,1,fata,-1);
if(k==1)
return solve1()+s_init;
}
int main()
{
read();
cout<<get_final_answer();
return 0;
}