喜提 28 Pts.
和题解拍了 1970 组数据之后,发现了这个能 Hack 掉我代码的数据:
6
1 6
1 0
1 0
1 4
1 0
6 4
Answer:
6
My code:
12
然后你会发现:如果把第二个判断斜率的地方改成 <,那么答案就正确了!然而交上去只有 58 Pts.
然后,又改成 < 和题解拍,拍了大概 1200 组之后,又出现了一个能 Hack 掉改后的代码,数据:
8
1 0
1 0
1 8
2 0
4 0
8 6
6 8
2 0
Answer:
24
My code:
48
然后你会惊人地发现,如果我把 < 改回 >,那么答案就正确了!
显然我已经想到了一种可以非法 AC 本题的方法,但是我还是想求助一下诸位大佬帮我调一下。
思路见 这个帖。
代码:
#include<bits/stdc++.h>
using namespace std;
long long n,ans=2e18;
const int N=2e4+4;
long long f[N];
long long tot;
long long dis[N],weight[N];
long long head=1,tail=1;
long long q[N],d[N],w[N];
long long sq(long long i){
return weight[i]*dis[i];
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>w[i]>>d[i];
dis[i+1]=dis[i]+d[i]; //Before i this point.
weight[i]=weight[i-1]+w[i];
}
for(int i=1;i<=n;i++) tot+=(dis[n+1]-dis[i])*w[i];
for(int i=1;i<=n;i++){
while(head<tail&&sq(q[head+1])-sq(q[head])<dis[i]*(weight[q[head+1]]-weight[q[head]])) head++;
f[i]=tot-weight[q[head]]*(dis[n+1]-dis[q[head]])-(weight[i]-weight[q[head]])*(dis[n+1]-dis[i]);
while(head<tail&&(sq(i)-sq(q[tail]))*(weight[q[tail]]-weight[q[tail-1]])>(sq(q[tail])-sq(q[tail-1])*(weight[i]-weight[q[tail]]))) tail--; //大于小于问题
q[++tail]=i;
}
for(int i=1;i<=n;i++) ans=min(ans,f[i]);
cout<<ans<<endl;
return 0;
}
关注会给,放心。