跳转至

十七届蓝桥杯模拟赛(二)

视频讲解

🎥 视频讲解

第一题

日期统计

5分
#include<bits/stdc++.h>
using namespace std;

int month[]={-1,31,28,31,30,31,30,31,31,30,31,30,31};

bool check(int t){
    int cnt[10]={0};
    string s=to_string(t);
    for(int i=0;i<8;i++){
        if(i==4 && s[i]=='0') continue;
        if(i==6 && s[i]=='0') continue;
        cnt[s[i]-'0']++;
    }
    int mx=0,mi=10;
    for(int i=0;i<=9;i++){
        if(cnt[i]){
            mx=max(mx,cnt[i]);
            mi=min(mi,cnt[i]);
        }
    }
    return mx==mi;
}

bool leap(int year){
    return year%400==0 || (year%4==0 && year%100!=0);
}

int main(){
    int ans=0;
    bool f=0;

    for(int year=2239;year<=9876;year++){
        if(leap(year)) month[2]=29;
        else month[2]=28;

        for(int mo=1;mo<=12;mo++){
            for(int day=1;day<=month[mo];day++){
                if(year==2239 && mo==9 && day==9) f=1;
                if(!f) continue;

                int t=year*10000+mo*100+day;
                if(check(t)) ans++;

                if(year==9876 && mo==1 && day==1){
                    cout<<ans;
                    return 0;
                }
            }
        }
    }
    return 0;
}
import java.util.*;

public class Main {

    static int[] month={-1,31,28,31,30,31,30,31,31,30,31,30,31};

    static boolean check(int t){
        int[] cnt=new int[10];
        String s=String.valueOf(t);
        while(s.length()<8) s="0"+s;

        for(int i=0;i<8;i++){
            if(i==4 && s.charAt(i)=='0') continue;
            if(i==6 && s.charAt(i)=='0') continue;
            cnt[s.charAt(i)-'0']++;
        }

        int mx=0,mi=10;
        for(int i=0;i<10;i++){
            if(cnt[i]>0){
                mx=Math.max(mx,cnt[i]);
                mi=Math.min(mi,cnt[i]);
            }
        }
        return mx==mi;
    }

    static boolean leap(int y){
        return y%400==0 || (y%4==0 && y%100!=0);
    }

    public static void main(String[] args){
        int ans=0;
        boolean f=false;

        for(int year=2239;year<=9876;year++){
            month[2]=leap(year)?29:28;

            for(int mo=1;mo<=12;mo++){
                for(int day=1;day<=month[mo];day++){
                    if(year==2239 && mo==9 && day==9) f=true;
                    if(!f) continue;

                    int t=year*10000+mo*100+day;
                    if(check(t)) ans++;

                    if(year==9876 && mo==1 && day==1){
                        System.out.println(ans);
                        return;
                    }
                }
            }
        }
    }
}
month=[-1,31,28,31,30,31,30,31,31,30,31,30,31]

def check(t):
    cnt=[0]*10
    s=str(t).zfill(8)
    for i in range(8):
        if i==4 and s[i]=='0': continue
        if i==6 and s[i]=='0': continue
        cnt[int(s[i])]+=1
    vals=[c for c in cnt if c>0]
    return max(vals)==min(vals)

def leap(y):
    return y%400==0 or (y%4==0 and y%100!=0)

ans=0
f=False

for year in range(2239,9877):
    month[2]=29 if leap(year) else 28
    for mo in range(1,13):
        for day in range(1,month[mo]+1):
            if year==2239 and mo==9 and day==9:
                f=True
            if not f:
                continue
            t=year*10000+mo*100+day
            if check(t):
                ans+=1
            if year==9876 and mo==1 and day==1:
                print(ans)
                exit()

第二题

编程比赛

答案:192939070136

5分
#include<bits/stdc++.h>
using namespace std;

typedef long long ll;

int main(){
    ll ans=0;
    for(ll i=789456,t1=1;t1<=901234;t1++,i=i+567890){
        for(ll j=654321,t2=1;t2<=500001;t2++,j=j+876543){
            if(i<j) ans++;
        }
    }
    cout<<ans;
    return 0;
}
import java.util.*;

