蒟蒻求助,C++ WA,C++17 + O2 AC...
查看原帖
蒟蒻求助,C++ WA,C++17 + O2 AC...
344016
wurzang楼主2020/7/31 19:44

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;
}
2020/7/31 19:44
加载中...