bzoj4558: [JLoi2016]方
Description
Input
Output
仅一行一个正整数, 代表正方形个数对 100000007( 10^8 + 7) 取模之后的值
容斥,不考虑删点的方案数可以O(min(n,m))枚举正方形在水平方向投影的长度算出
恰好删去2~4点的方案数可以O(k2)枚举其中的两个点,再看正方形另外两点是否也被删去
还有过定点的正方形数,可以列出8条不等式,求半平面交,然后因为一些特殊的性质,用pick定理可以算出半平面交内整点数(似乎有比这简洁的多的方法)
然后加加减减就得到答案了
#include<cstdio>
#include<algorithm>
int s[][];
int n,m,k;
typedef long long i64;
const int P=1e8+;
int min(int a,int b){return a<b?a:b;}
int max(int a,int b){return a>b?a:b;}
struct pos{int x,y;}ps[];
struct hp{int a,b,c;}hs[],ls[];
pos operator&(hp u,hp v){
int r=u.a*v.b-u.b*v.a;
if((u.c*v.b-u.b*v.c)%r||(u.a*v.c-u.c*v.a)%r)putchar('*');
return (pos){(u.c*v.b-u.b*v.c)/r,(u.a*v.c-u.c*v.a)/r};
}
bool operator==(pos a,pos b){return a.x==b.x&&a.y==b.y;}
i64 operator*(pos a,pos b){return i64(a.x)*b.y-i64(a.y)*b.x;}
pos operator-(pos a,pos b){return (pos){a.x-b.x,a.y-b.y};}
pos operator+(pos a,pos b){return (pos){a.x+b.x,a.y+b.y};}
bool in(pos a,hp b){return a.x*b.a+a.y*b.b<=b.c;}
bool chk(hp a,hp b,hp c){return !in(a&b,c);}
int gcd(int a,int b){return b?gcd(b,a%b):a;}
int abs(int x){return x>?x:-x;}
int count(pos w){return gcd(abs(w.x),abs(w.y));}
i64 cal(int x,int y){
int L=-x,R=n-x,U=-y,D=m-y;
int p=;
#define _(a,b,c) hs[p++]=(hp){a,b,c}
_(,,min(D,-L));
_(,,D);
_(,,min(R,D));
_(,-,R);
_(,-,-max(U,-R));
_(-,-,-U);
_(-,,-max(L,U));
_(-,,-L);
hs[p]=hs[];
int l=,r=;
for(int i=;i<p;++i){
while(r-l>=&&chk(ls[r-],ls[r-],hs[i]))--r;
while(r-l>=&&chk(ls[l+],ls[l],hs[i]))++l;
ls[r++]=hs[i];
}
while(r-l>=&&chk(ls[r-],ls[r-],ls[l]))--r;
ls[r]=ls[l];
for(int i=l;i<r;++i)ps[i]=ls[i+]&ls[i];
r=std::unique(ps+l,ps+r)-ps-l;
ps[r]=ps[l];
if(r-l==)return count(ps[l+]-ps[l]);
i64 ans=;
for(int i=l;i<r;++i){
ans+=count(ps[i+]-ps[i]);
ans+=ps[i+]*ps[i];
}
return ans/;
}
pos xs[],ht[];
bool hd[];
void ins(pos x){
int w=(x.x*+x.y*)%;
while(hd[w])w=(w+)%;
hd[w]=;ht[w]=x;
}
bool operator<(pos a,pos b){return a.x!=b.x?a.x<b.x:a.y<b.y;}
i64 d0,d1,d2,d3,d4;
bool exist(pos x){
int w=(x.x*+x.y*)%;
while(hd[w]){
if(ht[w]==x)return ;
w=(w+)%;
}
return ;
}
bool in(pos a){return a.x>=&&a.x<=n&&a.y>=&&a.y<=m;}
int main(){
scanf("%d%d%d",&n,&m,&k);
for(int i=;i<k;++i)scanf("%d%d",&xs[i].x,&xs[i].y),ins(xs[i]);
int s=min(n,m);
for(int i=;i<=s;++i)d0=(d0+i*i64(n+-i)*(m+-i))%P;
for(int i=;i<k;++i){
d1=(d1+cal(xs[i].x,xs[i].y))%P;
for(int j=i+;j<k;++j){
pos d=xs[j]-xs[i];
if(~d.x+d.y&){
pos a=(pos){d.x+d.y>>,-d.x+d.y>>};
pos p1=xs[i]+a,p2=xs[j]-a;
if(in(p1)&&in(p2)){
int e1=exist(p1);
int e2=exist(p2);
d4+=e1&e2;
d3+=e1^e2;
d2+=~(e1|e2)&;
}
}
d=(pos){d.y,-d.x};
pos p1=xs[i]+d,p2=xs[i]-d,p3=xs[j]+d,p4=xs[j]-d;
if(in(p1)&&in(p3)){
int e1=exist(p1);
int e3=exist(p3);
d4+=(e1&e3);
d3+=(e1^e3);
d2+=(~(e1|e3)&);
}
if(in(p2)&&in(p4)){
int e2=exist(p2);
int e4=exist(p4);
d4+=(e2&e4);
d3+=(e2^e4);
d2+=(~(e2|e4)&);
}
}
}
d4/=;d3/=;
d1-=d2+d3*+d4*;
d0-=d1;
printf("%lld",(d0+P)%P);
return ;
}
bzoj4558: [JLoi2016]方的更多相关文章
- bzoj4558[JLoi2016]方 容斥+count
4558: [JLoi2016]方 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 452 Solved: 205[Submit][Status][D ...
- [BZOJ4558]:[JLoi2016]方(容斥+模拟)
题目传送门 题目描述 上帝说,不要圆,要方,于是便有了这道题.由于我们应该方,而且最好能够尽量方,所以上帝派我们来找正方形上帝把我们派到了一个有N行M列的方格图上,图上一共有$(N+1)\times ...
- bzoj千题计划281:bzoj4558: [JLoi2016]方
http://www.lydsy.com/JudgeOnline/problem.php?id=4558 容斥原理 全部的正方形-至少有一个点被删掉的+至少有两个点被删掉的-至少有3个点被删掉的+至少 ...
- 4558: [JLoi2016]方
4558: [JLoi2016]方 https://lydsy.com/JudgeOnline/problem.php?id=4558 分析: 容斥原理+各种神奇的计数. 如果没有被删除了的点的话,直 ...
- 【BZOJ 4558】 4558: [JLoi2016]方 (计数、容斥原理)
未经博主同意不能转载 4558: [JLoi2016]方 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 362 Solved: 162 Descri ...
- JLOI2016 方
bzoj4558 真是一道非常excited的题目啊-JLOI有毒 题目大意:给一个(N+1)*(M+1)的网格图,格点坐标为(0~N,0~M),现在挖去了K个点,求剩下多少个正方形(需要注意的是正方 ...
- BZOJ.4558.[JLOI2016]方(计数 容斥)
BZOJ 洛谷 图基本来自这儿. 看到这种计数问题考虑容斥.\(Ans=\) 没有限制的正方形个数 - 以\(i\)为顶点的正方形个数 + 以\(i,j\)为顶点的正方形个数 - 以\(i,j,k\) ...
- 【BZOJ】4558: [JLoi2016]方
[题意]给定有(n+1)*(m+1)个点的网格图,其中指定k个点不合法,求合法的正方形个数(四顶点合法). [算法]计数 [题解]斜着的正方形很麻烦,所以考虑每个斜正方形其外一定有正的外接正方形. 也 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
随机推荐
- uboot能ping通本机无法ping通本机上搭建的虚拟机
注意 转载请注明出处:https://www.cnblogs.com/dakewei 一.背景 1.1 uboot不能被其它主机ping通,这是由于uboot没有对其它主机发送过来的arp包进行响应, ...
- POJ3278_Catch that cow
一个简单的bfs题. 用结构体的目的在于保存bfs到达此处时走的步数. 不多言,上AC代码: //18:18 #include<iostream> #include<cstdio&g ...
- burnside引理&polya定理
burnside引理&polya定理 参考资料: <polya计数法的应用>--陈瑜希 黄学长 置换: 置换即是将n个元素的染色进行交换,产生一个新的染色方案. 群: 一个元素的集 ...
- 利用HTML中map标签实现整张图片带有可点击区域的图像映射:
实现效果说明:一整张背景图片,实现图标区域出现链接,可点击跳转到指定页面. <div class="brand"> <img src="images/b ...
- SQL Server 查询优化 索引的结构与分类
一.索引的结构 关系型数据库中以二维表来表达关系模型,表中的数据以页的形式存储在磁盘上,在SQL SERVER中,数据页是磁盘上8k的连续空间,那么,一个表的所有数据页在磁盘上是如何组织的呢?分两种情 ...
- 这些HTML、CSS知识点,面试和平时开发都需要 No8-No9(知识点:媒体操作、构建表单)
系列知识点汇总 这些HTML.CSS知识点,面试和平时开发都需要 No1-No4(知识点:HTML.CSS.盒子模型.内容布局) 这些HTML.CSS知识点,面试和平时开发都需要 No5-No7(知识 ...
- 为什么要使用MQ消息中间件?它解决了什么问题?
1.应用场景 1.1 异步处理 场景说明:用户注册后,需要发注册邮件和注册短信,传统的做法有两种1.串行的方式;2.并行的方式 (1)串行方式:将注册信息写入数据库后,发送注册邮件,再发送注册短信,以 ...
- UVALive-2531 The K-League (最大流建模+枚举)
题目大意:有n支足球队,已知每支球队的已胜场数和任意两支球队之间还需要的比赛场数a[i][j],求最终可能夺冠的所有球队. 题目分析:枚举所有的球队,对于球队 i 让它在接下来的比赛中全部获胜,如果这 ...
- UVA-307 Sticks (DFS+剪枝)
题目大意:用n根长度未必相等的木棒匹配出最多数量的等长木棒. 题目分析:枚举所有可能的等长木棒的长度,通过DFS的方式逐根匹配,在此过程中要剪枝.先将木棒长度按从大到小排序,也就是说匹配每一根等长木棒 ...
- IOS-网络(AFNetworking)
一.AFNetWorking基本使用 // // ViewController.m // IOS_0112_AFNetWorking // // Created by ma c on 16/2/11. ...