JLOI2016 方
bzoj4558
真是一道非常excited的题目啊…JLOI有毒
题目大意:给一个(N+1)*(M+1)的网格图,格点坐标为(0~N,0~M),现在挖去了K个点,求剩下多少个正方形(需要注意的是正方形可以是斜着的,多斜都可以)
N,M<=10^6,K<=2*10^3。
首先我们发现有一个非常感人的K=0部分分…
我们考虑K=0怎么做。
对于一个形如这样的正方形,我们叫它(a,b)正方形好了。

我们可以很容易地发现一个(a,b)正方形实际上要占下(a+b)*(a+b)这么大一块网格。
然后我们考虑a+b的大小,这样a就是[0,a+b]这么大,这样就可以得到一个答案。
代码如下:

现在我们发现,有了这些障碍物,我们只要能求出总共的正方形个数、经过一个障碍点的正方形个数、经过两个障碍点的正方形个数、经过三个点的、经过四个点的即可。
经过三个和经过四个直接二分查找一下显然是trivial的,经过两个点的要考虑是作为边往两侧延伸和作为对角线的情况,也比较trivial。
总共的正方形个数我们已经求出来了,现在我们就要考虑经过某一个障碍点的正方形个数。
对于一个点和它相关的只有四个属性,u,d,l,r对吧。

首先我们考虑直的正方形,即(0,x)或(x,0)正方形,因为这类正方形容易被重复统计。

容易发现这类正方形个数为min(u,l)+min(u,r)+min(l,d)+min(d,r)。
其它的正方形显然都是在四个象限中某两个相邻象限的。

为了简化起见,我们先考虑l,r,d这一象限的。
还是一样,设正方形为(a,b)正方形,我们枚举a+b,假设a+b=c。
因为正方形不是直的,所以a,b≠0。
现在我们考虑求出a的取值范围。
容易发现a<=r,a<=c-1,a>=1,a>=c-l(由于b<=l)。
那么我们可以列出一个形如这样的式子来计算:

这样显然不够优秀,我们可以人工分类讨论一下…
额其实注意到当r=c-1时c=r+1,当c-l=1时c=l+1,那么min和max的两个“分界点”是l+1和r+1,在分界点中间显然都是一些一次函数,那么就都是等差数列,于是我们就可以避免人工分类讨论了。

有了这个函数calc(l,r,d),那么calc(u,d,l,r)显然就等于

