http://www.lydsy.com/JudgeOnline/problem.php?id=4558

容斥原理

全部的正方形-至少有一个点被删掉的+至少有两个点被删掉的-至少有3个点被删掉的+至少有4个点被删掉的

正方形分 正着的和斜着的

斜着的正方形卡在一个正着的正方形的边框上

一个边长为i的正方形框,恰好可以框住i个正方形(1个正着的 和 i-1个斜着的)

所以 总的正方形= 

至少有一个点被删掉的:

枚举一个被删掉的点,

设它的上边有u行,下边有d行,左边有l列,右边有r列

那么以一对相对的边为底边,在确定一边作为高,就可以计算这个方向上的 贡献

比如 以l和r 为 底边(向左可以延伸l,向右可以延伸r),以u为高(向上可以延伸u)

一个边长为a的正方形框 可以唯一包含一个 有一个顶点 在正方形框上的正方形

正方形框 长为1的有2种,长为2的有3种,长为a的有a+1种

所以,如果最大的正方形框 长为z,

那么用等差数列求和公式可得, 这种情况下总的正方形数 为 z*(z+3)/2

z=min(h,l+r)

但是有一个问题

若z>l,那么 当正方形框为a(a>l)的时候,

正方形左边有一部分要出界,

一共有z-l 种 边长在左边要出界,由等差数列求和公式,这种情况下总的正方形数 还要减去  (z-l)*(z-l+1)/2

z>r 同理,还要减去 (z-r)*(z-r+1)/2

至少有两个点被删掉的:

枚举任意两个点p,q

设向量v=(q.x-p.x ,q.y-p.y)

如果正方形是正着的,那么这两个点在正方形的同一条边上

将向量v顺时针旋转90°,再将两个点平移向量v,即可得到一个正方形的另外两个点

判断这两个点是否出界,没有出界的话,贡献加1

同理,将向量v逆时针旋转90°,再将两个点平移,即可得到另一个方向的正方形

如果正方形是斜着的,那么枚举的这两个点当做对角线

假设两个点(px,py),(qx,qy)是正方形对角线上的两个顶点。
令dx=px-qx,dy=py-qy,x=(dx-dy)/2,y=(dx+dy)/2
那么 正方形的另一条对角线上的 两个顶点 分别为(px-x,py-y)和(qx+x,qy+y)

这个的求解,算出正方形的中心坐标,然后向量旋转,加加减减,就可以得到这个。。。

至少有3/4个点被删掉的:

在计算至少有两个点被删掉的时候,判断的时候 顺带 判上

然后计算至少被删3个点的,每个正方形计算了C(3,2)=3 遍

至少被删4个点的,每个正方形计算了C(4,2)=6 遍

再除一下

#include<set>
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std; const int mod=1e8+; int n,m; struct Point
{
int x,y; bool operator < (Point p) const
{
return x<p.x || x==p.x&&y<p.y;
} Point(int x_=,int y_=):x(x_),y(y_){}
}e[]; set<Point>mp; void read(int &x)
{
x=; char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) { x=x*+c-''; c=getchar(); }
} int cal(int l,int r,int h)
{
int z=min(l+r,h);
long long ans=1LL*z*(z+)/;
if(z>l) ans-=1LL*(z-l)*(z-l+)/;
if(z>r) ans-=1LL*(z-r)*(z-r+)/;
return ans%mod;
} int One(int x,int y)
{
int u=x,d=n-x,l=y,r=m-y;
return cal(u,d,l)+cal(u,d,r)+cal(l,r,u)+cal(l,r,d)-min(u,l)-min(l,d)-min(d,r)-min(r,u);
} bool inmap(Point p)
{
return p.x>= && p.x<=n && p.y>= && p.y<=m ;
} int count(Point p,Point q,int &cnt2,int &cnt3,int &cnt4)
{
if(inmap(p) && inmap(q))
{
int t=mp.count(p)+mp.count(q);
cnt2++;
if(t) cnt3++;
if(t>) cnt3++,cnt4++;
}
} int main()
{
int k;
read(n); read(m); read(k);
int ans=; int t=min(n,m);
for(int i=;i<=t;++i) ans=(ans+1LL*i*(n-i+)%mod*(m-i+)%mod)%mod;
int x,y;
for(int i=;i<=k;++i)
{
read(x); read(y);
mp.insert(Point(x,y));
e[i]=Point(x,y);
(ans-=One(x,y))%=mod;
}
Point p,q;
int cnt2=,cnt3=,cnt4=;
int dx,dy;
for(int i=;i<=k;++i)
{
p=e[i];
for(int j=i+;j<=k;++j)
{
q=e[j];
dx=p.x-q.x; dy=p.y-q.y;
count(Point(p.x+dy,p.y-dx),Point(q.x+dy,q.y-dx),cnt2,cnt3,cnt4);
count(Point(p.x-dy,p.y+dx),Point(q.x-dy,q.y+dx),cnt2,cnt3,cnt4);
if(abs(dx)+abs(dy) & ) continue;
x=dx-dy>>; y=dx+dy>>;
count(Point(p.x-x,p.y-y),Point(q.x+x,q.y+y),cnt2,cnt3,cnt4);
}
}
ans+=cnt2-cnt3/+cnt4/;
ans%=mod;
if(ans<) ans+=mod;
printf("%d",ans);
}

