bzoj4558[JLoi2016]方 容斥+count
4558: [JLoi2016]方
Time Limit: 20 Sec Memory Limit: 256 MB
Submit: 452 Solved: 205
[Submit][Status][Discuss]
Description
上帝说,不要圆,要方,于是便有了这道题。由于我们应该方,而且最好能够尽量方,所以上帝派我们来找正方形
上帝把我们派到了一个有N行M列的方格图上,图上一共有(N+1)×(M+1)个格点,我们需要做的就是找出这些格点形
成了多少个正方形(换句话说,正方形的四个顶点都是格点)。但是这个问题对于我们来说太难了,因为点数太多
了,所以上帝删掉了这(N+1)×(M+1)中的K个点。既然点变少了,问题也就变简单了,那么这个时候这些格点组成
了多少个正方形呢?
Input
第一行三个整数 N, M, K, 代表棋盘的行数、 列数和不能选取的顶点个数。 保证 N, M >= 1, K <=(N + 1) ×
(M + 1)。约定每行的格点从上到下依次用整数 0 到 N 编号,每列的格点依次用 0到 M 编号。接下来 K 行,每
行两个整数 x,y 代表第 x 行第 y 列的格点被删掉了。保证 0 <=x <=N<=10^6, 0 <=y<=M<=10^6,K<=2*1000且不
会出现重复的格点。
Output
仅一行一个正整数, 代表正方形个数对 100000007( 10^8 + 7) 取模之后的值
Sample Input
2 2 4
1 0
1 2
0 1
2 1
Sample Output
1
并没有调出来,调出来也是TLE
容斥,ans=所有格点正方形-至少含一个非法点正方形+至少含2个-至少含3个+至少含4个
容斥很简单,主要就是统计方案难啊
由于正方形有斜放的,我们规定一个n*n的框架
顶点在框架边上的正方形有i个
考虑对于每一个非法点,除去以它为顶点的正方形(正方/斜放都要考虑)
枚举两个非法点,计算以它们为顶点的正方形另外两个点,对于含2,3,4的贡献答案。
判断正方形的顶点是否存在,应该用hash表,由于懒,我用了stl,估计要挂。。
推荐blog
http://blog.csdn.net/huanghongxun/article/details/51267460
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<map>
#define mod 100000007
#define ll long long
#define N 2005
using namespace std;
int n,m,num,px[N],py[N];
ll ans,t1,t2,t3,t4;
typedef pair<int,int>pii;
map<pii,bool>mp;
void calc(int x,int y,int z){//计算顶点在正方形框架边,顶点上的正方形个数
z=min(z,x+y);
if(!z)return;
t1=(t1+1ll*(z+3)*z/2)%mod;
if(z>x)t1=(t1-1ll*(z-x)*(z-x+1)/2)%mod;
if(z>y)t1=(t1-1ll*(z-y)*(z-y+1)/2)%mod;
}
bool check(int x,int y){return x>=0&&x<=n&&y>=0&&y<=m;}
void update(int x1,int y1,int x2,int y2){
if(!check(x1,y1)||!check(x2,y2))return;
int res=0;
if(mp[make_pair(x1,y1)])res++;
if(mp[make_pair(x2,y2)])res++;
t2++;t3+=res;if(res==2)t4++;
} void solve(int x1,int y1,int x2,int y2){
int dx=x2-x1,dy=y2-y1;
update(x1+dy,y1-dx,x2+dy,y2-dx);
update(x1-dy,y1+dx,x2-dy,y2+dx);
if (abs(dx+dy)&1) return;
dy=(dx+dy)>>1; dx-=dy;
update(x1+dx,y1+dy,x2-dx,y2-dy);
}
int main(){
#ifdef wsy
freopen("data.in","r",stdin);
#else
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
#endif
scanf("%d%d%d",&n,&m,&num);
for(int i=1;i<=num;i++){
scanf("%d%d",&px[i],&py[i]);
mp[make_pair(px[i],py[i])]=1;
}
for(int i=1;i<=min(n,m);i++)
ans=(ans+1ll*(m-i+1)*(n-i+1)%mod*i%mod)%mod;
for(int i=1;i<=num;i++){
calc(px[i],m-px[i],py[i]);
calc(px[i],m-px[i],n-py[i]);
calc(py[i],n-py[i],px[i]);
calc(py[i],n-py[i],m-px[i]);
t1=(t1-min(px[i],py[i]))%mod;//减去掉calc重复的方案
t1=(t1-min(px[i],n-py[i]))%mod;
t1=(t1-min(m-px[i],py[i]))%mod;
t1=(t1-min(m-px[i],n-py[i]))%mod;
while(t1<0)t1+=mod;
for(int j=1;j<i;j++)solve(px[i],py[i],px[j],py[j]);
}
t2%=mod;t3%=mod;t4%=mod;
cout<<ans-t1+t2-t3/3+t4/6;
return 0;
}//?????
bzoj4558[JLoi2016]方 容斥+count的更多相关文章
- [BZOJ4558]:[JLoi2016]方(容斥+模拟)
题目传送门 题目描述 上帝说,不要圆,要方,于是便有了这道题.由于我们应该方,而且最好能够尽量方,所以上帝派我们来找正方形上帝把我们派到了一个有N行M列的方格图上,图上一共有$(N+1)\times ...
- bzoj4558: [JLoi2016]方
Description 上帝说,不要圆,要方,于是便有了这道题.由于我们应该方,而且最好能够尽量方,所以上帝派我们来找正方形 上帝把我们派到了一个有N行M列的方格图上,图上一共有(N+1)×(M+1) ...
- bzoj千题计划281:bzoj4558: [JLoi2016]方
http://www.lydsy.com/JudgeOnline/problem.php?id=4558 容斥原理 全部的正方形-至少有一个点被删掉的+至少有两个点被删掉的-至少有3个点被删掉的+至少 ...
- BZOJ.4558.[JLOI2016]方(计数 容斥)
BZOJ 洛谷 图基本来自这儿. 看到这种计数问题考虑容斥.\(Ans=\) 没有限制的正方形个数 - 以\(i\)为顶点的正方形个数 + 以\(i,j\)为顶点的正方形个数 - 以\(i,j,k\) ...
- 数学(容斥计数):LNOI 2016 方
Description 上帝说,不要圆,要方,于是便有了这道题.由于我们应该方,而且最好能够尽量方,所以上帝派我们来找正方形 上帝把我们派到了一个有N行M列的方格图上,图上一共有(N+1)×(M+1) ...
- bzoj4559[JLoi2016]成绩比较 容斥+拉格朗日插值法
4559: [JLoi2016]成绩比较 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 261 Solved: 165[Submit][Status ...
- 【BZOJ4559】[JLoi2016]成绩比较 动态规划+容斥+组合数学
[BZOJ4559][JLoi2016]成绩比较 Description G系共有n位同学,M门必修课.这N位同学的编号为0到N-1的整数,其中B神的编号为0号.这M门必修课编号为0到M-1的整数.一 ...
- ●BZOJ 4559 [JLoi2016]成绩比较(容斥)
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=4559 题解: 容斥,拉格朗日插值法. 结合网上的另一种方法,以及插值法,可以把本题做到 O( ...
- BZOJ.4559.[JLOI2016]成绩比较(DP/容斥 拉格朗日插值)
BZOJ 洛谷 为什么已经9点了...我写了多久... 求方案数,考虑DP... \(f[i][j]\)表示到第\(i\)门课,还有\(j\)人会被碾压的方案数. 那么\[f[i][j]=\sum_{ ...
随机推荐
- 关于jvm的OutOfMemory:PermGen space异常的解决
在做网校的时候,经常会在控制台会报出方法区的内存溢出,在网上找的方法,无非都是在tomcat的bin/catalina.bat文件中 设置jvm的堆的大小和方法区的大小,但是通过eclipse启动to ...
- 201421123042 《Java程序设计》第8周学习总结
1. 本周学习总结 以你喜欢的方式(思维导图或其他)归纳总结集合相关内容. 2. 书面作业 1. ArrayList代码分析 1.1 解释ArrayList的contains源代码 源代码: 答:查找 ...
- java克隆之深拷贝与浅拷贝
版权声明:本文出自汪磊的博客,转载请务必注明出处. Java深拷贝与浅拷贝实际项目中用的不多,但是对于理解Java中值传递,引用传递十分重要,同时个人认为对于理解内存模型也有帮助,况且面试中也是经常问 ...
- Jmeter读取文件中的值《一》
此篇主要是对应上一章节的呼应,上一篇中讲到将返回值写入文件,这个值如果在下一个接口中用到, 那么我们需要去从文件中读取数据,这是我们该如何操作? 一.测试计划中添加CSV Data Set Confi ...
- es6+react.js组件入门初探
React是一个用于构建用户见面的javascript库. React主要用于构建UI,许多人认为React是MVC中的V(视图) React起源于Facebook的内部项目,用来架设Instagra ...
- Python之旅.第二章数据类型 3.19/3.20/3.21/3.22/3.23
一.数字类型 1.int类型: 基本使用: 用途:用于年龄,手机号,身份证号: 定义: age=18: 常用操作+内置方法: 正常的运算赋值: 进制转换: print(bin(3)); 把十进制3转换 ...
- Java基础类库简介
Java基础类库简介 一.常用的基础类库:11个jar(Java Archive,Java归档)包 作为java语言使用者,我们可以感受到java语言带来的优势(平台无关.面向对象.多线程.高效易扩展 ...
- Python内置函数(26)——enumerate
英文文档: enumerate(iterable, start=0) Return an enumerate object. iterable must be a sequence, an itera ...
- 新概念英语(1-23)Which glasses?
Which glasses does the man want? A:Give me some glasses please, Jane? B:Which glasses? These glasses ...
- Spring Security 入门(1-3-3)Spring Security - logout 退出登录
要实现退出登录的功能我们需要在 http 元素下定义 logout 元素,这样 Spring Security 将自动为我们添加用于处理退出登录的过滤器 LogoutFilter 到 FilterCh ...