第15回日本情報オリンピック 予選(過去問)から、その提出コードの解答例です。
AtCoderとは、コンテストを通じて、プログラミングやアルゴリズムを学習するサービスです。
atcoder.jp
プログラミングコンテストとは、「与えられた問題をいかに素早く、正確に」解くことができるかを競うものです。
「競技プログラミング」を略して、「競プロ」などと呼ばれています。
#D - JOI国のお散歩事情 (Walking in JOI Kingdom)
僕が作成、提出したコードは、以下のとおりです。
/* AtCoder Problems in C++ #D - JOI国のお散歩事情 (Walking in JOI Kingdom) https://atcoder.jp/contests/joi2016yo/tasks/joi2016yo_d 提出コードの解答例 https://neguse-atama.hatenablog.com */ #include<bits/stdc++.h> using namespace std; using ll=long long; int main(void){ ll n,t,q; cin>>n>>t>>q; vector<ll> a(n),d(n),b(n,0); for(ll i=0;i<n;i++){ cin>>a[i]>>d[i]; if(d[i]==1){ b[i]=a[i]+t; }else{ b[i]=a[i]-t; } } vector<ll> p(q); for(ll i=0;i<q;i++){ cin>>p[i]; } vector<ll> v(n,0); ll x; for(ll i=1;i<n;i++){ if(b[i-1]>b[i]){ if(v[i-1]==0){ x=(a[i]+a[i-1])/2; b[i]=x; b[i-1]=x; v[i-1]=1; v[i]=1; }else{ b[i]=b[i-1]; v[i]=1; } } } for(ll i=n-1;i>=1;i--){ if(b[i-1]>b[i]){ if(v[i]==0 && v[i-1]==0){ x=(a[i]+a[i-1])/2; b[i]=x; b[i-1]=x; v[i-1]=1; v[i]=1; }else{ if(v[i-1]==0){ b[i-1]=b[i]; }else{ b[i]=b[i-1]; } v[i-1]=1; v[i]=1; } } } for(ll i=0;i<q;i++){ cout<<b[p[i]-1]<<endl; } return 0; }