zoukankan      html  css  js  c++  java
  • Dull Chocolates Gym

    题目链接:https://vjudge.net/problem/Gym-101991D

    具体思路:首先看数据范围,暴力肯定不可以,可以下离散化,然后先求出离散化后每一个点到(1,1)的符合题目的要求的个数,然后再按照一块一块的求,打个比方,离散化后

    (1,1) (1,2)(1,3)

    (2,1) (2,2) (2,3)

    (3,1) (3,2) (3,3)

    如果(1,1)这个点满足,那么求一下这个点到(2,2)的面积(面积是2,这里计算的是整个方块里面的,不包括边界),这一块肯定是满足的,然后每一个点都这样判断,这样就可以把所有的符合面积都求出来了。

    AC代码:

    #include<iostream>
    #include<stack>
    #include<iomanip>
    #include<cstring>
    #include<cmath>
    #include<queue>
    #include<map>
    #include<vector>
    #include<algorithm>
    #include<stdio.h>
    using namespace std;
    # define inf 0x3f3f3f3f
    # define ll long long
    # define maxn 1000+100
    # define int ll
    ll dp[maxn][maxn],x[maxn],y[maxn];
    struct node
    {
        ll x,y;
    } q[maxn];
    signed main()
    {
      // freopen("dull.in","r",stdin);
        int T;
        scanf("%lld",&T);
        while(T--)
        {
            map<int,int>visx;
            map<int,int>visy;
            memset(dp,0,sizeof(dp));
            ll n,m,k;
            int num1=0,num2=0;
            scanf("%lld%lld%lld",&n,&m,&k);
            for(int i=1; i<=k; i++)
            {
                scanf("%lld %lld",&q[i].x,&q[i].y);
                x[i]=q[i].x;
                y[i]=q[i].y;
            }
            sort(x+1,x+k+1);
            sort(y+1,y+k+1);
            if(k>=1)
                visx[x[1]]=++num1;
            for(int i=2; i<=k; i++)
            {
                if(x[i]!=x[i-1])
                {
                    visx[x[i]]=++num1;
                    x[num1]=x[i];//;离散化的过程,注意这里的x存的变成了新的离散化后的点了
                }
            }
            if(k>=1)
                visy[y[1]]=++num2;
            for(int i=2; i<=k; i++)
            {
                if(y[i]!=y[i-1])
                {
                    visy[y[i]]=++num2;
                    y[num2]=y[i];
                }
            }
            for(int i=1; i<=k; i++)
            {
                dp[visx[q[i].x]][visy[q[i].y]]=1;
            }
            for(int i=1; i<=num1; i++)
            {
                for(int j=1; j<=num2; j++)
                {
                    dp[i][j]+=dp[i][j-1]+dp[i-1][j]-dp[i-1][j-1];
                }
            }
            ll ans=0;
            x[num1+1]=n+1;
            y[num2+1]=m+1;//加了这两个点,是为了防止最后边界上的点算不上。
            for(int i=1; i<=num1; i++)
            {
                for(int j=1; j<=num2; j++)
                {
                    if(dp[i][j]%2)
                    {
                        ans+=(x[i+1]-x[i])*(y[j+1]-y[j]);
                    }
                }
            }
            printf("%lld %lld
    ",ans,n*m-ans);
        }
        return 0;
    }
    
  • 相关阅读:
    【LeetCode】41. First Missing Positive (3 solutions)
    【LeetCode】42. Trapping Rain Water
    【LeetCode】164. Maximum Gap (2 solutions)
    【原创】SQLServer将数据导出为SQL脚本的方法
    Jconsole远程监控tomcat 的JVM内存(linux、windows)
    selenium + python自动化测试环境搭建
    LR--Controller的Pacing设置(不容忽视的设置)
    loadrunner录制回放常见问题及解决办法
    修改windows系统文件权限
    TestNG官方文档中文版(4)-运行TestNG
  • 原文地址:https://www.cnblogs.com/letlifestop/p/10262807.html
Copyright © 2011-2022 走看看