/*
上帝说 要方
是的 很方
计数问题的容斥思想 (首先要注意 正方形有斜着的QAQ)
考虑我们要求的合法正方形 ans 根据容斥
ans = 无限制方案书 - 一个点确定的方案数 + 两个点确定的方案数 - 三个点确定的方案数 + 四个点确定的方案数 无限制方案数:
首先假设我们选择了一个n * n的正方形
那么这个正方形就包含了 n - 1种边界在正方形边上的正方形 根据这个来求出总方案数 一个点确定的方案数:(from huanghongxun's blog)
考虑每个被删除的点,其对上半,左半,右半,下半部分的影响类似,重复计算的就是正着的正方形的个数,即长宽的较小值。
用(l,r,h)(l,r,h)表示一个区域,删除的点在底边界上,左边有l个坐标,右边有r个坐标。
考虑(6+6)*6的区域。
倾斜0格的有6个,1格的有5个,2格的有4个,……,5格的有1个,6格的有6个,总的是27个。
如果是(6+6)*5的区域,那么就是5,4,3,2,1,5了。
如果是(2+2)*5的区域,那么就是2,2,2,2。
令z=min{l+r,h}z=min{l+r,h}
我们先假设高度要不大于左右侧,那么此时的答案就是z(z+3)/2。
如果大于了左右侧,那么考虑减去多计算的部分,如果左右侧补全到z,那么多出来的部分即n=z?l或z?rn=z?l或z?r,公式即为n(n+1) /2。
两个点确定的方案数:
三个点确定的方案数:
四个点确定的方案数:
这三个可以枚举两个已经确定的点, 然后算出剩下的两个点进行计算
确定三个的 除以3 确定四个的 除以6
愉快地解决
*/
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<set>
#include<iostream>
#define ll long long
#define M 5100
const int mod = ;
using namespace std;
struct P {
int x,y;
bool operator < (const P &b) const {
return x == b.x ? y < b.y: x < b.x;
}
} note[M],a,b;
int read() {
int nm = , f = ;
char c = getchar();
for(; !isdigit(c); c = getchar()) if(c == '-') f= -;
for(; isdigit(c); c = getchar()) nm = nm * + c - '';
return nm * f;
}
ll ans = , n, m, k, cnt3, cnt4;
set<P>st;
ll wk1(int l, int r, int h) {
int z = min(l + r, h);
if(z == ) return ;
ll zz = 1ll * z * (z + ) / ;
if(z > l) zz -= 1ll * (z - l) * (z - l + ) / ;
if(z > r) zz -= 1ll * (z - r) * (z - r + ) / ;
return zz;
} void solve1() {
for(int i = ; i <= k; i++) {
int x = note[i].x, y = note[i].y, l = x, r = n - x, u = y, d = m - y;
ans -= (wk1(l,r,u) + wk1(l,r,d) + wk1(u,d,l) + wk1(u,d,r) - min(l, u) - min(l, d) - min(r, u) - min(r, d));
ans %= mod;
}
} void wk2(P a, P b) {
if(a.x < || a.x > n || b.x < || b.x > n || a.y < || b.y < || a.y > m || b.y > m) return;
ans++;
int op = st.count(a) + st.count(b);
if(op == ) cnt3++;
if(op == ) cnt3 += , cnt4++;
} void solve234() {
for(int i = ; i <= k; i++) {
a = note[i];
for(int j = i + ; j <= k; j++) {
b = note[j];
int dx = a.x - b.x, dy = a.y - b.y, xx, yy;
/*两点相邻的*/
wk2((P){a.x + dy, a.y - dx}, (P){b.x + dy, b.y - dx});
wk2((P){a.x - dy, a.y + dx}, (P){b.x - dy, b.y + dx});
if((abs(dx) + abs(dy)) & ) continue;
/*对角线的*/
xx = dx - dy >> , yy = dx + dy >> ;
wk2((P){a.x - xx, a.y - yy}, (P){b.x + xx, b.y + yy});
}
}
} int main() {
n = read(), m = read(), k = read();
for(int i = ; i <= k; i++) {
note[i].x = read(), note[i].y = read();
st.insert(note[i]);
}
for(int i = ; i <= min(n, m); i++) ans += 1ll * i * (n - i + ) * (m - i + ), ans %= mod;
solve1();
solve234();
ans -= cnt3 / - cnt4 / ;
cout << ((ans % mod) + mod) % mod;
return ;
}

