记录编号 |
597413 |
评测结果 |
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA |
题目名称 |
魔法传送阵 |
最终得分 |
100 |
用户昵称 |
小金 |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
1.921 s |
提交时间 |
2024-11-27 17:44:04 |
内存使用 |
4.78 MiB |
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
struct dian{
int a,b;
}p[1000010];
int k,n,tot,cnt;
long long ans,haf[2][1000010],s1,s2,pl[1000010];
priority_queue<int> q1;
priority_queue<int,vector<int>,greater<int> > q2;
bool cmp(dian x,dian y)
{
return x.a+x.b<y.a+y.b;
}
int main()
{
freopen("bridge.in","r",stdin);
freopen("bridge.out","w",stdout);
scanf("%d%d",&k,&n);
for(int i=1;i<=n;i++)
{
long long x1,x2;
char c1,c2;
scanf(" %c%lld %c%lld",&c1,&x1,&c2,&x2);
if(c1==c2)
{
ans+=abs(x2-x1);
}
else
{
ans++;
p[++tot].a=x1;
p[tot].b=x2;
pl[++cnt]=x1;
pl[++cnt]=x2;
}
}
if(k==1)
{
sort(pl+1,pl+cnt+1);
long long pos=pl[cnt/2];
for(int i=1;i<=cnt;i++)
{
ans+=abs(pl[i]-pos);
}
printf("%lld",ans);
}
else
{
sort(p+1,p+tot+1,cmp);
for(int i=1;i<=tot;i++)
{
q1.push(p[i].a);
q1.push(p[i].b);
s1+=p[i].a+p[i].b;
s2+=q1.top();
s1-=q1.top();
q2.push(q1.top());
q1.pop();
if(q1.top()>q2.top())
{
int t=q2.top();
int l=q1.top();
q2.pop();
q1.pop();
q2.push(l);
q1.push(t);
s1+=t-l;
s2-=t-l;
}
haf[0][i]=s2-s1;
}
while(!q1.empty())
{
q1.pop();
}
while(!q2.empty())
{
q2.pop();
}
s1=0;
s2=0;
for(int i=tot;i>=1;i--)
{
q1.push(p[i].a);
q1.push(p[i].b);
s1+=p[i].a+p[i].b;
s2+=q1.top();
s1-=q1.top();
q2.push(q1.top());
q1.pop();
if(q1.top()>q2.top())
{
int t=q2.top();
int l=q1.top();
q2.pop();
q1.pop();
q2.push(l);
q1.push(t);
s1+=t-l;
s2-=t-l;
}
haf[1][i]=s2-s1;
}
long long mi=1e18;
for(int i=1;i<=tot+1;i++)
{
mi=min(mi,haf[0][i-1]+haf[1][i]);
}
printf("%lld",mi+ans);
}
return 0;
}