結果
| 問題 | No.3527 Minimum Abs Sum |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-05-04 22:28:23 |
| 言語 | C++23 (gcc 15.2.0 + boost 1.89.0) |
| 結果 |
AC
|
| 実行時間 | 132 ms / 2,000 ms |
| コード長 | 2,254 bytes |
| 記録 | |
| コンパイル時間 | 4,607 ms |
| コンパイル使用メモリ | 382,508 KB |
| 実行使用メモリ | 18,648 KB |
| 最終ジャッジ日時 | 2026-05-04 22:28:37 |
| 合計ジャッジ時間 | 10,980 ms |
|
ジャッジサーバーID (参考情報) |
judge3_1 / judge1_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 30 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
#if __has_include("all.hpp")
#include "all.hpp"
#else
#include <atcoder/all>
#endif
using namespace atcoder;
using mint =modint1000000007;
int main(void){
int n;
cin>>n;
long long a[n],b[n];
for(int i=0;i<n;i++)cin>>a[i];
for(int i=0;i<n;i++)cin>>b[i];
vector<pair<long double,pair<int,int>>>v;
for(int i=0;i<n;i++){
if(a[i]!=0){
v.push_back({b[i]/(long double)a[i],{abs(a[i]),i}});
// cout<<v[i].first<<endl;
}
}
if(v.size()==1){
int tmp=v[0].second.second;
mint ans=b[tmp];
ans/=a[tmp];
cout<<ans.val()<<endl;
return 0;
}
sort(v.begin(),v.end());
long double mn=1e18;
vector<long double>rv(v.size(),0);
vector<long double>rrv(v.size(),0);
long double sum1=0,sum2=0,sum3=0,sum4=0;
for(int i=v.size()-1;i>=0;i--){
v[i].first-=v[0].first;
sum1+=v[i].first*v[i].second.first;
sum3+=v[i].second.first;
}
long long tmp=0;
// cout<<sum1<<" "<<sum2<<" "<<sum3<<" "<<sum4<<endl;
for(int i=0;i<v.size();i++){
if(sum1+sum2<mn){
tmp=v[i].second.second;
mn=sum1+sum2;
}
if(i!=v.size()-1){
sum3-=v[i].second.first;
sum1-=(v[i+1].first-v[i].first)*sum3;
sum4+=v[i].second.first;
sum2+=(v[i+1].first-v[i].first)*sum4;
}
// cout<<sum1<<" "<<sum2<<" "<<sum3<<" "<<sum4<<endl;
// cout<<mn<<" "<<tmp<<"!"<<endl;
}
// for(int i=0;i<v.size()-1;i++){
// rv[i+1]=rv[i]+v[i+1].first*v[i+1].second.first;
// }
// for(int i=v.size()-1;i>=1;i--){
// rrv[i-1]=rrv[i]+(v[v.size()-1].first-v[i-1].first)*v[i-1].second.first;
// }
// for(int i=0;i<v.size();i++){
// cout<<v[i].first<<" "<<v[i].second.first<<" "<<v[i].second.second<<" "<<rv[i]<<" "<<rrv[i]<<endl;
// }
// long long tmp=0;
// for(int i=0;i<v.size();i++){
// if(rv[i]+rrv[i]<mn){
// tmp=v[i].second.second;
// mn=rv[i]+rrv[i];
// }
// cout<<mn<<" "<<tmp<<"!"<<endl;
// }
mint ans=b[tmp];
ans/=a[tmp];
cout<<ans.val()<<endl;
return 0;
}