4558: [JLoi2016]方
4558: [JLoi2016]方
https://lydsy.com/JudgeOnline/problem.php?id=4558
分析:
容斥原理+各种神奇的计数。
如果没有被删除了的点的话,直接计算就好了。
统计出所有的竖直放置的正方形,然后每个正方形里包含其边长个数正方形。
设外边的正方形边长为a,公式就是$(n - a + 1) \times (m - a + 1) * a$,所以可以O(n)求出。
考虑减不合法的正方形。那么分为包含一个“坏点”,2个,3个,4个。
234的时候都可以直接枚举两个点,然后就可以确定出其他的两个点了,(这里可以确定两个点后,把所有枚举到的都加上,最后除以计算了多少次。三个的可以分别枚举三条边的时候都算上,所以除以3;4个点枚举边和对角线都算上了,所以除以6)。1个的最难算。
我们把一个点面向的四个方向分开计算,因为这是一个一样的过程。
可以知道,如果确定了一个点,和一个正方形(这个点在正方形的边上),那么就会确定唯一的一个以这个点为顶点的正方形
那么我们只需要计算有多少个正方形的边上有这个点就行了,
如果没有左边和右边的限制的话:
如上图,左边和右边长度都为4,先不管是否超出边界,那么就是2,3,4...8,9,分别表示长度为1,2,3...7,8的正方形。就是$\frac{n \times (n+3)}{2}$。
加上边界h的限制,正方形的边长最大为h。加上左右边界的限制,正方形的最大边长为$min(l+r,h)$,设为$z$。
这样算出来,可能是有不合法的,左边界超出了,或者右边界超出了。
于是根据等差序列求和公式,可以直接算了。
还有一点,计算这些正方形的时候,超四个方向的和加起来,会重复计算一部分。
最后根据容斥原理,算出来就行了。
代码:
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<cmath>
#include<cctype>
#include<set>
#include<queue>
#include<vector>
#include<map>
using namespace std;
typedef long long LL; inline int read() {
int x=,f=;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-;
for(;isdigit(ch);ch=getchar())x=x*+ch-'';return x*f;
} const int N = ;
const int mod = 1e8 + ; struct Point{
int x, y;
Point() {}
Point(int _x,int _y) { x = _x, y = _y; }
}A[N];
int n, m;
LL ans, t1, t2, t3, t4;
set<LL> s; LL Count1(int l,int r,int h) {
int z = min(l + r, h);
if (z == ) return ;
LL 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) % mod;
}
LL Calc1(int x,int y) { // 统计一个点可以作为多少个正方形的顶点。
int u = x, d = n - x, l = y, r = m - y;
LL ans = Count1(l, r, u) + Count1(l, r, d) + Count1(u, d, l) + Count1(u, d, r); ans %= mod;
ans = ans - min(u, l) - min(u, r) - min(d, l) - min(d, r);
return (ans + mod) % mod;
}
bool inmap(Point P) {
return (P.x >= && P.x <= n && P.y >= && P.y <= m);
}
void Calc234(Point P,Point Q) {
if (!inmap(P) || !inmap(Q)) return ;
int t = s.count(1ll * P.x * (m + ) + P.y) + s.count(1ll * Q.x * (m + ) + Q.y);
++ t2;
if (t >= ) t3 ++;
if (t >= ) t3 ++, t4 ++;
}
int main() {
n = read(), m = read();int k = read();
for (int i = ; i <= k; ++i) {
A[i].x = read(), A[i].y = read();
s.insert(1ll * A[i].x * (m + ) + A[i].y); // 因为列是从0开始编号的,所以需要乘以(m+1),或者直接乘以2000000
}
for (int i = , lim = min(n, m); i <= lim; ++i) {
ans += (1ll * (n - i + ) * (m - i + ) % mod * i % mod);
if (ans >= mod) ans -= mod;
}
for (int i = ; i <= k; ++i) {
t1 += Calc1(A[i].x, A[i].y);
if (t1 >= mod ) t1 -= mod;
}
for (int i = ; i <= k; ++i) {
Point P = A[i];
for (int j = i + ; j <= k; ++j) {
Point Q = A[j];
int dx = A[i].x - A[j].x, dy = A[i].y - A[j].y;
Calc234(Point(P.x + dy, P.y - dx), Point(Q.x + dy, Q.y - dx)); // 作为边的情况
Calc234(Point(P.x - dy, P.y + dx), Point(Q.x - dy, Q.y + dx));
if ((abs(dx) + abs(dy)) & ) continue;
int dx2 = (dx - dy) / , dy2 = (dx + dy) / ;
Calc234(Point(P.x - dx2, P.y - dy2), Point(Q.x + dx2, Q.y + dy2)); // 作为对角线的情况
}
}
ans = ans - t1 + t2 - t3 / + t4 / ;
ans = (ans + mod) % mod;
cout << ans;
return ;
}
4558: [JLoi2016]方的更多相关文章
- 【BZOJ 4558】 4558: [JLoi2016]方 (计数、容斥原理)
未经博主同意不能转载 4558: [JLoi2016]方 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 362 Solved: 162 Descri ...
- BZOJ.4558.[JLOI2016]方(计数 容斥)
BZOJ 洛谷 图基本来自这儿. 看到这种计数问题考虑容斥.\(Ans=\) 没有限制的正方形个数 - 以\(i\)为顶点的正方形个数 + 以\(i,j\)为顶点的正方形个数 - 以\(i,j,k\) ...
- 【BZOJ】4558: [JLoi2016]方
[题意]给定有(n+1)*(m+1)个点的网格图,其中指定k个点不合法,求合法的正方形个数(四顶点合法). [算法]计数 [题解]斜着的正方形很麻烦,所以考虑每个斜正方形其外一定有正的外接正方形. 也 ...
- bzoj4558[JLoi2016]方 容斥+count
4558: [JLoi2016]方 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 452 Solved: 205[Submit][Status][D ...
- bzoj千题计划281:bzoj4558: [JLoi2016]方
http://www.lydsy.com/JudgeOnline/problem.php?id=4558 容斥原理 全部的正方形-至少有一个点被删掉的+至少有两个点被删掉的-至少有3个点被删掉的+至少 ...
- bzoj4558: [JLoi2016]方
Description 上帝说,不要圆,要方,于是便有了这道题.由于我们应该方,而且最好能够尽量方,所以上帝派我们来找正方形 上帝把我们派到了一个有N行M列的方格图上,图上一共有(N+1)×(M+1) ...
- [BZOJ4558]:[JLoi2016]方(容斥+模拟)
题目传送门 题目描述 上帝说,不要圆,要方,于是便有了这道题.由于我们应该方,而且最好能够尽量方,所以上帝派我们来找正方形上帝把我们派到了一个有N行M列的方格图上,图上一共有$(N+1)\times ...
- JLOI2016 方
bzoj4558 真是一道非常excited的题目啊-JLOI有毒 题目大意:给一个(N+1)*(M+1)的网格图,格点坐标为(0~N,0~M),现在挖去了K个点,求剩下多少个正方形(需要注意的是正方 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
随机推荐
- 【黑客免杀攻防】读书笔记2 - 免杀与特征码、其他免杀技术、PE进阶介绍
第3章 免杀与特征码 这一章主要讲了一些操作过程.介绍了MyCCL脚本木马免杀的操作,对于定位特征码在FreeBuf也曾发表过类似工具. VirTest5.0特征码定位器 http://www.fre ...
- CC254x/CC2540/CC2541库函数速查(转)
hci.h 转自:http://blog.csdn.net/xiaoleiacmer/article/details/44036607#t1 //分配内存,应用程序不应该调用这个函数. void *H ...
- openstack swift节点安装手册1-节点配置
本文参照官方教程:http://docs.openstack.org/project-install-guide/object-storage/draft/environment-networking ...
- 使用ajax上传表单(带文件)
在使用form表单的时候上传文件+表单,会使得页面跳转,而在某些时候不希望跳转,只变化页面中的局部信息 通过查找资料,可以使用FormData进行ajax操作. FormData介绍:XMLHttpR ...
- Maven介绍及安装与配置
一.Maven的作用 在开发中,为了保证编译通过,我们会到处去寻找jar包,当编译通过了,运行的时候,却发现"ClassNotFoundException",我们想到的是,难道还差 ...
- javascript判断是用什么设备打开
var userAgentInfo = navigator.userAgent //查看浏览器用于 HTTP 请求的用户代理头的值 var agents = ["Android", ...
- OCM_第十天课程:Section5—》数据仓库
注:本文为原著(其内容来自 腾科教育培训课堂).阅读本文注意事项如下: 1:所有文章的转载请标注本文出处. 2:本文非本人不得用于商业用途.违者将承当相应法律责任. 3:该系列文章目录列表: 一:&l ...
- python 全栈开发,Day58(bootstrap组件,bootstrap JavaScript 插件,后台模板,图表插件,jQuery插件库,Animate.css,swiper,运行vue项目)
一.bootstrap组件 无数可复用的组件,包括字体图标.下拉菜单.导航.警告框.弹出框等更多功能. 组件和插件的区别? 插件:一个功能,比如js文件 组件:html css js 组件包含插件 面 ...
- curl 命令模拟 HTTP GET/POST 请求
https://www.cnblogs.com/alfred0311/p/7988648.html
- 一篇笔记带你梳理JVM工作原理
首先要了解的 数据类型 Java虚拟机中,数据类型可以分为两类:基本类型和引用类型. 基本类型的变量保存原始值,即:他代表的值就是数值本身:而引用类型的变量保存引用值.“引用值”代表了某个对象的引用, ...