abc255 B問題でmapを使用した場合の挙動

AtCoderで本日行われたABC255のB問題について質問です。
自分の回答のエラーになる箇所を探していましたがわからなかったため解説をみました。

解説と自分の回答の方針は同じで、下記箇所のみが違いました。

  1. 解説では明かりを持っている人をvectorで持たせていましたが私はmapを使用した点でした。
  2. 一番近い明かりを持つ人をさがすループ(i=0...n)でi番目の人が明かりを持つ場合一番近い明かりを持つ人は自分になるため明かりを持つ人のループをcontinueする。(実際は意味がない)

発生している問題・エラーメッセージ

mapを使用しても上記の2を考慮しない下記コード(デバッグのため終了後解説のコードを元に作成)では回答が得られました。

c++

#include<bits/stdc++.h>using namespace std; int main(){ int n,k; cin >> n >> k; map<int,int> mp; for(int i=0;i<k;i++){ int nx; cin >> nx; nx--; mp[nx]++; } vector<long long> x(n),y(n); for(int i=0;i<n;i++){cin >> x[i] >> y[i];} long long res=0; for(int i=0;i<n;i++){ long long cres=8e18; for(auto nt: mp){ int nx=nt.first; cres=min(cres,(x[i]-x[nx])*(x[i]-x[nx]) + (y[i]-y[nx])*(y[i]-y[nx])); } } printf("%.12lf\n",sqrt((double)res)); return 0;}

しかし、上記の2を考慮した下記コードにすると正しい回答が得られなくなります。

c++

#include<bits/stdc++.h>using namespace std; int main(){ int n,k; cin >> n >> k; map<int,int> mp; for(int i=0;i<k;i++){ int nx; cin >> nx; nx--; mp[nx]++; } vector<long long> x(n),y(n); for(int i=0;i<n;i++){cin >> x[i] >> y[i];} long long res=0; for(int i=0;i<n;i++){ long long cres=8e18; if(mp[i]>0)continue; // 追加 for(auto nt: mp){ int nx=nt.first; cres=min(cres,(x[i]-x[nx])*(x[i]-x[nx]) + (y[i]-y[nx])*(y[i]-y[nx])); } } printf("%.12lf\n",sqrt((double)res)); return 0;}

試したこと

n回のループでi番目の人が明かりを持つ場合に一番近くの明かりを持つ人との距離が0になっている確認するためのcout、
continueをしたこと仮定するcoutを追記した下記コードを試してみました。

c++

#include<bits/stdc++.h>using namespace std; int main(){ int n,k; cin >> n >> k; map<int,int> mp; for(int i=0;i<k;i++){ int nx; cin >> nx; nx--; mp[nx]++; } vector<long long> x(n),y(n); for(int i=0;i<n;i++){cin >> x[i] >> y[i];} long long res=0; for(int i=0;i<n;i++){ long long cres=8e18; // debag if(mp[i]>0){ cout << i << ":continue" << endl; // continue; }else{ cout << i << ":not continue" << endl; } for(auto nt: mp){ int nx=nt.first; cres=min(cres,(x[i]-x[nx])*(x[i]-x[nx]) + (y[i]-y[nx])*(y[i]-y[nx])); } // debag if(cres==0)cout << cres << endl; else cout << cres << endl; res=max(res,cres); } printf("%.12lf\n",sqrt((double)res)); return 0;}

上記コードは実際にはcontinueしないため正常に動作するコードと同じ挙動になると思いましたが正しい回答を出力できませんでした。

コメントを投稿

0 コメント