public class Main {
    public static void main(String[] args){
        long ans=0;
        long i=789456;
        for(long t1=1;t1<=901234;t1++,i+=567890){
            long j=654321;
            for(long t2=1;t2<=500001;t2++,j+=876543){
                if(i<j) ans++;
            }
        }
        System.out.println(ans);
    }
}
ans=0
i=789456
for t1 in range(1,901235):
    j=654321
    for t2 in range(1,500002):
        if i<j:
            ans+=1
        j+=876543
    i+=567890
print(ans)

第三题

跳柱文明

10分
#include<bits/stdc++.h>
using namespace std;

const int N=1e3+10;
int n,x;
int h[N];

void solve(){
    cin>>n>>x;
    for(int i=1;i<=n;i++) cin>>h[i];

    for(int i=2;i<=n;i++){
        if(h[i]>h[i-1]){
            if(h[i]-h[i-1]>1){
                cout<<"Lose\n";
                return;
            }
        }
        if(h[i]<h[i-1]){
            if(h[i-1]-h[i]>x){
                cout<<"Lose\n";
                return;
            }
        }
    }
    cout<<"Win\n";
}

int main(){
    int T;
    cin>>T;
    while(T--) solve();
    return 0;
}
import java.util.*;

public class Main {

    static int n,x;
    static int[] h=new int[1010];

    static void solve(Scanner sc){
        n=sc.nextInt();
        x=sc.nextInt();
        for(int i=1;i<=n;i++) h[i]=sc.nextInt();

        for(int i=2;i<=n;i++){
            if(h[i]>h[i-1]){
                if(h[i]-h[i-1]>1){
                    System.out.println("Lose");
                    return;
                }
            }
            if(h[i]<h[i-1]){
                if(h[i-1]-h[i]>x){
                    System.out.println("Lose");
                    return;
                }
            }
        }
        System.out.println("Win");
    }

    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int T=sc.nextInt();
        while(T-->0) solve(sc);
    }
}
import sys
input=sys.stdin.readline

def solve():
    n,x=map(int,input().split())
    h=[0]+list(map(int,input().split()))
    for i in range(2,n+1):
        if h[i]>h[i-1]:
            if h[i]-h[i-1]>1:
                print("Lose")
                return
        if h[i]<h[i-1]:
            if h[i-1]-h[i]>x:
                print("Lose")
                return
    print("Win")

T=int(input())
for _ in range(T):
    solve()

第四题

合成西瓜

7分
#include<bits/stdc++.h>
using namespace std;

typedef long long ll;
const int mod=998244353;

ll ksm(ll x,ll y,ll p){
    ll res=1;
    for(ll i=1;i<=y;i++){
        res=res*x%p;
    }
    return res;
}

void solve(){
    ll x,y;
    cin>>x>>y;
    if(x<=y){
        cout<<1<<"\n";
        return;
    }
    cout<<(y+1)*ksm(2,x-y-1,mod)%mod<<"\n";
}

int main(){
    int T;
    cin>>T;
    while(T--) solve();
    return 0;
}
import java.util.*;

public class Main {

    static final long mod=998244353;

    static long ksm(long x,long y){
        long res=1;
        for(long i=1;i<=y;i++){
            res=res*x%mod;
        }
        return res;
    }

    static void solve(Scanner sc){
        long x=sc.nextLong();
        long y=sc.nextLong();
        if(x<=y){
            System.out.println(1);
            return;
        }
        System.out.println((y+1)*ksm(2,x-y-1)%mod);
    }

    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int T=sc.nextInt();
        while(T-->0) solve(sc);
    }
}
import sys
input=sys.stdin.readline

mod=998244353

def ksm(x,y):
    res=1
    for _ in range(y):
        res=res*x%mod
    return res

def solve():
    x,y=map(int,input().split())
    if x<=y:
        print(1)
        return
    print((y+1)*ksm(2,x-y-1)%mod)

