1001Apple
Problem Description Apple is Taotao's favourite fruit. In his backyard, there are three apple trees with coordinates (x1,y1), (x2,y2), and (x3,y3). Now Taotao is planning to plant a new one, but he is not willing to take these trees too close. He believes that the new apple tree should be outside the circle which the three apple trees that already exist is on. Taotao picked a potential position (x,y) of the new tree. Could you tell him if it is outside the circle or not? Input The first line contains an integer T, indicating that there are T(T≤30) cases. In the first line of each case, there are eight integers x1,y1,x2,y2,x3,y3,x,y, as described above. The absolute values of integers in input are less than or equal to 1,000,000,000,000. It is guaranteed that, any three of the four positions do not lie on a straight line. Output For each case, output "Accepted" if the position is outside the circle, or "Rejected" if the position is on or inside the circle. Sample Input 3 -2 0 0 -2 2 0 2 -2 -2 0 0 -2 2 0 0 2 -2 0 0 -2 2 0 1 1 Sample Output Accepted Rejected Rejected
大意是给你三个点,绘制一个圆形区域,再输入一个点,问在不在圆内
难点:高精度
1 #include <cmath> 2 #include <map> 3 #include <vector> 4 #include <cstdio> 5 #include <cstdlib> 6 #include <iostream> 7 #include <algorithm> 8 #include <cstring> 9 #include <set> 10 #include <bitset> 11 #include <memory.h> 12 #include <functional> 13 #include <queue> 14 #include <fstream> 15 #include <ctime> 16 #include <deque> 17 #include <utility> 18 #include <stack> 19 #include <sstream> 20 #include <list> 21 #include <cctype> 22 #include <numeric> 23 #include <iomanip> 24 #include <assert.h> 25 #define EPS 1e-8 26 using namespace std; 27 const int maxn = 550; 28 typedef long long LL; 29 30 #define MAX_L 2005 31 32 class bign 33 { 34 public: 35 int len, s[MAX_L]; 36 bign(); 37 bign(const char*); 38 bign(int); 39 bool sign; 40 string toStr() const; 41 friend istream& operator>>(istream &,bign &); 42 friend ostream& operator<<(ostream &,bign &); 43 bign operator=(const char*); 44 bign operator=(int); 45 bign operator=(const string); 46 bool operator>(const bign &) const; 47 bool operator>=(const bign &) const; 48 bool operator<(const bign &) const; 49 bool operator<=(const bign &) const; 50 bool operator==(const bign &) const; 51 bool operator!=(const bign &) const; 52 bign operator+(const bign &) const; 53 bign operator++(); 54 bign operator++(int); 55 bign operator+=(const bign&); 56 bign operator-(const bign &) const; 57 bign operator--(); 58 bign operator--(int); 59 bign operator-=(const bign&); 60 bign operator*(const bign &)const; 61 bign operator*(const int num)const; 62 bign operator*=(const bign&); 63 bign operator/(const bign&)const; 64 bign operator/=(const bign&); 65 bign operator%(const bign&)const; 66 bign factorial()const; 67 bign Sqrt()const; 68 bign pow(const bign&)const; 69 void clean(); 70 ~bign(); 71 }; 72 #define max(a,b) a>b ? a : b 73 #define min(a,b) a<b ? a : b 74 75 bign::bign() 76 { 77 memset(s, 0, sizeof(s)); 78 len = 1; 79 sign = 1; 80 } 81 82 bign::bign(const char *num) 83 { 84 *this = num; 85 } 86 87 bign::bign(int num) 88 { 89 *this = num; 90 } 91 92 string bign::toStr() const 93 { 94 string res; 95 res = ""; 96 for (int i = 0; i < len; i++) 97 res = (char)(s[i] + '0') + res; 98 if (res == "") 99 res = "0"; 100 if (!sign&&res != "0") 101 res = "-" + res; 102 return res; 103 } 104 105 istream &operator>>(istream &in, bign &num) 106 { 107 string str; 108 in>>str; 109 num=str; 110 return in; 111 } 112 113 ostream &operator<<(ostream &out, bign &num) 114 { 115 out<<num.toStr(); 116 return out; 117 } 118 119 bign bign::operator=(const char *num) 120 { 121 memset(s, 0, sizeof(s)); 122 char a[MAX_L] = ""; 123 if (num[0] != '-') 124 strcpy(a, num); 125 else 126 for (int i = 1; i < strlen(num); i++) 127 a[i - 1] = num[i]; 128 sign = !(num[0] == '-'); 129 len = strlen(a); 130 for (int i = 0; i < strlen(a); i++) 131 s[i] = a[len - i - 1] - 48; 132 return *this; 133 } 134 135 bign bign::operator=(int num) 136 { 137 char temp[MAX_L]; 138 sprintf(temp, "%d", num); 139 *this = temp; 140 return *this; 141 } 142 143 bign bign::operator=(const string num) 144 { 145 const char *tmp; 146 tmp = num.c_str(); 147 *this = tmp; 148 return *this; 149 } 150 151 bool bign::operator<(const bign &num) const 152 { 153 if (sign^num.sign) 154 return num.sign; 155 if (len != num.len) 156 return len < num.len; 157 for (int i = len - 1; i >= 0; i--) 158 if (s[i] != num.s[i]) 159 return sign ? (s[i] < num.s[i]) : (!(s[i] < num.s[i])); 160 return !sign; 161 } 162 163 bool bign::operator>(const bign&num)const 164 { 165 return num < *this; 166 } 167 168 bool bign::operator<=(const bign&num)const 169 { 170 return !(*this>num); 171 } 172 173 bool bign::operator>=(const bign&num)const 174 { 175 return !(*this<num); 176 } 177 178 bool bign::operator!=(const bign&num)const 179 { 180 return *this > num || *this < num; 181 } 182 183 bool bign::operator==(const bign&num)const 184 { 185 return !(num != *this); 186 } 187 188 bign bign::operator+(const bign &num) const 189 { 190 if (sign^num.sign) 191 { 192 bign tmp = sign ? num : *this; 193 tmp.sign = 1; 194 return sign ? *this - tmp : num - tmp; 195 } 196 bign result; 197 result.len = 0; 198 int temp = 0; 199 for (int i = 0; temp || i < (max(len, num.len)); i++) 200 { 201 int t = s[i] + num.s[i] + temp; 202 result.s[result.len++] = t % 10; 203 temp = t / 10; 204 } 205 result.sign = sign; 206 return result; 207 } 208 209 bign bign::operator++() 210 { 211 *this = *this + 1; 212 return *this; 213 } 214 215 bign bign::operator++(int) 216 { 217 bign old = *this; 218 ++(*this); 219 return old; 220 } 221 222 bign bign::operator+=(const bign &num) 223 { 224 *this = *this + num; 225 return *this; 226 } 227 228 bign bign::operator-(const bign &num) const 229 { 230 bign b=num,a=*this; 231 if (!num.sign && !sign) 232 { 233 b.sign=1; 234 a.sign=1; 235 return b-a; 236 } 237 if (!b.sign) 238 { 239 b.sign=1; 240 return a+b; 241 } 242 if (!a.sign) 243 { 244 a.sign=1; 245 b=bign(0)-(a+b); 246 return b; 247 } 248 if (a<b) 249 { 250 bign c=(b-a); 251 c.sign=false; 252 return c; 253 } 254 bign result; 255 result.len = 0; 256 for (int i = 0, g = 0; i < a.len; i++) 257 { 258 int x = a.s[i] - g; 259 if (i < b.len) x -= b.s[i]; 260 if (x >= 0) g = 0; 261 else 262 { 263 g = 1; 264 x += 10; 265 } 266 result.s[result.len++] = x; 267 } 268 result.clean(); 269 return result; 270 } 271 272 bign bign::operator * (const bign &num)const 273 { 274 bign result; 275 result.len = len + num.len; 276 277 for (int i = 0; i < len; i++) 278 for (int j = 0; j < num.len; j++) 279 result.s[i + j] += s[i] * num.s[j]; 280 281 for (int i = 0; i < result.len; i++) 282 { 283 result.s[i + 1] += result.s[i] / 10; 284 result.s[i] %= 10; 285 } 286 result.clean(); 287 result.sign = !(sign^num.sign); 288 return result; 289 } 290 291 bign bign::operator*(const int num)const 292 { 293 bign x = num; 294 bign z = *this; 295 return x*z; 296 } 297 bign bign::operator*=(const bign&num) 298 { 299 *this = *this * num; 300 return *this; 301 } 302 303 bign bign::operator /(const bign&num)const 304 { 305 bign ans; 306 ans.len = len - num.len + 1; 307 if (ans.len < 0) 308 { 309 ans.len = 1; 310 return ans; 311 } 312 313 bign divisor = *this, divid = num; 314 divisor.sign = divid.sign = 1; 315 int k = ans.len - 1; 316 int j = len - 1; 317 while (k >= 0) 318 { 319 while (divisor.s[j] == 0) j--; 320 if (k > j) k = j; 321 char z[MAX_L]; 322 memset(z, 0, sizeof(z)); 323 for (int i = j; i >= k; i--) 324 z[j - i] = divisor.s[i] + '0'; 325 bign dividend = z; 326 if (dividend < divid) { k--; continue; } 327 int key = 0; 328 while (divid*key <= dividend) key++; 329 key--; 330 ans.s[k] = key; 331 bign temp = divid*key; 332 for (int i = 0; i < k; i++) 333 temp = temp * 10; 334 divisor = divisor - temp; 335 k--; 336 } 337 ans.clean(); 338 ans.sign = !(sign^num.sign); 339 return ans; 340 } 341 342 bign bign::operator/=(const bign&num) 343 { 344 *this = *this / num; 345 return *this; 346 } 347 348 bign bign::operator%(const bign& num)const 349 { 350 bign a = *this, b = num; 351 a.sign = b.sign = 1; 352 bign result, temp = a / b*b; 353 result = a - temp; 354 result.sign = sign; 355 return result; 356 } 357 358 bign bign::pow(const bign& num)const 359 { 360 bign result = 1; 361 for (bign i = 0; i < num; i++) 362 result = result*(*this); 363 return result; 364 } 365 366 bign bign::factorial()const 367 { 368 bign result = 1; 369 for (bign i = 1; i <= *this; i++) 370 result *= i; 371 return result; 372 } 373 374 void bign::clean() 375 { 376 if (len == 0) len++; 377 while (len > 1 && s[len - 1] == '