bzoj千题计划281:bzoj4558: [JLoi2016]方的更多相关文章

  1. bzoj千题计划300:bzoj4823: [Cqoi2017]老C的方块

    http://www.lydsy.com/JudgeOnline/problem.php?id=4823 讨厌的形状就是四联通图 且左右各连一个方块 那么破坏所有满足条件的四联通就好了 按上图方式染色 ...

  2. bzoj千题计划270:bzoj4559: [JLoi2016]成绩比较(拉格朗日插值)

    http://www.lydsy.com/JudgeOnline/problem.php?id=4559 f[i][j] 表示前i门课,有j个人没有被碾压的方案数 g[i] 表示第i门课,满足B神排名 ...

  3. bzoj千题计划272:bzoj4557: [JLoi2016]侦察守卫

    http://www.lydsy.com/JudgeOnline/problem.php?id=4557 假设当前到了x的子树,现在是合并 x的第k个子树 f[x][j] 表示x的前k-1个子树该覆盖 ...

  4. bzoj千题计划196:bzoj4826: [Hnoi2017]影魔

    http://www.lydsy.com/JudgeOnline/problem.php?id=4826 吐槽一下bzoj这道题的排版是真丑... 我还是粘洛谷的题面吧... 提供p1的攻击力:i,j ...

  5. bzoj千题计划280:bzoj4592: [Shoi2015]脑洞治疗仪

    http://www.lydsy.com/JudgeOnline/problem.php?id=4592 注意操作1 先挖再补,就是补的范围可以包含挖的范围 SHOI2015 的题 略水啊(逃) #i ...

  6. bzoj千题计划177:bzoj1858: [Scoi2010]序列操作

    http://www.lydsy.com/JudgeOnline/problem.php?id=1858 2018 自己写的第1题,一遍过 ^_^ 元旦快乐 #include<cstdio> ...

  7. bzoj千题计划317:bzoj4650: [Noi2016]优秀的拆分(后缀数组+差分)

    https://www.lydsy.com/JudgeOnline/problem.php?id=4650 如果能够预处理出 suf[i] 以i结尾的形式为AA的子串个数 pre[i] 以i开头的形式 ...

  8. bzoj千题计划304:bzoj3676: [Apio2014]回文串(回文自动机)

    https://www.lydsy.com/JudgeOnline/problem.php?id=3676 回文自动机模板题 4年前的APIO如今竟沦为模板,,,╮(╯▽╰)╭,唉 #include& ...

  9. bzoj千题计划292:bzoj2244: [SDOI2011]拦截导弹

    http://www.lydsy.com/JudgeOnline/problem.php?id=2244 每枚导弹成功拦截的概率 = 包含它的最长上升子序列个数/最长上升子序列总个数 pre_len ...

随机推荐

  1. java实现基于关键字的文件夹(文件)的搜索、文件夹(文件)的复制、删除

    最近在做一个项目,需要实现这几项功能,上网查了很多资料,自己研究了好几天终于实现了,现在与大家分享一下. 一.JAVA实现文件夹的搜索   在百度搜索N个技术文章,从哪些大牛们共享的资料中终于写出了我 ...

  2. selenium+ python自动化--断言assertpy

    前言: 在对登录验证时,不知道为何原因用unittest的断言不成功,就在网上发现这个assertpy,因此做个笔记 准备: pip install assertypy 例子: from assert ...

  3. 个人新站 【EXP技术分享博客】 落成~ 全新的技术资源~ 欢迎莅临~

    对的,我筹备了大半年的个站技术网站正式开张了~ EXP技术分享博客: http://exp-blog.com CSDN上面大部分文章已经迁移过去了,以后也会更多地在新站点更新~ 为了庆祝新站开张,近期 ...

  4. live555学习(一)通读Makefile编译live555

    live555学习(一)通读Makefile编译live555 live555 编译live555 学习开源 live555学习(一)通读Makefile编译live555 前言 live555简介 ...

  5. 怎么理解LAXCUS大操作系统系统在云计算体系中的定位

    最近一直在做laxcus大数据操作系统的分布式应用开发,因为做得多了,感触也多了.按照云计算三层定义,即iaas(基础设施即服务).paas(平台即服务).saas(软件即服务),laxcus属于pa ...

  6. NO.3:自学tensorflow之路------MNIST识别,神经网络拓展

    引言 最近自学GRU神经网络,感觉真的不简单.为了能够快速跑完程序,给我的渣渣笔记本(GT650M)也安装了一个GPU版的tensorflow.顺便也更新了版本到了tensorflow-gpu 1.7 ...

  7. ElasticSearch 2 (32) - 信息聚合系列之范围限定

    ElasticSearch 2 (32) - 信息聚合系列之范围限定 摘要 到目前为止我们看到的所有聚合的例子都省略了搜索请求,完整的请求就是聚合本身. 聚合与搜索请求同时执行,但是我们需要理解一个新 ...

  8. 如何判断可见字符 Unicode

    一个Unicode字符串,如何判断其中都是可见字符? //根据国标 GB2312 的中文汉字及符号 区位码的范围判断 Function CheckIsGB2312(Char : WideChar) : ...

  9. [转帖]将改名贯彻到底,Xeon E3系列将改名为Xeon E

    将改名贯彻到底,Xeon E3系列将改名为Xeon E 导读:    E3 系列改名为 XEON E 系列entry 入门级的含义 E5 1XXX 序列改名为 XEON W 系列 workstatio ...

  10. Linux 下安装nginx的总结 (之前写的有问题))

    1. 下载niginx的 tar包 下载路径 http://nginx.org/en/download.html 也可以直接使用命令下载 wget http://nginx.org/download/ ...