rt,具体是错在 subtask 3 的 #24 ,# 25
过于神秘导致我无法理解,就来问一问
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=200000+5;
struct seg{
int v[N<<4],tot,ls[N<<4],rs[N<<4];
ll sum[N<<4];
void upt(int &p,int l,int r,int pos,int val){
if(!p) p=++tot;
if(l==r) return sum[p]+=1ll*l*val,v[p]+=val,void(0);
int mid=(l+r)>>1;
if(pos<=mid) upt(ls[p],l,mid,pos,val);
else upt(rs[p],mid+1,r,pos,val);
v[p]=v[ls[p]]+v[rs[p]];
sum[p]=sum[ls[p]]+sum[rs[p]];
}
int query(int p,int l,int r,int K){
if(l==r) return l;
int mid=(l+r)>>1;
if(v[ls[p]]>=K) return query(ls[p],l,mid,K);
else return query(rs[p],mid+1,r,K-v[ls[p]]);
}
ll query_val(int p,int l,int r,int z){
//cout<<l<<" "<<r<<" "<<z<<" "<<v[p]<<" "<<sum[p]<<endl;
if(r<=z) return 1ll*v[p]*z-sum[p];
if(z<=l) return sum[p]-1ll*v[p]*z;
int mid=(l+r)>>1;
return query_val(ls[p],l,mid,z)+query_val(rs[p],mid+1,r,z);
}
}seg1,seg2;
struct node{
int l,r;
node(){}
node(int _l,int _r){
l=_l;r=_r;
}
bool friend operator <(node i,node j){
return i.l+i.r<j.l+j.r;
}
};
int tot;
node a[N];
int main(){
int K,n;
long long ans=0;
cin>>K>>n;
char p,q;int s,t;
for(int i=1;i<=n;++i){
cin>>p>>s>>q>>t;
if(p==q) ans+=1ll*abs(t-s);
else ++ans,a[++tot]=node(s,t);
}
if(!tot) return cout<<ans,0;
sort(a+1,a+tot+1);
int rt1=0,rt2=0;
for(int i=1;i<=tot;++i)
seg2.upt(rt2,0,1e9,a[i].l,1),seg2.upt(rt2,0,1e9,a[i].r,1);
ll res=1e18;
if(K==1){
int tmp=seg2.query(rt2,0,1e9,(seg2.v[1]+1)>>1);
res=seg2.query_val(rt2,0,1e9,tmp);
ans+=res;
cout<<ans;
return 0;
}
ll cnt=0;
for(int i=1;i<tot;++i){
cnt=0;
seg1.upt(rt1,0,1e9,a[i].l,1);seg1.upt(rt1,0,1e9,a[i].r,1);
seg2.upt(rt2,0,1e9,a[i].l,-1);seg2.upt(rt2,0,1e9,a[i].r,-1);
ll tmp=seg1.query(rt1,0,1e9,(seg1.v[1]+1)>>1);
cnt+=seg1.query_val(rt1,0,1e9,tmp);
tmp=seg2.query(rt2,0,1e9,(seg2.v[1]+1)>>1);
cnt+=seg2.query_val(rt2,0,1e9,tmp);
res=min(res,cnt);
}
ans+=res;
cout<<ans;
return 0;
}