T=int(input())
for _ in range(T):
    solve()
10分
#include<bits/stdc++.h>
using namespace std;

typedef long long ll;
const int mod=998244353;

ll ksm(ll x,ll y,ll p){
    ll res=1;
    while(y){
        if(y&1) res=res*x%p;
        x=x*x%p;
        y>>=1;
    }
    return res;
}

void solve(){
    ll x,y;
    cin>>x>>y;
    if(x<=y){
        cout<<1<<"\n";
        return;
    }
    cout<<(y+1)*ksm(2,x-y-1,mod)%mod<<"\n";
}

int main(){
    int T;
    cin>>T;
    while(T--) solve();
    return 0;
}
import java.util.*;

public class Main {

    static final long mod=998244353;

    static long ksm(long x,long y){
        long res=1;
        while(y>0){
            if((y&1)==1) res=res*x%mod;
            x=x*x%mod;
            y>>=1;
        }
        return res;
    }

    static void solve(Scanner sc){
        long x=sc.nextLong();
        long y=sc.nextLong();
        if(x<=y){
            System.out.println(1);
            return;
        }
        System.out.println((y+1)*ksm(2,x-y-1)%mod);
    }

    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int T=sc.nextInt();
        while(T-->0) solve(sc);
    }
}
import sys
input=sys.stdin.readline

mod=998244353

def ksm(x,y):
    res=1
    while y:
        if y&1:
            res=res*x%mod
        x=x*x%mod
        y>>=1
    return res

def solve():
    x,y=map(int,input().split())
    if x<=y:
        print(1)
        return
    print((y+1)*ksm(2,x-y-1)%mod)

T=int(input())
for _ in range(T):
    solve()

第五题

采矿文明

0.75分
#include<bits/stdc++.h>
using namespace std;

typedef long long ll;
const int N=1e5+10;

ll n,m,k;
ll a[N],c[N];

void solve2(){
    ll ans=0;
    for(int i=1;i<=n;i++){
        ans=max(ans,min(m,a[i]));
        m-=c[i];
    }
    cout<<ans;
}

int main(){
    cin>>n>>m>>k;
    for(int i=1;i<=n-1;i++) cin>>c[i];
    for(int i=1;i<=n;i++) cin>>a[i];

    if(k==1){
        solve2();
        return 0;
    }
    return 0;
}
import java.util.*;

public class Main {

    static final int N=100010;
    static long n,m,k;
    static long[] a=new long[N];
    static long[] c=new long[N];

    static void solve2(){
        long ans=0;
        for(int i=1;i<=n;i++){
            ans=Math.max(ans,Math.min(m,a[i]));
            m-=c[i];
        }
        System.out.print(ans);
    }

    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        n=sc.nextLong();
        m=sc.nextLong();
        k=sc.nextLong();

        for(int i=1;i<=n-1;i++) c[i]=sc.nextLong();
        for(int i=1;i<=n;i++) a[i]=sc.nextLong();

        if(k==1){
            solve2();
            return;
        }
    }
}
import sys
input=sys.stdin.readline

n,m,k=map(int,input().split())
c=[0]+list(map(int,input().split()))
a=[0]+list(map(int,input().split()))

def solve2():
    global m
    ans=0
    for i in range(1,n+1):
        ans=max(ans,min(m,a[i]))
        if i<len(c):
            m-=c[i]
    print(ans)

if k==1:
    solve2()
7.5分(洛谷部分分有误)
#include<bits/stdc++.h>
using namespace std;

typedef long long ll;
const int N=1e5+10;

ll n,m,k;
ll a[N],c[N],s[N];

void solve2(){
    ll ans=0;
    for(int i=1;i<=n;i++){
        ans=max(ans,min(m,a[i]));
        m-=c[i];
    }
    cout<<ans;
}

bool cmp(const ll &a,const ll &b){
    return a>b;
}

