Submission #197740

#TimeUsernameProblemLanguageResultExecution timeMemory
197740Andrei_CotorStrange Device (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...