一些奇怪的细节详见代码…
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
#include <math.h>
using namespace std;
typedef long long ll;
#define MOD 100000007
ll calc(ll l,ll r,ll d)
{
if(!l||!r||!d) return 0;
ll ans=0;
ll upp=min(l+r,d);
ll ps[3]={l+1,r+1,upp};
sort(ps,ps+3);
ll cl=1;
for(int i=0;i<3;i++)
{
ll cr=ps[i];
if(cr>upp) break;
if(cr<2||cl==cr) continue;
++cl;
ll vl=min(r,cl-1)-max(cl-l,1LL)+1;
ll vr=min(r,cr-1)-max(cr-l,1LL)+1;
ans+=(vl+vr)*(cr-cl+1)/2;
ans%=MOD;
cl=cr;
}
return ans;
}
ll calc(ll u,ll d,ll l,ll r)
{
return calc(u,d,l)+calc(u,d,r)+calc(l,r,u)+calc(l,r,d)
+min(u,r)+min(u,l)+min(d,l)+min(d,r);
}
typedef pair<ll,ll> pll;
pll ps[233333];
#define X first
#define Y second
ll n,m,k,ans=0;
bool ok(pll a)
{
return a.X>=0&&a.X<n&&a.Y>=0&&a.Y<m;
}
ll tointt(double x)
{
if(fabs(x-ll(x+0.5))<1e-5) return x+0.5;
return -1;
}
double chk(double x,double y)
{
ll xx=tointt(x),yy=tointt(y);
if(xx>=0&&xx<n&&yy>=0&&yy<m) return 1;
return 0;
}
int main()
{
cin>>n>>m>>k; ++n; ++m;
ll cnt3=0,cnt4=0;
for(ll g=1;g<=n&&g<=m;g++) ans+=(n-g)%MOD*(m-g)%MOD*g%MOD, ans%=MOD;
for(int i=1;i<=k;i++)
{
ll x,y;
scanf("%lld%lld",&x,&y);
ans-=calc(x,n-1-x,y,m-1-y);
ans%=MOD;
ps[i]=pll(x,y);
}
sort(ps+1,ps+1+k);
for(int i=1;i<=k;i++)
{
for(int j=i+1;j<=k;j++)
{
do{
double mx=(ps[i].X+ps[j].X)/2.0,my=(ps[i].Y+ps[j].Y)/2.0;
double dx=ps[i].X-mx,dy=ps[i].Y-my;
if(chk(mx-dy,my+dx)&&chk(mx+dy,my-dx)) ans++;
}while(0);
for(int p=-1;p<=1;p+=2)
{
ll dx=ps[j].X-ps[i].X,dy=ps[j].Y-ps[i].Y;
pll n1=pll(ps[j].X-dy*p,ps[j].Y+dx*p);
pll n2=pll(ps[i].X-dy*p,ps[i].Y+dx*p);
if(ok(n1)&&ok(n2));else continue;
ans++;
int cp=0;
if(binary_search(ps+1,ps+1+k,n1)) ++cp;
if(binary_search(ps+1,ps+1+k,n2)) ++cp;
if(cp==1) cnt3++;
else if(cp==2) cnt3++, cnt4++;
}
}
}
ans-=cnt3/2; ans-=cnt4/4;
printf("%d\n",int(((ans%MOD)+MOD)%MOD));
}
JLOI2016 方的更多相关文章
- bzoj4558[JLoi2016]方 容斥+count
4558: [JLoi2016]方 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 452 Solved: 205[Submit][Status][D ...
- 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 ...
- bzoj4558: [JLoi2016]方
Description 上帝说,不要圆,要方,于是便有了这道题.由于我们应该方,而且最好能够尽量方,所以上帝派我们来找正方形 上帝把我们派到了一个有N行M列的方格图上,图上一共有(N+1)×(M+1) ...
- [BZOJ4558]:[JLoi2016]方(容斥+模拟)
题目传送门 题目描述 上帝说,不要圆,要方,于是便有了这道题.由于我们应该方,而且最好能够尽量方,所以上帝派我们来找正方形上帝把我们派到了一个有N行M列的方格图上,图上一共有$(N+1)\times ...
- BZOJ.4558.[JLOI2016]方(计数 容斥)
BZOJ 洛谷 图基本来自这儿. 看到这种计数问题考虑容斥.\(Ans=\) 没有限制的正方形个数 - 以\(i\)为顶点的正方形个数 + 以\(i,j\)为顶点的正方形个数 - 以\(i,j,k\) ...
- bzoj千题计划281:bzoj4558: [JLoi2016]方
http://www.lydsy.com/JudgeOnline/problem.php?id=4558 容斥原理 全部的正方形-至少有一个点被删掉的+至少有两个点被删掉的-至少有3个点被删掉的+至少 ...
- 【BZOJ】4558: [JLoi2016]方
[题意]给定有(n+1)*(m+1)个点的网格图,其中指定k个点不合法,求合法的正方形个数(四顶点合法). [算法]计数 [题解]斜着的正方形很麻烦,所以考虑每个斜正方形其外一定有正的外接正方形. 也 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
随机推荐
- <转>iOS性能优化:Instruments使用实战
最近采用Instruments 来分析整个应用程序的性能.发现很多有意思的点,以及性能优化和一些分析性能消耗的技巧,小结如下. Instruments使用技巧 关于Instruments官方有一个很有 ...
- App Today Extension开发注意事项
从iOS 8起,就有了App Extension.Extension的种类至今也扩充到了19种,应用也很广泛,值得重点关注起来. Extension几乎可以看做一个内嵌的独立App,拥有独立的Bund ...
- MTK 常见的编译命令
1: ./mk n(r) kernel; ./mk bootimage;当修改build-in 到kernel相关代码时,要使用此命令,具体文件参考如下: alps/kernel/ alps/medi ...
- 打电话、发短信、web以及发邮件
#import "ViewController.h" #import <MessageUI/MessageUI.h> //导入信息UI库 @interface View ...
- Jenkins用户配置(安装好jenkins后,怎么配置用户管理、权限管理)
直奔主题 安装完成后,先开启用户配置 1. 系统管理-->配置权限 2. 启用安全,并选中"安全矩阵" 如上,搞定: 可以按用户去设置各项目的操作权限了: 轻松实现,jen ...
- Java Gradle入门指南之简介、安装与任务管理
这是一篇Java Gradle入门级的随笔,主要介绍Gradle的安装与基本语法,这些内容是理解和创建build.gradle的基础,关于Gradle各种插件的使用将会在其他随笔中介绍. ...
- ORACLE SQL Developer日期显示格式设置
ORACLE的SQL Developer工具默认的日期格式DD-MON-RR,在SQL查询中往往你看不到时间信息,此时你必须修改日期格式.具体如下所示 工具->首选项->数据库->N ...
- mysql锁机制总结
1.隔离级别 (1)读不提交(Read Uncommited,RU) 这种隔离级别下,事务间完全不隔离,会产生脏读,可以读取未提交的记录,实际情况下不会使用. (2)读提交(Read commited ...
- CSS之旅——第三站 强大的伪选择器
说到伪选择器,真的让我体会到了CSS的无比强大,强大到自己貌似都不认识CSS了,有点C# 6.0中一些语法糖带给我们的震撼...首先 我们可以在VS里面提前预览一下. 可以看到,上面的伪类有很多很多, ...
- js判断游览器是移动端还是PC端
js判断网页游览器是移动端还是PC端 <script type="text/javascript"> function browserRedirect() { var ...