zoukankan      html  css  js  c++  java
  • 2018 ACM 国际大学生程序设计竞赛上海大都会赛重现赛 F Color it

    链接:https://www.nowcoder.com/acm/contest/163/F

    来源:牛客网

    2018 ACM 国际大学生程序设计竞赛上海大都会赛重现赛 F Color it

    时间限制:C/C++ 3秒,其他语言6秒
    空间限制:C/C++ 262144K,其他语言524288K
    64bit IO Format: %lld

    题目描述

    There is a matrix A that has N rows and M columns. Each grid (i,j)(0 ≤ i < N, 0 ≤ j < M) is painted in white at first.
    Then we perform q operations:
    For each operation, we are given (xc, yc) and r. We will paint all grids (i, j) that meets to black.
    You need to calculate the number of white grids left in matrix A.

    输入描述:

    The first line of the input is T(1≤ T ≤ 40), which stands for the number of test cases you need to solve.
    The first line of each case contains three integers N, M and q (1 ≤ N, M ≤ 2 x 104; 1 ≤ q ≤ 200), as mentioned above.
    The next q lines, each lines contains three integers x
    c
    , y
    c
     and r (0 ≤ x
    c
     < N; 0 ≤ y
    c
     < M; 0 ≤ r ≤ 10
    5
    ), as mentioned above.

    输出描述:

    For each test case, output one number.
    示例1

    输入

    复制
    2
    39 49 2
    12 31 6
    15 41 26
    1 1 1
    0 0 1

    输出

    复制
    729
    0

    题意还是比较简单的,给你n和m的格子让你去画圆,如果这个点在圆内,就要被染色,问你还剩多少点没有被染色

    这个题目可以直接暴力扫描线,也就成了维护线段的并

    #include<bits/stdc++.h>
    using namespace std;
    const int N=2e5+5;
    vector<pair<int,int> >V[N];
    int main()
    {
        int T;
        scanf("%d",&T);
        while(T--)
        {
            for(int i=0; i<N; i++)V[i].clear();
            int n,m,q;
            scanf("%d%d%d",&n,&m,&q);
            for(int j=0,x,y,r; j<q; j++)
            {
                scanf("%d%d%d",&x,&y,&r);
                for(int i=max(0,y-r),d; i<=min(m-1,y+r); i++)
                    d=(sqrt(r*r-(y-i)*(y-i)+1e-6)),V[i].push_back(make_pair(max(0,x-d),min(x+d,n-1)));
            }
            int s=n*m;
            for(int i=0; i<m; i++)
            {
                int l=V[i].size();
                if(l>0)
                {
                    sort(V[i].begin(),V[i].end());
                    int r=-1;
                    for(auto X:V[i])
                    {
                        if(X.second<=r)continue;
                        if(X.first>r) s-=X.second-X.first+1;
                        else s-=X.second-r;
                        r=X.second;
                    }
                }
            }
            cout<<s<<"
    ";
        }
        return 0;
    }
  • 相关阅读:
    Python生成器
    Python函数之传参
    前端之HTML
    联合分组、子查询、视图、事务、python操作mysql、索引
    单表查询和连表查询具体操作
    字段详细操作、多表关系、外键关联和级联关系以及增、删、改的操作
    数据库与表的其他操作、字段的操作、数据类型、字段的约束条件
    协程
    初识数据库
    线程Queue、定时器、进程池和线程池、同步异步
  • 原文地址:https://www.cnblogs.com/BobHuang/p/9493577.html
Copyright © 2011-2022 走看看