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\n", a[i-k+1]);
85     }
86     return 0;
87 }