zoukankan      html  css  js  c++  java
  • uvalive6468,51cthink1419 Strange Antennas (离散化)

    题意:

    在一个 n x n 的平面上,给定 m 个等腰直角三角形(各点均为整数),问该平面上被三角形覆盖奇数次的点有多少个。

    思路:

    由于 n 较大,不能模拟解决,故使用离散化思想。

    考虑每一行有多少点被覆盖了奇数次,题目从二维转换成一维。

    对于每一行,考虑每个三角形在此行覆盖的线段,记录下每条线段的左端点 l 、右端点 r 保存在同一个数组中。

    排序后则容易知道第一个到第二个数、第三到第四个数...的部分是覆盖奇数次,以此累加结果。

    代码:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    using namespace std;
    struct Radar
    {
        int x, y, w, d;
    } radars[105];
    int dir[4][2]= {{1, -1}, {1, 1}, {-1, 1}, {-1, -1}};
    
    int main()
    {
        int n, m, ans=0;
        while(cin>>n>>m)
        {
            ans=0;
            for(int i=0; i<m; ++i)
            {
                cin>>radars[i].x>>radars[i].y>>radars[i].w>>radars[i].d;
                /*if(radars[i].d==0) radars[i].y--;
                if(radars[i].d==2) radars[i].x--; //uva数据有误,此处处理错误数据
                if(radars[i].d==3) radars[i].x--, radars[i].y--;*/
            }
            for(int i=0; i<n; ++i)
            {
                int cnt=0, v[202]= {0};
                for(int j=0; j<m; ++j)
                {
                    if(radars[j].d<=1 && radars[j].x>i) continue;
                    if(radars[j].d>1 && radars[j].x<i) continue;
                    if(abs(radars[j].x-i) >= radars[j].w) continue;
                    int l=radars[j].y + dir[radars[j].d][1] * (radars[j].w - abs(radars[j].x - i) - 1);
                    int r=radars[j].y;
                    if(l>r) swap(l, r);
                    l--;
                    l=max(-1, l);
                    r=min(r, n-1);
                    v[cnt++]=l, v[cnt++]=r;
                }
                sort(v, v+cnt);
                for(int j=1; j<cnt; j+=2)
                    ans+=v[j]-v[j-1];
            }
            cout<<ans<<endl;
        }
        return 0;
    }
  • 相关阅读:
    逻辑思维杂想
    C++二叉树实现
    斐波那数列递归实现与动态规划实现
    C++双向链表的实现
    C++单链表实现
    C++顺序表实现
    windows下端口占用处理工具
    [项目记录]一个.net下使用HAP实现的吉大校园通知网爬虫工具:OAWebScraping
    [c++]大数运算---利用C++ string实现任意长度正小数、整数之间的加减法
    [C++]几种排序
  • 原文地址:https://www.cnblogs.com/xiepingfu/p/7340197.html
Copyright © 2011-2022 走看看