void solve1(){
    for(int i=1;i<=n-1;i++){
        s[i]=s[i-1]+c[i];
    }
    ll ans=0;
    for(int r=1;r<=n;r++){
        if(s[r-1]>m) break;
        ll t=m-s[r-1];
        vector<ll> v;
        for(int l=1;l<=r;l++) v.push_back(a[l]);
        sort(v.begin(),v.end(),cmp);

        ll sum=0;
        int cnt=0;
        for(int i=0;i<v.size() && cnt<k;i++,cnt++){
            ll take=min(t,v[i]);
            sum+=take;
            t-=take;
            if(t==0) break;
        }
        ans=max(ans,sum);
    }
    cout<<ans<<"\n";
}

int main(){
    cin>>n>>m>>k;
    for(int i=1;i<=n-1;i++) cin>>c[i];
    for(int i=1;i<=n;i++) cin>>a[i];

    if(k==1){
        solve2();
        return 0;
    }else{
        solve1();
    }
    return 0;
}
import java.util.*;

public class Main {

    static final int N=100010;
    static long n,m,k;
    static long[] a=new long[N];
    static long[] c=new long[N];
    static long[] s=new long[N];

    static void solve2(){
        long ans=0;
        for(int i=1;i<=n;i++){
            ans=Math.max(ans,Math.min(m,a[i]));
            m-=c[i];
        }
        System.out.print(ans);
    }

    static void solve1(){
        for(int i=1;i<=n-1;i++){
            s[i]=s[i-1]+c[i];
        }
        long ans=0;
        for(int r=1;r<=n;r++){
            if(s[r-1]>m) break;
            long t=m-s[r-1];

            ArrayList<Long> v=new ArrayList<>();
            for(int l=1;l<=r;l++) v.add(a[l]);
            v.sort((x,y)->Long.compare(y,x));

            long sum=0;
            int cnt=0;
            for(int i=0;i<v.size() && cnt<k;i++,cnt++){
                long take=Math.min(t,v.get(i));
                sum+=take;
                t-=take;
                if(t==0) break;
            }
            ans=Math.max(ans,sum);
        }
        System.out.println(ans);
    }

    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        n=sc.nextLong();
        m=sc.nextLong();
        k=sc.nextLong();

        for(int i=1;i<=n-1;i++) c[i]=sc.nextLong();
        for(int i=1;i<=n;i++) a[i]=sc.nextLong();

        if(k==1){
            solve2();
        }else{
            solve1();
        }
    }
}
import sys
input=sys.stdin.readline

n,m,k=map(int,input().split())
c=[0]+list(map(int,input().split()))
a=[0]+list(map(int,input().split()))
s=[0]*(n+1)

def solve2():
    global m
    ans=0
    for i in range(1,n+1):
        ans=max(ans,min(m,a[i]))
        if i<len(c):
            m-=c[i]
    print(ans)

def solve1():
    for i in range(1,n):
        s[i]=s[i-1]+c[i]
    ans=0
    for r in range(1,n+1):
        if s[r-1]>m:
            break
        t=m-s[r-1]
        v=a[1:r+1]
        v.sort(reverse=True)

        total=0
        cnt=0
        for val in v:
            if cnt>=k:
                break
            take=min(t,val)
            total+=take
            t-=take
            cnt+=1
            if t==0:
                break
        ans=max(ans,total)
    print(ans)

if k==1:
    solve2()
else:
    solve1()

第六题

电梯接客

1.5分
#include<bits/stdc++.h>
using namespace std;

typedef long long ll;
const int N=1e6+10;

ll n,x,y,w;

struct node{
    int f,cnt;
}a[N];

bool cmp(const node &x,const node &y){
    return x.f<y.f;
}

void solve2(){
    sort(a+1,a+n+1,cmp);
    ll ans=0;

    for(ll i=1;i<=n;i++){
        int pos=a[i].f;
        if(i==1){
            ans+=x-pos+y-pos;
        }else{
            ans+=2*(y-pos);
        }
    }
    cout<<ans;
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);

    cin>>n>>x>>y>>w;
    bool f2=true;

    for(int i=1;i<=n;i++){
        cin>>a[i].f>>a[i].cnt;
        if(a[i].cnt!=1) f2=false;
    }

    if(f2){
        solve2();
    }
    return 0;
}
import java.util.*;

