#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define ll long long
#define ld long double
#define mp make_pair
void chmn(ll &x,ll y){x=min(x,y);}
void chmx(ll &x,ll y){x=max(x,y);}
void Unique(vector<ll>&a){sort(a.begin(),a.end());a.resize(unique(a.begin(),a.end())-a.begin());}
const int N=2000,lg=31;
const ll INF=1e18,inf=1e9;
void Solve1(){
int n;scanf("%i",&n);
vector<int>vals;
ll ans=0;
for(int i=1;i<=n;i++){
char p,q;int s,t;
cin>>p>>s>>q>>t;
if(p==q) ans+=abs(s-t);
else{
ans++;
vals.pb(s);vals.pb(t);
}
}
sort(vals.begin(),vals.end());
int m=vals.size()/2;
for(auto i:vals) ans+=abs(i-vals[m]);
printf("%lld\n",ans);
}
/*struct SegTree{
int root,nc,lc[N*lg],rc[N*lg];ll sum[N*lg];
void Update(ll ss,ll se,ll qind,ll x){Update(root,ss,se,qind,x);}
void Update(int &c,ll ss,ll se,ll qind,ll x){
if(!c)c=++nc;
if(ss==se){sum[c]+=x;return;}
ll mid=ss+se>>1;
if(qind<=mid) Update(lc[c],ss,mid,qind,x);
else Update(rc[c],mid+1,se,qind,x);
sum[c]=sum[lc[c]]+sum[rc[c]];
}
ll Get(ll ss,ll se,ll qs,ll qe){return Get(root,ss,se,qs,qe);}
ll Get(int c,ll ss,ll se,ll qs,ll qe){
if(qs>qe||qe<ss||se<qs)return 0;
if(qs<=ss&&se<=qe)return sum[c];
ll mid=ss+se>>1;return Get(lc[c],ss,mid,qs,qe)+Get(rc[c],mid+1,se,qs,qe);
}
void Clear(){for(int i=0;i<=nc;i++){lc[i]=rc[i]=sum[i]=root=0;}nc=0;}
}STM[2];*/
struct BIT{
vector<ll>T,vals;
void Init(){T.clear();vals.pb(-INF);Unique(vals);T.resize(vals.size());}
void Ubaci(ll i){vals.pb(i);}
void Update(ll i,ll x){for(ll j=upper_bound(vals.begin(),vals.end(),i)-vals.begin()-1;j<T.size();j+=j&-j)T[j]+=x;}
ll Get(ll i){ll x=0;for(ll j=upper_bound(vals.begin(),vals.end(),i)-vals.begin()-1;j>=1;j-=j&-j)x+=T[j];return x;}
ll Get(ll l,ll r){if(l>r)return 0;return Get(r)-Get(l-1);}
void Clear(){T.clear();vals.clear();}
}bt[2];
void Solve2(){
ll n;scanf("%lld",&n);
vector<ll>vals;
vector<pair<ll,ll>>a;
ll ans=0;
for(ll i=1;i<=n;i++){
char p,q;ll s,t;
cin>>p>>s>>q>>t;
ans+=abs(s-t);
if(p!=q){
ans++;
vals.pb(s);vals.pb(t);
if(s>t)swap(s,t);
a.pb({s,t});
}
}
sort(a.begin(),a.end());
Unique(vals);
vector<ll>ev[vals.size()+5];
vector<ll>STL={-INF},prefL={0},STR={-INF},prefR={0};
for(auto [l,r]:a){
STL.pb(r);
STR.pb(l);
/*STL[0].Update(0,inf,r,1);
STL[1].Update(0,inf,r,r);
STR[0].Update(0,inf,l,1);
STR[1].Update(0,inf,l,l);*/
ev[lower_bound(vals.begin(),vals.end(),r)-vals.begin()].pb(l);
}
sort(STL.begin(),STL.end());
for(ll i=1;i<STL.size();i++) prefL.pb(prefL.back()+STL[i]);
sort(STR.begin(),STR.end());
for(ll i=1;i<STR.size();i++) prefR.pb(prefR.back()+STR[i]);
for(ll i=0;i<vals.size();i++){auto j=ev[i];sort(j.begin(),j.end()),reverse(j.begin(),j.end());}
//for(auto [x,y]:a) printf("[%lld %lld] ",x,y);printf("\n");
//for(auto i:vals) printf("%lld ",i);printf("\n");
ll res=INF,valL[vals.size()+5]={0},valR[vals.size()+5]={0};
for(ll i=0;i<vals.size();i++){
ll x1=vals[i],x2=vals[i];
ll lb=upper_bound(STL.begin(),STL.end(),x1-1)-STL.begin()-1;
valL[i]=2*(x1*lb-prefL[lb]);
lb=lower_bound(STR.begin(),STR.end(),x2+1)-STR.begin();
valR[i]=2*(prefR.back()-prefR[lb-1]-x2*(prefR.size()-lb));
}
for(ll i=0;i<vals.size();i++){
ll mns=0;//STM[0].Clear();STM[1].Clear();
for(ll k=0;k<=1;k++){
bt[k].Clear();
for(ll j=i;j<vals.size();j++){
for(auto l:ev[j]){
if(l<vals[i]) break;
bt[k].Ubaci(l+vals[j]);
}
}
bt[k].Init();
}
for(ll j=i;j<vals.size();j++){
ll x1=vals[i],x2=vals[j];
/*int lb=upper_bound(STL.begin(),STL.end(),x1-1)-STL.begin()-1;
//for(auto k:STL) printf("%lld ",k);printf("\n");
//printf("%lld: %i\n",x1-1,lb);
ll sum=2*(x1*lb-prefL[lb]);
lb=lower_bound(STR.begin(),STR.end(),x2+1)-STR.begin();
//for(auto k:STR) printf("%lld ",k);printf("\n");
//printf("%lld: %i\n",x2+1,lb);
sum+=2*(prefR.back()-prefR[lb-1]-x2*(prefR.size()-lb));
//ll sum=2*(x1*STL[0].Get(0,inf,0,x1-1)-STL[1].Get(0,inf,0,x1-1));
//sum+=2*(STR[1].Get(0,inf,x2+1,inf)-x2*STR[0].Get(0,inf,x2+1,inf));*/
ll sum=valL[i]+valR[j];
for(auto l:ev[j]){
if(l<x1) break;
mns+=x2-l;
bt[0].Update(l+x2,1);
bt[1].Update(l+x2,l+x2);
//STM[0].Update(0,2*inf,l+x2,1);
//STM[1].Update(0,2*inf,l+x2,l+x2);
}
sum-=mns;
sum+=bt[1].Get(2*x1,x1+x2)-2*x1*bt[0].Get(2*x1,x1+x2);
sum+=2*x2*bt[0].Get(x1+x2+1,2*x2)-bt[1].Get(x1+x2+1,2*x2);
//sum+=STM[1].Get(0,2*inf,2*x1,x1+x2)-2*x1*STM[0].Get(0,2*inf,2*x1,x1+x2);
//sum+=2*x2*STM[0].Get(0,2*inf,x1+x2+1,2*x2)-STM[1].Get(0,2*inf,x1+x2+1,2*x2);
chmn(res,sum);
}
}
//printf("%lld\n",res);
/*for(int i=0;i<a.size();i++){
ll sum=0;
vector<ll>temp;
for(int j=0;j<=i;j++) temp.pb(a[j].fi),temp.pb(a[j].se);
sort(temp.begin(),temp.end());
ll v=temp[temp.size()/2];
for(auto j:temp) sum+=abs(j-v);
temp.clear();
for(int j=i+1;j<a.size();j++) temp.pb(a[j].fi),temp.pb(a[j].se);
sort(temp.begin(),temp.end());
v=temp[temp.size()/2];
for(auto j:temp) sum+=abs(j-v);
chmn(res,sum);
}*/
/*for(auto i:vals){
for(auto j:vals){
ll sum=0;
for(auto [x,y]:a){
sum+=min(abs(x-i)+abs(y-i),abs(x-j)+abs(y-j));
}
//if(res>sum) printf("%lld %lld\n",i,j);
chmn(res,sum);
}
}*/
if(vals.empty()) res=0;
ans+=res;
printf("%lld\n",ans);
}
int main(){
int KK;scanf("%i",&KK);
if(KK==1) Solve1();
else Solve2();
return 0;
}
컴파일 시 표준 에러 (stderr) 메시지
bridge.cpp: In function 'void Solve1()':
bridge.cpp:15:16: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
15 | int n;scanf("%i",&n);
| ~~~~~^~~~~~~~~
bridge.cpp: In function 'void Solve2()':
bridge.cpp:62:15: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
62 | ll n;scanf("%lld",&n);
| ~~~~~^~~~~~~~~~~
bridge.cpp: In function 'int main()':
bridge.cpp:178:17: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
178 | int KK;scanf("%i",&KK);
| ~~~~~^~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |