• Codeforces Round #587 (Div. 3)


    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 }
  • 相关阅读:
    Node.js中的Buffer
    移动端页面弹出对话框效果Demo
    简单编写makefile文件,实现GCC4.9编译项目,增加boost库測试等等。。
    Windows下使用静态库
    将 Android* Bullet 物理引擎移植至英特尔&#174; 架构
    Java读书笔记一(异常处理)
    设计模式
    Ignatius and the Princess III(杭电1028)(母函数)
    oracle树操作(select .. start with .. connect by .. prior)
    三期_day02_数据库表设计和开发准备工作
  • 原文地址:https://www.cnblogs.com/-Ackerman/p/11695265.html
Copyright © 2020-2023  润新知