SHOI2016方的更多相关文章

  1. loj #2025. 「JLOI / SHOI2016」方

    #2025. 「JLOI / SHOI2016」方   题目描述 上帝说,不要圆,要方,于是便有了这道题. 由于我们应该方,而且最好能够尽量方,所以上帝派我们来找正方形.上帝把我们派到了一个有 NNN ...

  2. 【LOJ】 #2025. 「JLOI / SHOI2016」方

    题解 有什么LNOI啊,最后都是JLOI罢了 一道非常--懵逼的统计题 当然是容斥,所有的方案 - 至少有一个点坏掉的正方形 + 至少有两个点坏掉的正方形 - 至少有三个点坏掉的正方形 + 至少有四个 ...

  3. SHOI2016游记&滚粗记&酱油记

    Day0 学校刚期中考完,全科血崩,感觉这次真要考不到一本线了tat 晚上写了个可持久化trie的题,也懒得敲板子(上个礼拜都敲过了),就碎叫了 Day1 上午起床吃饭水群看球,吃完中饭就去考场了. ...

  4. 关于面试题 Array.indexof() 方法的实现及思考

    这是我在面试大公司时碰到的一个笔试题,当时自己云里雾里的胡写了一番,回头也曾思考过,最终没实现也就不了了之了. 昨天看到有网友说面试中也碰到过这个问题,我就重新思考了这个问题的实现方法. 对于想进大公 ...

  5. ASP.NET Core 中文文档 第二章 指南(4.10)检查自动生成的Detail方法和Delete方法

    原文 Examining the Details and Delete methods 作者 Rick Anderson 翻译 谢炀(Kiler) 校对 许登洋(Seay).姚阿勇(Mr.Yao) 打 ...

  6. 【手记】调用Process.EnterDebugMode引发异常:并非所有引用的特权或组都分配给呼叫方

    刚上线一个新版本,其中有台电脑打开软件就报[xx的类型初始值设定项引发异常](还好不是一大波电脑,新东西上线就怕哀鸿遍野),如图: 显然是该类型的静态构造函数中抛异常了(红线处就是类名),遂打开该类, ...

  7. 关于WCF报错之调用方未由服务器进行身份验证

    在我们部署好WCF服务以后,调用WCF服务会出现”调用方未由服务器进行身份验证”的错误.这个错误是怎么造成的呢? 通常我们在创建WCF后,用本机调试,一切正常,没有任何问题.其实用本机测试的时候,服务 ...

  8. Spark Rdd coalesce()方法和repartition()方法

    在Spark的Rdd中,Rdd是分区的. 有时候需要重新设置Rdd的分区数量,比如Rdd的分区中,Rdd分区比较多,但是每个Rdd的数据量比较小,需要设置一个比较合理的分区.或者需要把Rdd的分区数量 ...

  9. js方法入参或局部变量和全局变量重名,用来赋值全局变量会失败

    今天遇到个bug,最后终于知道原因了,js方法入参和全局变量重名,用入参赋值全局变量失败,就是说方法入参不能和全局变量重名. 现在下面的例子也说明,局部变量和全局变量不可以同名不光是入参,只要同名赋值 ...

随机推荐

  1. laravel ORM 模型关联 with () 用法

    关联时想对关联表数据筛选时:MySQL查询: SELECT * FROM A LEFT JOIN B ON A.B_id = B.id AND B.condition = $condition ORM ...

  2. Python MySQLdb 插入数据

    其实python链接MySQL的方法很多,比较常用的是MySQLdb这个模块,由于自己准备往数据库里面插入一条日期数据,在格式化的日期数据的时候一直报错,所以这里简单写了一个往MySQL数据库的插入数 ...

  3. Request.QueryString()和Request()和Request.Form();

    一. querystring的用法及原理 当页面上的 FORM以 GET方式向页面发送请求数据 (如数据含有不安全字符,则浏览器先将其转换成 16进制的字符再传送,如空格被转成 %20)时, WEB ...

  4. 关于vivado----xdc文件时钟约束的初识

    关于vivado----xdc文件时钟约束的初识 1.Primary Clocks(主时钟) 然而,对于比较复杂的时钟: 2.某个模块采用的主时钟(比如说GT) 3.时钟分频 4.复杂一点的时钟描述 ...

  5. MySQL 5.7.16 字符串拆分 -> 单列变多行记录(转发)

    http://blog.csdn.net/mchdba/article/details/53889803 ----------------------------------------------- ...

  6. VS2012打开项目——已停止工作

    VS2012打开项目——已停止工作 解决方法如下: 1. 开始-->所有程序-->Microsoft Visual Studio 2012-->Visual Studio Tools ...

  7. IIS - 自动申请、部署Let's Encrypt的免费SSL证书(让网站实现HTTPS协议)

    IIS - 自动申请.部署Let's Encrypt的免费SSL证书(让网站实现HTTPS协议) 2017-12-19发布:hangge阅读:161   一.HTTPS 协议介绍 1,什么是 HTTP ...

  8. Python中的self和init

    From: https://www.crifan.com/summary_the_meaning_of_self_and___init___in_python_and_why_need_them/ 背 ...

  9. 单元素枚举类型singleton模块

    public enum Elvis { INSTANCE; public void leaveTheBuilding() { System.out.println("Whoa baby, I ...

  10. tomcat操作

    一.启动 D:\tomcat8.5.9\bin\startup   或者  D:\tomcat8.5.9\bin\catalina start 关闭tomcat: D:\tomcat8.5.9\bin ...