yuhung94

D - Circle Lattice Points

Aug 22nd, 2021
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.43 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. #define Woody
  3. #define int long long
  4. #define lowbit(x) (x&-x)
  5. #define rep(n) for(int i=0;i<n;i++)
  6. #define mp make_pair
  7. #define eb emplace_back
  8. #define F first
  9. #define S second
  10. #define SZ(a) (int)(a.size())
  11. #define all(v) v.begin(),v.end()
  12. #define SETIO(s) ifstream cin(s+".in");ofstream cout(s+".out");
  13. #ifdef Woody
  14. #define quick ios::sync_with_stdio(0);cin.tie(0);
  15. #else
  16. #define quick
  17. #endif
  18. #define INF INT64_MAX
  19. using namespace std;
  20. typedef pair<int,int> pii;
  21. int x,y,Range;
  22. bool ok(int px,int py){
  23.     return px*px<=Range*Range-py*py;
  24. }
  25. signed main(){
  26.     quick  
  27.     double a,b,c;
  28.     cin>>a>>b>>c;
  29.     x=a*10000;
  30.     y=b*10000;
  31.     Range=c*10000;
  32.     int uy=(y+Range)/10000*10000+10000;
  33.     int dy=(y-Range)/10000*10000-10000;
  34.     int Minx=(x-Range)/10000*10000-10000;
  35.     int Maxx=(x+Range)/10000*10000+10000;
  36.     int ans=0;
  37.     int lx;
  38.     int rx;
  39.     for(int i=uy;i>=dy;i-=10000){
  40.         if(!ok(0,i-y)) continue;
  41.         int l=Minx;
  42.         int r=x;
  43.         while(l+1<r){
  44.             int middle=(l+r)>>1;
  45.             if(ok(middle-x,i-y)) r=middle;
  46.             else l=middle;
  47.         }
  48.         lx=r;
  49.         l=x;
  50.         r=Maxx;
  51.         while(l+1<r){
  52.             int middle=(l+r)>>1;
  53.             if(ok(middle-x,i-y)) l=middle;
  54.             else r=middle;
  55.         }
  56.         rx=l;
  57. //      cout<<i<<":"<<lx<<" "<<rx<<"\n";
  58.         int R;
  59.         int L;
  60.         if(rx>=0){
  61.             R=rx/10000;
  62.         }
  63.         else {
  64.             R=(rx/10000-(rx%10000!=0));
  65.         }
  66.         if(lx>=0){
  67.             L=lx/10000+(lx%10000!=0);
  68.         }
  69.         else {
  70.             L=(lx/10000);
  71.         }
  72.         ans+=R-L+1;
  73.     }
  74.     cout<<ans<<"\n";
  75. }
Add Comment
Please, Sign In to add comment