1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
| #include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> #define N 100005 typedef long long int ll; struct SGT { int sz[N<<3];ll sum[N<<3]; SGT() {memset(sz,0,sizeof(sz));memset(sum,0,sizeof(sum));} void modify(int o,int l,int r,int x,int d,int s) { if(l==r) {sz[o]+=d;sum[o]+=d*s;} else { int mid=(l+r)>>1; if(x<=mid) modify(o<<1,l,mid,x,d,s); else if(mid+1<=x) modify(o<<1|1,mid+1,r,x,d,s); sz[o]=sz[o<<1]+sz[o<<1|1];sum[o]=sum[o<<1]+sum[o<<1|1]; } } int query(int o,int l,int r,int k) { int mid=(l+r)>>1; if(l==r) return mid; if(k<=sz[o<<1]) return query(o<<1,l,mid,k); return query(o<<1|1,mid+1,r,k-sz[o<<1]); } int querySz(int o,int l,int r,int ql,int qr) { if(ql<=l&&r<=qr) return sz[o]; int mid=(l+r)>>1,ans=0; if(ql<=mid) ans+=querySz(o<<1,l,mid,ql,qr); if(mid+1<=qr) ans+=querySz(o<<1|1,mid+1,r,ql,qr); return ans; } ll querySum(int o,int l,int r,int ql,int qr) { if(ql<=l&&r<=qr) return sum[o]; int mid=(l+r)>>1;ll ans=0; if(ql<=mid) ans+=querySum(o<<1,l,mid,ql,qr); if(mid+1<=qr) ans+=querySum(o<<1|1,mid+1,r,ql,qr); return ans; } } sgt[2]; struct type {int s,t;} loc[N];int cnt=0; inline bool cmp(const type &a,const type &b) {return a.s+a.t<b.s+b.t;} int h[N<<1],sz=0;inline int id(int x) {return std::lower_bound(h,h+sz,x)-h+1;} int main() { int k,n;scanf("%d%d",&k,&n); if(k==1) { ll ans=0; for(register int i=1;i<=n;++i) { char p[2],q[2];int s,t;scanf("%s%d%s%d",p,&s,q,&t); if(p[0]==q[0]) ans+=abs(t-s); else {h[sz++]=s;h[sz++]=t;++ans;} } std::sort(h,h+sz); for(register int i=0;i<sz;++i) ans+=abs(h[sz/2]-h[i]); printf("%lld\n",ans); } else { ll ans=0; for(register int i=1;i<=n;++i) { char p[2],q[2];int s,t;scanf("%s%d%s%d",p,&s,q,&t); if(p[0]==q[0]) ans+=abs(t-s); else { h[sz++]=s;h[sz++]=t; loc[cnt++]=(type){p[0]<q[0]?s:t,p[0]<q[0]?t:s}; } } std::sort(loc,loc+cnt,cmp); std::sort(h,h+sz);sz=std::unique(h,h+sz)-h; for(register int i=0;i<cnt;++i) { sgt[1].modify(1,1,sz,id(loc[i].s),1,loc[i].s); sgt[1].modify(1,1,sz,id(loc[i].t),1,loc[i].t); } ll res=0x3f3f3f3f3f3f3f3fLL; for(register int i=0;i<cnt;++i) { sgt[0].modify(1,1,sz,id(loc[i].s),1,loc[i].s); sgt[0].modify(1,1,sz,id(loc[i].t),1,loc[i].t); sgt[1].modify(1,1,sz,id(loc[i].s),-1,loc[i].s); sgt[1].modify(1,1,sz,id(loc[i].t),-1,loc[i].t); int ls=sgt[0].query(1,1,sz,i+1),rs=sgt[1].query(1,1,sz,cnt-i-1); ll cur=(ll)sgt[0].querySz(1,1,sz,1,ls)*h[ls-1]-sgt[0].querySum(1,1,sz,1,ls); cur+=sgt[0].querySum(1,1,sz,ls,sz)-(ll)sgt[0].querySz(1,1,sz,ls,sz)*h[ls-1]; cur+=(ll)sgt[1].querySz(1,1,sz,1,rs)*h[rs-1]-sgt[1].querySum(1,1,sz,1,rs); cur+=sgt[1].querySum(1,1,sz,rs,sz)-(ll)sgt[1].querySz(1,1,sz,rs,sz)*h[rs-1]; res=std::min(res,cur+cnt); } printf("%lld\n",(res^0x3f3f3f3f3f3f3f3fLL)?ans+res:ans); } return 0; }
|