제출 #197740

#제출 시각아이디문제언어결과실행 시간메모리
197740Andrei_Cotor이상한 기계 (APIO19_strange_device)C++14
100 / 100
1094 ms68984 KiB
//la o perioada de B in dreapta, stanga creste cu B+1
#include<iostream>
#include<algorithm>
#define INF 1000000000000000005LL

using namespace std;

typedef struct event
{
    long long poz;
    int tip;
} EVENT;

bool cmp(EVENT a, EVENT b)
{
    if(a.poz!=b.poz)
        return a.poz<b.poz;
    else
        return a.tip>b.tip;
}

EVENT Ev[4000005];

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

    int n;
    long long a,b;
    cin>>n>>a>>b;

    long long d=__gcd(a,b+1);
    long long nr=a/d;  //de cate ori trb sa adun B+1 pt a obtine un multiplu de A, in stanga

    long long per=0;
    if(nr<=INF/b)
        per=nr*b;
    else
        per=INF;

    int nrev=0;
    for(int i=1; i<=n; i++)
    {
        long long x,y;
        cin>>x>>y;

        if(y-x>=per)
            y=x+per-1;

        x%=per;
        y%=per;

        if(x<=y)
        {
            Ev[++nrev]={x,1};
            Ev[++nrev]={y,-1};
        }
        else
        {
            Ev[++nrev]={0,1};
            Ev[++nrev]={y,-1};
            Ev[++nrev]={x,1};
            Ev[++nrev]={per-1,-1};
        }
    }

    sort(Ev+1,Ev+nrev+1,cmp);

    int nractiv=0;
    long long rez=0;
    for(int i=1; i<=nrev; i++)
    {
        long long poz=Ev[i].poz;
        while(i<=nrev && Ev[i].poz==poz && Ev[i].tip==1)
        {
            nractiv++;
            i++;
        }

        if(nractiv>0)
            rez++;

        while(i<=nrev && Ev[i].poz==poz && Ev[i].tip==-1)
        {
            nractiv--;
            i++;
        }

        i--;

        if(nractiv>0)
        {
            if(i<nrev)
                rez=rez+(Ev[i+1].poz-Ev[i].poz-1);
            else
                rez=rez+(per-Ev[i].poz-1);
        }
    }

    cout<<rez<<"\n";
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...