【BZOJ】4558: [JLoi2016]方
【题意】给定有(n+1)*(m+1)个点的网格图,其中指定k个点不合法,求合法的正方形个数(四顶点合法)。
【算法】计数
【题解】斜着的正方形很麻烦,所以考虑每个斜正方形其外一定有正的外接正方形。
也就是,一个边长为x的正放的正方形,同时代表x个正方形(其中1~x-1为斜正方形)。
num0:首先计算所有点合法时全图的正方形个数。
枚举长度i,则num0=∑i*(n-i+1)*(m-i+1)。(长度为i的情况下,左上角多大的矩形能作为左上端点)
num1:减去单个不合法点构成的正方形
对于一个不合法点有四个方向,任意一个方向可以视为calc(l,r,h),l为向左延伸长度,r为向右,h为向上。
包含斜放的正方形在内,也就是一条线段只要接触到该点就会有一个该点构成的正方形。
考虑长度为1的情况是(0,1)(1,0),长度为2是(0,2)(1,1)(2,0),随长度递增答案有以下规律,只要判断h在哪个区间就可以快速计算答案:
当长度为0,答案为0。
当长度为1~min(l,r),数列递增,答案为(h+3)*h/2。
当长度为min(l,r)+1~max(l,r),数列为常数min(l,r)+1,答案为(min+3)*min/2+(h-min)*(min+1)。(一边受限)
当长度为max(l,r)+1~min(l,r)+max(l,r),数列递减,答案为(min+3)*min/2+(max-min)*(min+1)+(min*2+1-h+max)*(h-max)/2。(两边受限)
当长度为min+max+1~+∞,答案为(min+3)*min/2+(max-min)*(min+1)+(min+1)*min/2
细心推一推就可以了。
num2:加上两个不合法点构成的正方形
枚举两个不合法点(A,B)(C,D)的连边,有两种情况:
作为边:另外两个点是(A+D-B,B+A-C)(C+D-B,D+A-C),或另一方向的(A+B-D,B+C-A)(C+B-D,D+C-A)。
作为对角线,利用全等三角形解方程可得,另外两个点是((A-D+B+C)/2,B+C-(A-D+B+C)/2)((A-B+D+C)/2,A+D-(A-B+D+C)/2)。
判断另外两个点是否整点和是否在界内。
num3:减去三个不合法点构成的正方形
在枚举计算num2的时候可以顺便求得(二分另外两个点判断是否是不合法点),当然这样每三个点会被计算3次,除以三即可。
注意,每三个点构成了一个正方形时都应该统计一次,这样粗糙的统计才是容斥的基础。(手算一下就可以得知了)
num4:加上四个不合法点构成的正方形
计算num2时顺便求得,这样每四个点会被计算6次,除以6即可。
综上所述,ans=num0-num1+num2-num3+num4。
注意一些细节,如fabs(x-(int)(x+eps))<=eps。
#include<cstdio>
#include<cstring>
#include<cctype>
#include<cmath>
#include<queue>
#include<stack>
#include<set>
#include<vector>
#include<map>
#include<algorithm>
#define ll long long
#define lowbit(x) x&-x
using namespace std;
int read(){
char c;int s=,t=;
while(!isdigit(c=getchar()))if(c=='-')t=-;
do{s=s*+c-'';}while(isdigit(c=getchar()));
return s*t;
}
int min(int a,int b){return a<b?a:b;}
int max(int a,int b){return a<b?b:a;}
int ab(int x){return x>?x:-x;}
//int MO(int x){return x>=MOD?x-MOD:x;}
//void insert(int u,int v){tot++;e[tot].v=v;e[tot].from=first[u];first[u]=tot;}
/*------------------------------------------------------------*/
const int inf=0x3f3f3f3f,maxn=,MOD=1e8+,maxk=;
const double eps=1e-;
int n,m,kind,ans=,two,three,four;
struct cyc{
int x,y;
bool operator < (const cyc &a)const{
return x<a.x||(x==a.x&&y<a.y);
}
}a[maxk],p1,p2;
int MO(int x){return x>=MOD?x-MOD:x;}
int calc(ll l,ll r,ll h){
ll H,num=,mins=min(l,r),maxs=max(l,r);
if(h>mins)H=mins;else H=h;
num+=(H+)*H/;
if(h<=mins)return num%MOD; if(h>maxs)H=maxs;else H=h;
num+=(H-mins)*(mins+);
if(h<=maxs)return num%MOD; if(h>mins+maxs)H=mins+maxs;else H=h;
num+=(mins*+-H+maxs)*(H-maxs)/;
return num%MOD;
}
void check(){
if(p1.x<||p1.x>n||p2.x<||p2.x>n||p1.y<||p1.y>m||p2.y<||p2.y>m)return;
two++;
int x=lower_bound(a+,a+kind+,p1)-a;
bool o1=x>=&&x<=kind&&(a[x].x==p1.x&&a[x].y==p1.y);
x=lower_bound(a+,a+kind+,p2)-a;
bool o2=x>=&&x<=kind&&(a[x].x==p2.x&&a[x].y==p2.y);
if(o1)three++;if(o2)three++;if(o1&&o2)four++;
}
bool T(double x){return fabs(x-(int)(x+eps))<=eps;}
int main(){
n=read();m=read();kind=read();
for(int i=;i<=min(n,m);i++){
ans=MO(ans+1ll*(n-i+)*(m-i+)%MOD*i%MOD);
}
for(int i=;i<=kind;i++){
a[i].x=read();a[i].y=read();
int num=;
num=MO(num+calc(a[i].x,n-a[i].x,a[i].y));
num=MO(num+calc(a[i].x,n-a[i].x,m-a[i].y));
num=MO(num+calc(a[i].y,m-a[i].y,a[i].x));
num=MO(num+calc(a[i].y,m-a[i].y,n-a[i].x));
num=MO(num+MOD-min(a[i].x,a[i].y)-min(a[i].x,m-a[i].y)-min(n-a[i].x,a[i].y)-min(n-a[i].x,m-a[i].y));
ans=MO(ans+MOD-num);
}
sort(a+,a+kind+);
two=;three=;four=;
for(int i=;i<kind;i++){
for(int j=i+;j<=kind;j++){
int A=a[i].x,B=a[i].y,C=a[j].x,D=a[j].y;
p1=(cyc){A+D-B,B+A-C};p2=(cyc){C+D-B,D+A-C};
check();
p1=(cyc){A+B-D,B+C-A};p2=(cyc){C+B-D,D+C-A};
check();
if(T(1.0*(A+B+C-D)/)&&T(1.0*(A-B+D+C)/)){
p1=(cyc){(A-D+B+C)/,B+C-(A-D+B+C)/};p2=(cyc){(A-B+D+C)/,A+D-(A-B+D+C)/};
check();
}
}
}
ans=MO(ans+two);
ans=MO(ans+MOD-three/);
ans=MO(ans+four/);
printf("%d",(ans%MOD+MOD)%MOD);
return ;
}
【BZOJ】4558: [JLoi2016]方的更多相关文章
- BZOJ.4558.[JLOI2016]方(计数 容斥)
BZOJ 洛谷 图基本来自这儿. 看到这种计数问题考虑容斥.\(Ans=\) 没有限制的正方形个数 - 以\(i\)为顶点的正方形个数 + 以\(i,j\)为顶点的正方形个数 - 以\(i,j,k\) ...
- 【BZOJ 4558】 4558: [JLoi2016]方 (计数、容斥原理)
未经博主同意不能转载 4558: [JLoi2016]方 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 362 Solved: 162 Descri ...
- 4558: [JLoi2016]方
4558: [JLoi2016]方 https://lydsy.com/JudgeOnline/problem.php?id=4558 分析: 容斥原理+各种神奇的计数. 如果没有被删除了的点的话,直 ...
- bzoj4558[JLoi2016]方 容斥+count
4558: [JLoi2016]方 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 452 Solved: 205[Submit][Status][D ...
- bzoj 4557: [JLoi2016]侦察守卫 树归
bzoj 4557: [JLoi2016]侦察守卫 设f[x][j]表示覆盖以x为根的子树的所有应该被覆盖的节点,并且以x为根的子树向下j层全部被覆盖的最小代价. 设g[x][j]表示与x距离大于j全 ...
- bzoj千题计划281:bzoj4558: [JLoi2016]方
http://www.lydsy.com/JudgeOnline/problem.php?id=4558 容斥原理 全部的正方形-至少有一个点被删掉的+至少有两个点被删掉的-至少有3个点被删掉的+至少 ...
- bzoj 3597: [Scoi2014]方伯伯运椰子 0/1分数规划
3597: [Scoi2014]方伯伯运椰子 Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 144 Solved: 78[Submit][Status ...
- bzoj 3594: [Scoi2014]方伯伯的玉米田 dp树状数组优化
3594: [Scoi2014]方伯伯的玉米田 Time Limit: 60 Sec Memory Limit: 128 MBSubmit: 314 Solved: 132[Submit][Sta ...
- BZOJ 3595: [Scoi2014]方伯伯的Oj SBT+可持久化Treap
3595: [Scoi2014]方伯伯的Oj Time Limit: 6 Sec Memory Limit: 256 MBSubmit: 102 Solved: 54[Submit][Status ...
随机推荐
- lintcode-178-图是否是树
178-图是否是树 给出 n 个节点,标号分别从 0 到 n - 1 并且给出一个 无向 边的列表 (给出每条边的两个顶点), 写一个函数去判断这张`无向`图是否是一棵树 注意事项 你可以假设我们不会 ...
- 【week4】课堂Scrum站立会议
项目:连连看游戏 小组名称:天天向上(旁听) 小组成员:张政 张金生 李权 武致远 已完成任务 1.本项目采用c#. 2. 初步界面. 形成一个windows下的游戏界面,每个需要消除的方块是一个bu ...
- Nautilus-Share-Message: Called "net usershare info" but it failed: Failed to
See what nautilus processes are running : ps aux | grep nautilus Kill all nautilus processes you see ...
- GC是什么?为什么要有GC
GC:Garbage Collection 垃圾收集器. GC就是对“不可达“的对象进行回收,释放内存. Java内存的管理实际上就是对对象的管理,其中包括对对象的分配和回收. 对于程序员来说,分配对 ...
- opencv图像像素值读取
说到图像像素,肯定要先认识一下图像中的坐标系长什么样. 1. 坐标体系中的零点坐标为图片的左上角,X轴为图像矩形的上面那条水平线:Y轴为图像矩形左边的那条垂直线.该坐标体系在诸如结构体Mat,Rect ...
- 【Python】Python 过滤列表
如你所知,Python 具有通过列表解析将列表映射到其它列表的强大能力.这种能力同过滤机制结合使用,使列表中的有些元素被映射的同时跳过另外一些元素.过滤列表语法: [mapping-expressio ...
- poj 1273 && hdu 1532 Drainage Ditches (网络最大流)
Drainage Ditches Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 53640 Accepted: 2044 ...
- 【题解】SDOI2009Bill的挑战
这题好像状压的做法比较的无脑?但想记录一下容斥的做法,感觉自己对于容斥简直一无所知.这道题目容斥的解法我也是看了题解才会的.如有雷同,是我看的(*/ω\*)我们可以首先枚举当前字符串与给定的哪 \(k ...
- [CQOI2012]交换棋子 网络流
---题面--- 题解: 一开始很快想出了一个接近正解的建图方法,但其实是错误的,不过还是骗了70分_(:зゝ∠)_ 首先我们可以观察到棋子有限,但费用多种,其实也就相当于限制了流量,找最小费用 对于 ...
- BZOJ1269 [AHOI2006]文本编辑器editor 【82行splay】
1269: [AHOI2006]文本编辑器editor Time Limit: 10 Sec Memory Limit: 162 MB Submit: 4633 Solved: 1782 [Sub ...