C.
ソリューション
サフィックスを注文した後、アレイに追加されます。中央値は、必ずしも配列内の特定の要素に等しくないことに留意されたいです。
コード
#include<bits/stdc++.h>
using namespace std;
typedef long long D;
const int maxn=200003;
const D INF=1000000000000ll;
int n;
D k,a[maxn];
int main(){
scanf("%d%lld",&n,&k);
for(int i=1;i<=n;i++)scanf("%lld",a+i);
sort(a+1,a+n+1);
a[n+1]=INF;
int i=n/2+1,j=i;
D cnt=0,ans=a[i];
while(1){
for(;j<=n&&a[i]==a[j];j++);
if(cnt+(j-n/2-1)*(a[j]-a[i])>k)break;
cnt+=(j-n/2-1)*(a[j]-a[i]);
ans=a[j];
i=j;
}
ans+=(k-cnt)/(j-n/2-1);
printf("%lld\n",ans);
return 0;
}
D.
ソリューション
最初の前処理\(L [i]が\)と\(R [I] \)各行宝の左端と右端の宝物を表します。
行ごとに、ベストはわずか4セキュアチャネルを上がる:\(Lの[I] \)の左右の、\(R&LT [I] \)左右の。
セット\(DP [i]の[0/1/2/3 ] \)は表し\(私は\)ラインの四つの状態への答えは、それに応じて転送することができます。
最初の行の特別な注意文。詳細。
コード
#include<bits/stdc++.h>
using namespace std;
typedef long long D;
const int maxn=200003;
const D INF=0x3f3f3f3f3f3f3f3f;
int n,m,s,q,L[maxn],R[maxn],b[maxn],x[maxn][4],p[maxn],cnt;
D dp[maxn][4];
int main(){
scanf("%d%d%d%d",&n,&m,&s,&q);
fill(L+1,L+n+1,maxn);
for(int i=1;i<=s;i++){
int x,y;
scanf("%d%d",&x,&y);
L[x]=min(L[x],y);
R[x]=max(R[x],y);
p[++cnt]=x;
}
sort(p+1,p+cnt+1);
cnt=unique(p+1,p+cnt+1)-p-1;
for(int i=1;i<=q;i++)scanf("%d",b+i);
sort(b+1,b+q+1);
if(cnt==1){
int i=p[1];
printf("%d\n",i==1?
R[i]-1:
R[i]-L[i]
+min(abs(b[1]-L[i]),abs(b[1]-R[i]))
+i-1+b[1]-1
);
return 0;
}
for(int _i=1;_i<=cnt;_i++){
int i=p[_i];
int *tmp1=lower_bound(b+1,b+q+1,L[i]),*tmp2=lower_bound(b+1,b+q+1,R[i]);
x[i][0]=tmp1[-1],x[i][1]=*tmp1,x[i][2]=tmp2[-1],x[i][3]=*tmp2;
}
for(int j=0;j<=3;j++){
int i=p[1];
dp[i][j]=INF;
if(x[i][j]){
dp[i][j]=(i==1?
R[i]-1+abs(x[i][j]-R[i]):
R[i]-L[i]
+min(abs(b[1]-L[i])+abs(x[i][j]-R[i]),abs(b[1]-R[i])+abs(x[i][j]-L[i]))
+i-1+b[1]-1
);
}
}
for(int _i=2;_i<cnt;_i++){
for(int j=0;j<=3;j++){
int i=p[_i],ii=p[_i-1];
dp[i][j]=INF;
if(x[i][j]){
for(int k=0;k<=3;k++){
dp[i][j]=min(dp[i][j],dp[ii][k]+R[i]-L[i]
+min(abs(x[ii][k]-L[i])+abs(x[i][j]-R[i]),abs(x[ii][k]-R[i])+abs(x[i][j]-L[i]))
+i-ii);
}
}
}
}
// for(int _i=1;_i<cnt;_i++){
// for(int j=0;j<=3;j++){
// int i=p[_i];
//printf("x:%d dp[%d][%d] = %lld\n",x[i][j],i,j,dp[i][j]);
// }
// }
D ans=INF;
for(int k=0;k<=3;k++){
int i=p[cnt],ii=p[cnt-1];
ans=min(ans,dp[ii][k]+R[i]-L[i]
+min(abs(x[ii][k]-L[i]),abs(x[ii][k]-R[i]))
+i-ii);
}
printf("%lld\n",ans);
return 0;
}