Submission #1159292

#TimeUsernameProblemLanguageResultExecution timeMemory
1159292Ak_16Strange Device (APIO19_strange_device)C++20
100 / 100
913 ms47460 KiB
#include <iostream>
#include <algorithm>
using namespace std;
#define int long long

struct wei{
  int l;
  int r;
};
wei ar[2000005];

int gcd(int x, int y){
  if(x*y==0){return x+y;}
  if(x<y){swap(x,y);}
  return gcd(y, x%y);
}

bool cmp(wei x, wei y){
  if(x.r!=y.r){return x.r<y.r;}
  return x.l < y.l;
}

signed main() 
{
    int n,a,b;
    int n1,n2;
    int pos[2000005];
    int con[2000005];
    int ll,rr;
    cin>>n>>a>>b;
    int k = gcd(a, b+1);
    int len = a/k;
    int ans=0;
    int chk=0;
    int cur=0;
    int don=0;
    
    ar[0].l = -1;
    ar[0].r = -1;
    pos[0]=0;
    
    if(b > (1e18)/len){len = 1e18 + 5LL;}
    
    else {len *= b;}
    
    for(int i=1; i<=n; i++){
      cin>>n1>>n2;
      if(n2-n1+1>=len){chk=1;}
      n1 %= len;
      n2 %= len;
      if(n1<=n2){
        cur++;
        ar[cur].l = n1;
        ar[cur].r = n2;
      }
      else {
        cur++;
        ar[cur].l = 0;
        ar[cur].r = n2;
        cur++;
        ar[cur].l = n1;
        ar[cur].r = len-1;
      }
    }
    
    sort(ar+1, ar+cur+1, cmp);
    ar[0].l = -1;
    ar[0].r = -1;
    
    for(int i=1; i<=cur; i++){
      
      while(don>=1){
        n1 = pos[don];
        if(ar[i].l <= ar[n1].l){
          ans -= con[don];
          con[don]=0;
          don--;
        }
        else {break;}
      }
      
      don++;
      pos[don]=i;
      con[don] = ar[i].r - max(ar[i].l-1, ar[pos[don-1]].r);
      ans += con[don];
      
      
    }
    if(chk==1){cout<<len<<endl;}
    else {cout<<ans<<endl;}
    
    
    
    
}
#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...