C. White Sheet
一道基础的几何题 给定三个矩形的左下角坐标和右上角坐标,第一块是白色矩形,第二第三都是黑色矩形,问白色矩形是否被黑色矩形完全覆盖。思路就是根据点判断分类讨论。
1、如果白色矩形的四个点没有全部被覆盖了 那么直接输出“NO”
2、如果白色矩形的四个点都被覆盖了,那么就再判断下黑色的矩形有没有交集
1 #include <math.h> 2 #include <stdio.h> 3 #include <stdlib.h> 4 #include <iostream> 5 #include <algorithm> 6 #include <string> 7 #include <string.h> 8 #include <vector> 9 #include <map> 10 #include <stack> 11 #include <set> 12 #include <random> 13 14 #define LL long long 15 16 bool in(LL x1,LL y1,LL x2,LL y2,LL xx2,LL yy2) { 17 if (x1 >= x2 && x1 <= xx2 && y1>=y2 && y1<=yy2) { 18 return true; 19 } 20 return false; 21 } 22 23 int main() { 24 LL x1,y1,x2,y2,x3,y3; 25 LL xx1,yy1,xx2,yy2,xx3,yy3; 26 std::cin >> x1 >> y1 >> xx1 >> yy1; 27 std::cin >> x2 >> y2 >> xx2 >> yy2; 28 std::cin >> x3 >> y3 >> xx3 >> yy3; 29 if ((in(x1,y1,x2,y2,xx2,yy2) || in(x1,y1,x3,y3,xx3,yy3)) && 30 (in(x1,yy1,x2,y2,xx2,yy2) || in(x1,yy1,x3,y3,xx3,yy3)) && 31 (in(xx1,y1,x2,y2,xx2,yy2) || in(xx1,y1,x3,y3,xx3,yy3)) && 32 (in(xx1,yy1,x2,y2,xx2,yy2) || in(xx1,yy1,x3,y3,xx3,yy3))) { 33 if (in(x2,y2,x3,y3,xx3,yy3) || in(x2,yy2,x3,y3,xx3,yy3) || in(xx2,y2,x3,y3,xx3,yy3) || in(xx2,yy2,x3,y3,xx3,yy3) 34 || in(x3,y3,x2,y2,xx2,yy2) || in(x3,yy3,x2,y2,xx2,yy2) || in(xx3,y3,x2,y2,xx2,yy2) || in(xx3,yy3,x2,y2,xx2,yy2)) { 35 std::cout << "NO" << std::endl; 36 } 37 else { 38 if ((in(x1,y1,x2,y2,xx2,yy2) && in(x1,yy1,x2,y2,xx2,yy2) && in(xx1,y1,x2,y2,xx2,yy2) && in(xx1,yy1,x2,y2,xx2,yy2)) || 39 (in(x1,y1,x3,y3,xx3,yy3) && in(x1,yy1,x3,y3,xx3,yy3) && in(xx1,y1,x3,y3,xx3,yy3) && in(xx1,yy1,x3,y3,xx3,yy3))) { 40 std::cout << "NO" << std::endl; 41 } 42 else 43 std::cout << "YES" << std::endl; 44 } 45 } 46 else { 47 std::cout << "YES" << std::endl; 48 } 49 return 0; 50 }
E2. Numerical Sequence (hard version)
这道题我觉得非常有意思。
如果我们取i从1开始 那么[10^(i-1),10^i) 里面每个sum[i] = i
1 #include <math.h> 2 #include <stdio.h> 3 #include <stdlib.h> 4 #include <iostream> 5 #include <algorithm> 6 #include <string> 7 #include <string.h> 8 #include <vector> 9 #include <map> 10 #include <stack> 11 #include <set> 12 #include <random> 13 14 #define ll long long 15 16 17 inline ll get_sum ( ll x ) { //从1~区间长度x的前x项和 18 19 return x*(x+1)/2; 20 } 21 22 inline ll calc_1 ( ll x ) { // 获取ssum[x] 23 24 ll ans=0, i=1, j=1; 25 for ( ; j*10<=x; i++,j*=10 ) { // 10*j == 10^i 26 // 10^i 之前的 + 10^i->x 之间的 27 ans += i*get_sum(j*9) + i*j*9*(x-j*10+1); // i * [1,(10^i-10^(i-1))] == i * [1,(10*j-j)] == i * get_sum(j*9) 28 // 一个而言需要增加:i*j*9 == (i * (10^i-1 - (10^(i-1)-1) ) ) == (i * (10 * j - j)) 29 // 一共有(x - 10^i + 1) == (x - 10 * j + 1) 30 } 31 // 加上后面部分的 32 return ans + i*get_sum(x-j+1); 33 } 34 35 inline ll calc_2 ( ll x ) { // 获取sum[x] 36 37 ll ans=0, i=1, j=1; 38 for ( ; j*10<=x; i++,j*=10 ) { 39 ans += i*j*9; 40 } 41 // 加上后面部分的 42 return ans + i*(x-j+1); 43 } 44 45 int main() { 46 47 ll q, k; 48 scanf("%lld", &q); 49 50 while (q--) { 51 52 scanf("%lld", &k); 53 ll l = 0, r = 1e9, res1, res2; 54 55 while ( l<=r ) { // 第一次二分确定k在哪个块里 56 57 ll mid = l+r >> 1; 58 if ( calc_1(mid) < k ) { 59 l = mid + 1; 60 res1 = mid; 61 } 62 else r = mid - 1; 63 } 64 k -= calc_1(res1); 65 l = 0, r = res1 + 1; 66 while ( l<=r ) { // 第二次二分确定k在哪个数里 67 68 ll mid = l+r >> 1; 69 if ( calc_2(mid) < k ) { 70 l = mid + 1; 71 res2 = mid; 72 } 73 else r = mid - 1; 74 } 75 k -= calc_2(res2 ++); 76 77 int a[30]; 78 memset(a, 0, sizeof(a)); 79 int i = 0; 80 while(res2) { 81 a[++i] = res2%10; 82 res2 /= 10; 83 } 84 printf("%d ", a[i-k+1]); 85 } 86 return 0; 87 }