제출 #977088

#제출 시각아이디문제언어결과실행 시간메모리
977088Batorgil952이상한 기계 (APIO19_strange_device)C++14
20 / 100
650 ms524288 KiB
#include<bits/stdc++.h> #define ll long long #define pb push_back #define mp make_pair using namespace std; struct Node{ ll val, le, ri; bool al, ar; Node *Left; Node *Right; Node(ll l, ll r){ le=l; ri=r; Left=nullptr; Right=nullptr; al=0; ar=0; val=0; } }; ll GCD(ll x, ll y){ while(x*y!=0){ if(x>y) x%=y; else y%=x; } return x+y; } void update(Node *v, ll ql, ll qr){ if(v->val==v->ri-v->le+1){ return; } if(qr<v->le && v->ri<ql){ return; } if(ql<=v->le && v->ri<=qr){ v->val=v->ri-v->le+1; return; } ll mid=(v->le+v->ri)/2; if(qr<=mid){ if(!v->al){ if(v->Left==nullptr){ v->Left=new Node(v->le, mid); update(v->Left, ql, qr); } else if(v->Left->val!=mid-v->le+1){ update(v->Left, ql, qr); } } } else if(mid+1<=ql){ if(!v->ar){ if(v->Right==nullptr){ v->Right=new Node(mid+1, v->ri); update(v->Right, ql, qr); } else if(v->Right->val!=v->ri-mid){ update(v->Right, ql, qr); } } } // else if(ql<=v->le){ // v->al=1; // if(!v->ar){ // if(v->Right==nullptr){ // v->Right=new Node(mid+1, v->ri); // update(v->Right, ql, qr); // } // else if(v->Right->val!=v->ri-mid){ // update(v->Right, ql, qr); // } // } // } // else if(qr>=v->ri){ // cout<<"KK\n"; // v->ar=1; // if(!v->al){ // if(v->Left==nullptr){ // v->Left=new Node(v->le, mid); // update(v->Left, ql, qr); // } // else if(v->Left->val!=mid-v->le+1){ // update(v->Left, ql, qr); // } // } // } else{ if(v->Left==nullptr){ v->Left=new Node(v->le, mid); update(v->Left, ql, qr); } else if(v->Left->val!=mid-v->le+1){ update(v->Left, ql, qr); } if(v->Right==nullptr){ v->Right=new Node(mid+1, v->ri); update(v->Right, ql, qr); } else if(v->Right->val!=v->ri-mid){ update(v->Right, ql, qr); } } v->val=0; if(v->al){ v->val+=(mid-v->le+1); } else{ if(v->Left!=nullptr) v->val+=v->Left->val; } if(v->ar){ v->val+=(v->ri-mid); } else{ if(v->Right!=nullptr) v->val+=v->Right->val; } } ll query(Node *v, ll l, ll r){ return v->val; } int main(){ ll n, i, A, B, l, r, k, m, ma; scanf("%lld",&n); scanf("%lld",&A); scanf("%lld",&B); m=GCD(B+1, A); A/=m; ma=1000000000000000002; if(ma/A<B){ k=ma; } else{ k=A*B; } // cout<<k<<endl; Node *root = new Node(0, k-1); for(i=1; i<=n; i++){ scanf("%lld",&l); scanf("%lld",&r); if(r-l+1>=k) update(root, 0, k-1); else{ if(l%k<=r%k){ update(root, l%k, r%k); } else{ update(root, l%k, k-1); update(root, 0, r%k); } } } printf("%lld\n", query(root, 0, k-1)); return 0; }

컴파일 시 표준 에러 (stderr) 메시지

strange_device.cpp: In function 'int main()':
strange_device.cpp:130:7: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  130 |  scanf("%lld",&n);
      |  ~~~~~^~~~~~~~~~~
strange_device.cpp:131:7: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  131 |  scanf("%lld",&A);
      |  ~~~~~^~~~~~~~~~~
strange_device.cpp:132:7: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  132 |  scanf("%lld",&B);
      |  ~~~~~^~~~~~~~~~~
strange_device.cpp:147:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  147 |   scanf("%lld",&l);
      |   ~~~~~^~~~~~~~~~~
strange_device.cpp:148:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  148 |   scanf("%lld",&r);
      |   ~~~~~^~~~~~~~~~~
#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...