紙媒体で管理するとなくなりがちなのでブログで進捗などを管理することにしました
※殆どの記事は自分自身のためだけにかいています.他人に見せられるレベルには至っていません...

ABC030_C

飛行機で何往復できるかという問題
普通にやると大変なのでlower_bound()による二分探索を使った.
lower_bound(a,a+n,value)はvalue以上の値の位置を返す.

#include <bits/stdc++.h>
using namespace std;
int main(){
    int a[5] = {1,3,5,7,9};
    int* pos = lower_bound(a,a+5,8);//8を初めて越すのはa[4]:9
    cout<<pos-a<<endl;//4
    cout<<*pos<<endl;//9
    return 0;
}

配列aの範囲内に有るか無いかを条件文で判断するには

if(pos-a<n)//ある
else //ない

を用いた.
もっと良い方法がありそうだが…
解答

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int n,m,x,y;
    int a[100000],b[100000];
    cin>>n>>m>>x>>y;
    for(int i=0;i<n;i++)cin>>a[i];
    for(int i=0;i<m;i++)cin>>b[i];
    int cur = 0;
    int *pos;
    int res = 0;
    int flag = 1;//flag = 1ならばAにいる
    while(1){
        if(flag){
            pos = lower_bound(a,a+n,cur);//curより大きい最初の位置
            if(pos-a<n){
                cur = *pos+x;//飛行機に乗る
                flag = 0;
            }else{
                break;
            }
        }else{
            pos = lower_bound(b,b+m,cur);
            if(pos-b<m){
                cur = *pos+y;
                res++;
                flag = 1;
            }else{
                break;
            }
        }
    }
    cout<<res<<endl;
    return 0;
}