public class Main {

    static class Node{
        int f,cnt;
        Node(int f,int cnt){
            this.f=f;
            this.cnt=cnt;
        }
    }

    static long n,x,y,w;
    static Node[] a;

    static void solve2(){
        Arrays.sort(a,1,(int)n+1,(p,q)->p.f-q.f);
        long ans=0;

        for(long i=1;i<=n;i+=w){
            int pos=a[(int)i].f;
            if(i==1){
                ans+=x-pos+y-pos;
            }else{
                ans+=2*(y-pos);
            }
        }
        System.out.print(ans);
    }

    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);

        n=sc.nextLong();
        x=sc.nextLong();
        y=sc.nextLong();
        w=sc.nextLong();

        a=new Node[(int)n+1];
        boolean f2=true;

        for(int i=1;i<=n;i++){
            int f=sc.nextInt();
            int cnt=sc.nextInt();
            a[i]=new Node(f,cnt);
            if(cnt!=1) f2=false;
        }

        if(f2){
            solve2();
        }
    }
}
import sys
input=sys.stdin.readline

n,x,y,w=map(int,input().split())
a=[(0,0)]*(n+1)
f2=True

a=list(a)
for i in range(1,n+1):
    f,cnt=map(int,input().split())
    a[i]=(f,cnt)
    if cnt!=1:
        f2=False

def solve2():
    arr=sorted(a[1:],key=lambda x:x[0])
    ans=0
    i=0
    while i<n:
        pos=arr[i][0]
        if i==0:
            ans+=x-pos+y-pos
        else:
            ans+=2*(y-pos)
        i+=w
    print(ans)

if f2:
    solve2()
5.25
#include<bits/stdc++.h>
using namespace std;

typedef long long ll;
const int N=1e6+10;

ll n,x,y,w;

struct node{
    int f,cnt;
}a[N];

bool cmp(const node &x,const node &y){
    return x.f<y.f;
}

void solve3(){
    sort(a+1,a+n+1,cmp);
    ll ans=0;
    for(ll i=1;i<=n;i++){
        int pos=a[i].f;
        if(i==1){
            ans+=x-pos+y-pos+(a[i].cnt/w-1)*2*(y-pos);
        }else{
            ans+=2*(y-pos)*(a[i].cnt/w);
        }
    }
    cout<<ans;
}

void solve2(){
    sort(a+1,a+n+1,cmp);
    ll ans=0;
    for(ll i=1;i<=n;i+=w){
        int pos=a[i].f;
        if(i==1){
            ans+=x-pos+y-pos;
        }else{
            ans+=2*(y-pos);
        }
    }
    cout<<ans;
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);

    cin>>n>>x>>y>>w;
    bool f2=true,f3=true;

    for(int i=1;i<=n;i++){
        cin>>a[i].f>>a[i].cnt;
        if(a[i].cnt!=1) f2=false;
        if(a[i].cnt%w!=0) f3=false;
    }

    if(f2){
        solve2();
    }else{
        solve3();
    }
    return 0;
}
import java.util.*;

public class Main {

    static class Node{
        int f,cnt;
        Node(int f,int cnt){
            this.f=f;
            this.cnt=cnt;
        }
    }

    static long n,x,y,w;
    static Node[] a;

    static void solve3(){
        Arrays.sort(a,1,(int)n+1,(p,q)->p.f-q.f);
        long ans=0;
        for(long i=1;i<=n;i+=w){
            int pos=a[(int)i].f;
            if(i==1){
                ans+=x-pos+y-pos+(a[(int)i].cnt/w-1)*2*(y-pos);
            }else{
                ans+=2*(y-pos)*(a[(int)i].cnt/w);
            }
        }
        System.out.print(ans);
    }

