洛谷 P2735 电网

https://www.luogu.org/problemnew/show/P2735

 

定理什么的最讨厌了,匹克定理?不会,也不想学。

粉色的为电网,将图中的电网我们将他构造一个矩形,然后蓝色和绿色的的补齐。

那么我们的答案就是:矩阵中的点数- 蓝色三角形中的点数- 绿色三角形中的点数。

然后我们单独拿出一个三角形来考虑。

从箭头开始向左考虑,

我们将这个三角形一点一点的扩大,看每次能覆盖几个点。

随着h不断变大那么,不断有点被覆盖,那么不断加入的点的个数就是$$ \lfloor \frac{b}{a} \times x \rfloor +1 $$。

我们对每个三角形进行处理,然而不要忘记电网的下边缘哦。

最后你会发现有几个点重复处理了(电网下边缘的端点),所以再+2就好了。

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
#define LL unsigned long long
#define inf 2147483647
LL n,m,p,ans;
LL calc(double a,double b)
{
    if(a==0)return b+1;
    if(b==0)return a+1;
    LL sum=0;
    double h=b/a;
    for(LL i=0;i<=a;i++)
    {
        sum+=(LL)(h*double(i)+1);
    }
    return sum;
}
int main()
{
    cin>>n>>m>>p;
    ans=(max(n,p)+1)*(m+1);
//    cout<<ans<<"\n";
//    cout<<calc(n,m)<<" "<<calc(max(n,p)-min(n,p),m);
    ans-=calc(n,m);
    ans-=calc(max(n,p)-min(n,p),m);
    ans-=p;
    cout<<ans+2;
} 

 

posted @ 2018-10-12 10:59  Manjusaka丶梦寒  阅读(305)  评论(0编辑  收藏  举报