如果在同一侧就直接ans+=abs(t-s),否则就ans++。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int MX=2e5+9;
struct node{
ll s,e,k;
bool operator<(const node &a)const {
return k<a.k;
}
node(ll s,ll e,ll k){
this->s=s;
this->e=e;
this->k=k;
}
node(){}
}t[MX];
int son[MX][2],ran[MX];
ll val[MX],sum[MX],siz[MX];
int Root,tot=0;
void pushup(int now){
siz[now]=siz[son[now][0]]+siz[son[now][1]]+1;
sum[now]=sum[son[now][0]]+sum[son[now][1]]+val[now];
return ;
}
void split(int now,int k,int &x,int &y){
if( !now ){
x=y=0;
return; // 不可以忘记return
}
else{
if( k<val[now] )
y=now,split(son[now][0],k,x,son[now][0]);
else
x=now,split(son[now][1],k,son[now][1],y);
}
pushup(now);
}
int merge(int x,int y){
if( !x || !y )
return x+y;
if( ran[x]<ran[y] ){
son[x][1]=merge(son[x][1],y);
pushup(x);
return x;
}
else{
son[y][0]=merge(x,son[y][0]);
pushup(y);
return y;
}
}
int new_node(ll k){
val[++tot]=k; // 这里千万不可以写成val[++tot]=sum[tot]=k的形式,千万小心,
sum[tot]=k;
siz[tot]=1;
ran[tot]=rand();
return tot;
}
void insert(ll k){
int x,y;
split(Root,k,x,y);
Root=merge(x,merge(new_node(k),y));
}
int rank(int now,int k){
if( !now )
return 0;
if( siz[son[now][0]]+1<k )
return rank(son[now][1],k-siz[son[now][0]]-1);
else if( siz[son[now][0]]+1==k )
return val[now];
else
return rank(son[now][0],k);
}
ll que( ll k ){
int x,y,Siz=siz[Root]>>1;
split(Root,k-1,x,y);
ll ans=sum[x];
ans+=k*(Siz-siz[x]);
Root=merge(x,y); //不可以忘记merge合并
return ans<<1;
}
ll cal(){
ll k=rank(Root,siz[Root]>>1);
return sum[Root]-que(k);
}
int k0,m=0;
ll Ans[MX],ans=0;
void work2(){
memset(son,0,sizeof(son));
tot=Root=0;
ll an=Ans[m];
for( int i=m ; i>=1 ; i-- ){
insert(t[i].s);
insert(t[i].e);
an=min(an,Ans[i-1]+cal());
}
printf("%lld\n",an+ans);
return ;
}
int main()
{
freopen("input.txt","r",stdin);
int M;
scanf("%d %d",&k0,&M);
char q,p;
ll s,e;
while( M-- ){
scanf("\n");
scanf("%c%lld %c%lld",&p,&s,&q,&e);
if( p==q )
ans+=abs(e-s);
else{
ans++;
node tt(s,e,s+e);
t[++m]=tt;
}
}
sort(t+1,t+m+1);
for( int i=1 ; i<=m ; i++ ){
insert(t[i].s);
insert(t[i].e);
Ans[i]=cal();
}
if( k0==1 )
printf("%lld\n",Ans[m]+ans);
else
work2();
return 0;
}