    static void solve2(){
        Arrays.sort(a,1,(int)n+1,(p,q)->p.f-q.f);
        long ans=0;
        for(long i=1;i<=n;i+=w){
            int pos=a[(int)i].f;
            if(i==1){
                ans+=x-pos+y-pos;
            }else{
                ans+=2*(y-pos);
            }
        }
        System.out.print(ans);
    }

    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);

        n=sc.nextLong();
        x=sc.nextLong();
        y=sc.nextLong();
        w=sc.nextLong();

        a=new Node[(int)n+1];
        boolean f2=true,f3=true;

        for(int i=1;i<=n;i++){
            int f=sc.nextInt();
            int cnt=sc.nextInt();
            a[i]=new Node(f,cnt);
            if(cnt!=1) f2=false;
            if(cnt%w!=0) f3=false;
        }

        if(f2){
            solve2();
        }else{
            solve3();
        }
    }
}
import sys
input=sys.stdin.readline

n,x,y,w=map(int,input().split())
a=[(0,0)]*(n+1)
f2=True
f3=True

a=list(a)
for i in range(1,n+1):
    f,cnt=map(int,input().split())
    a[i]=(f,cnt)
    if cnt!=1:
        f2=False
    if cnt%w!=0:
        f3=False

def solve3():
    arr=sorted(a[1:],key=lambda x:x[0])
    ans=0
    i=0
    while i<n:
        pos=arr[i][0]
        cnt=arr[i][1]
        if i==0:
            ans+=x-pos+y-pos+(cnt//w-1)*2*(y-pos)
        else:
            ans+=2*(y-pos)*(cnt//w)
        i+=1
    print(ans)

def solve2():
    arr=sorted(a[1:],key=lambda x:x[0])
    ans=0
    i=0
    while i<n:
        pos=arr[i][0]
        if i==0:
            ans+=x-pos+y-pos
        else:
            ans+=2*(y-pos)
        i+=w
    print(ans)

if f2:
    solve2()
else:
    solve3()
15分
#include<bits/stdc++.h>
using namespace std;

typedef long long ll;
const int N=1e6+10;

ll n,x,y,w;

struct node{
    ll f,cnt;
}a[N];

bool cmp(const node &x,const node &y){
    return x.f<y.f;
}

void solve3(){
    sort(a+1,a+n+1,cmp);
    ll ans=0;
    for(ll i=1;i<=n;i++){
        ll pos=a[i].f;
        if(i==1){
            ans+=abs(x-pos)+y-pos+(a[i].cnt/w-1)*2*(y-pos);
        }else{
            ans+=2*(y-pos)*(a[i].cnt/w);
        }
    }
    cout<<ans;
}

void solve2(){
    sort(a+1,a+n+1,cmp);
    ll ans=0;
    for(ll i=1;i<=n;i+=w){
        ll pos=a[i].f;
        if(i==1){
            ans+=abs(x-pos)+y-pos;
        }else{
            ans+=2*(y-pos);
        }
    }
    cout<<ans;
}

void solve4(){
    sort(a+1,a+n+1,cmp);
    ll ans=0,ret=0;
    bool first=true;

    for(int i=1;i<=n;i++){
        ll pos=a[i].f,cnt=a[i].cnt;

        if(first){
            ans+=abs(x-pos)+(y-pos);
            first=false;
            ll take=min(cnt,w);
            cnt-=take;
            ret=w-take;
        }else{
            ll take=min(cnt,ret);
            cnt-=take;
            ret-=take;
        }

        if(cnt==0) continue;

        ans+=((cnt+w-1)/w)*2*(y-pos);
        ret=(w-cnt%w)%w;
    }
    cout<<ans;
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);

    cin>>n>>x>>y>>w;

    bool f2=true,f3=true;

    for(int i=1;i<=n;i++){
        cin>>a[i].f>>a[i].cnt;
        if(a[i].cnt!=1) f2=false;
        if(a[i].cnt%w!=0) f3=false;
    }

    if(f2){
        solve2();
    }else if(f3){
        solve3();
    }else{
        solve4();
    }

    return 0;
}
import java.util.*;

public class Main {

    static class Node{
        long f,cnt;
        Node(long f,long cnt){
            this.f=f;
            this.cnt=cnt;
        }
    }

    static long n,x,y,w;
    static Node[] a;

    static void solve3(){
        Arrays.sort(a,1,(int)n+1,(p,q)->Long.compare(p.f,q.f));
        long ans=0;
        for(long i=1;i<=n;i++){
            long pos=a[(int)i].f;
            if(i==1){
                ans+=Math.abs(x-pos)+y-pos+(a[(int)i].cnt/w-1)*2*(y-pos);
            }else{
                ans+=2*(y-pos)*(a[(int)i].cnt/w);
            }
        }
        System.out.print(ans);
    }

    static void solve2(){
        Arrays.sort(a,1,(int)n+1,(p,q)->Long.compare(p.f,q.f));
        long ans=0;
        for(long i=1;i<=n;i+=w){
            long pos=a[(int)i].f;
            if(i==1){
                ans+=Math.abs(x-pos)+y-pos;
            }else{
                ans+=2*(y-pos);
            }
        }
        System.out.print(ans);
    }

    static void solve4(){
        Arrays.sort(a,1,(int)n+1,(p,q)->Long.compare(p.f,q.f));
        long ans=0,ret=0;
        boolean first=true;

        for(int i=1;i<=n;i++){
            long pos=a[i].f,cnt=a[i].cnt;

            if(first){
                ans+=Math.abs(x-pos)+(y-pos);
                first=false;
                long take=Math.min(cnt,w);
                cnt-=take;
                ret=w-take;
            }else{
                long take=Math.min(cnt,ret);
                cnt-=take;
                ret-=take;
            }

            if(cnt==0) continue;

            ans+=((cnt+w-1)/w)*2*(y-pos);
            ret=(w-cnt%w)%w;
        }
        System.out.print(ans);
    }

    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);

        n=sc.nextLong();
        x=sc.nextLong();
        y=sc.nextLong();
        w=sc.nextLong();

        a=new Node[(int)n+1];
        boolean f2=true,f3=true;

        for(int i=1;i<=n;i++){
            long f=sc.nextLong();
            long cnt=sc.nextLong();
            a[i]=new Node(f,cnt);
            if(cnt!=1) f2=false;
            if(cnt%w!=0) f3=false;
        }

        if(f2){
            solve2();
        }else if(f3){
            solve3();
        }else{
            solve4();
        }
    }
}
import sys
input=sys.stdin.readline

n,x,y,w=map(int,input().split())
a=[(0,0)]*(n+1)

f2=True
f3=True

a=list(a)
for i in range(1,n+1):
    f,cnt=map(int,input().split())
    a[i]=(f,cnt)
    if cnt!=1:
        f2=False
    if cnt%w!=0:
        f3=False

def solve3():
    arr=sorted(a[1:],key=lambda x:x[0])
    ans=0
    for i in range(n):
        pos,cnt=arr[i]
        if i==0:
            ans+=abs(x-pos)+y-pos+(cnt//w-1)*2*(y-pos)
        else:
            ans+=2*(y-pos)*(cnt//w)
    print(ans)

def solve2():
    arr=sorted(a[1:],key=lambda x:x[0])
    ans=0
    i=0
    while i<n:
        pos=arr[i][0]
        if i==0:
            ans+=abs(x-pos)+y-pos
        else:
            ans+=2*(y-pos)
        i+=w
    print(ans)

def solve4():
    arr=sorted(a[1:],key=lambda x:x[0])
    ans=0
    ret=0
    first=True

    for pos,cnt in arr:
        if first:
            ans+=abs(x-pos)+(y-pos)
            first=False
            take=min(cnt,w)
            cnt-=take
            ret=w-take
        else:
            take=min(cnt,ret)
            cnt-=take
            ret-=take

        if cnt==0:
            continue

        ans+=((cnt+w-1)//w)*2*(y-pos)
        ret=(w-cnt%w)%w

    print(ans)

if f2:
    solve2()
elif f3:
    solve3()
else:
    solve4()