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));
}

转载于:https://www.cnblogs.com/zzqsblog/p/5493655.html

JLOI2016 方相关推荐

  1. bzoj4558[JLoi2016]方 容斥+count

    4558: [JLoi2016]方 Time Limit: 20 Sec  Memory Limit: 256 MB Submit: 452  Solved: 205 [Submit][Status] ...

  2. 洛谷 P3271 [JLOI2016]方

    题目描述 上帝说,不要圆,要方,于是便有了这道题. 由于我们应该方,而且最好能够尽量方,所以上帝派我们来找正方形上帝把我们派到了一个有N行M列的方格图上,图上一共有(N+1)*(M+1)个格点,我们需 ...

  3. Bzoj4558 [JLoi2016]方

    Time Limit: 20 Sec  Memory Limit: 256 MB Submit: 382  Solved: 173 Description 上帝说,不要圆,要方,于是便有了这道题.由于 ...

  4. [JLOI2016]方

    Description 上帝说,不要圆,要方,于是便有了这道题.由于我们应该方,而且最好能够尽量方,所以上帝派我们来找正方形上帝把我们派到了一个有N行M列的方格图上,图上一共有(N+1)×(M+1)个 ...

  5. JS中的call()方法和apply()方法用法总结

    1. 每个函数都包含两个非继承而来的方法:call()方法和apply()方法. 2. 相同点:这两个方法的作用是一样的. 都是在特定的作用域中调用函数,等于设置函数体内this对象的值,以扩充函数赖 ...

  6. python 特征选择卡方_特征选择

    2020-01-10 皮尔逊相关系数 image.png 衡量线性相关性,检查数据集里目标和数值特征之间皮尔逊相关系数的绝对值.根据这个准则保留前n个特征.def cor_selector(X, y, ...

  7. C#事件的发送方和接收方(订阅方)

    C#事件的发送方和接收方(订阅方) 基于Windows的应用程序也是基于消息的,Windows使用预定义消息与应用程序通讯..NET Framework将Windows消息封装在事件中,可以把事件作为 ...

  8. 微博polg什么意思_贾磊:广东发微博给CBA造成了负面影响 方硕的意思可能没表达清楚...

    直播吧11月5日讯 近日做客一档节目时,著名篮球记者贾磊谈到了前天晚上的京粤大战. 贾磊谈到了王骁辉伸腿绊倒威姆斯一事:"我觉得这场比赛,王骁辉的这个动作,大家都看的非常清楚,确实是一个犯规 ...

  9. IOS 编程中引用第三方的方类库的方法及常见问题

    方法一:直接复制全部源文件到项目中 这样的方法就是把第三方类库的全部源文件复制到项目中.直接把全部.h和.m文件拖到XCode项目中就可以. 注意: 1. 假设第三方类库引用了一些系统自带类库.那么在 ...

最新文章

  1. 1724: [Usaco2006 Nov]Fence Repair 切割木板( 贪心 )
  2. Vista登录密码破解
  3. Spring Cloud云服务架构 - HongHu云架构代码结构分析
  4. mysql 唯一 标识符_mysql – 获取唯一标识符而不插入
  5. 打开网页出现运行脚本错误的解决技巧
  6. java 去除jsonarray里面jsonarray的重复和合并数据
  7. ImportError: No module named ‘BaseHTTPServer‘:解决方案
  8. 10)Thymeleaf 标记选择器语法
  9. windows客户端连接linux服务器上的postmaster
  10. MyBatis配置使用
  11. 30分钟做一个二维码名片应用,有源码!
  12. Java为Excel导出增加批注(POI)
  13. 计算机x线断层扫描英文缩写,计算机X线断层扫描
  14. oceanbase基于mysql吗_OCEANBASE整体架构
  15. 关于Xray中代理的一些总结
  16. 英语对程序员有多重要?
  17. 联想拯救者安装Ubuntu 16.04 系统时显示WiFi无法连接被禁用
  18. [转]作为黑客的你应该拥有的10个小工具
  19. CSS公鸡走路动画js特效
  20. 哈希表Hash与JAVA集合类Map及其方法put()、getOrDefault()、keySet()、get()

热门文章

  1. ethtool编译与内核实现介绍
  2. V模型的价值在于非常明确地标明了测试过程中存在的不同级别,并且清楚地描述了这些测试阶段和开发过程各阶段的对应关系。在V模型中,测试工作在编码之后才能进行,所以在软件开发早期各个阶段引入的错误不能及时被
  3. 芝麻信用分750以上有什么特殊作用?
  4. 故乡与文学:一场别开生面的跨年代文学对话(一)
  5. 《拯救人类》:很有可能改变人类历史进程的书
  6. Windows7下用VirtualBox安装Ubuntu网卡配置
  7. c++ 图的连通分量是什么_学习数据结构第五章:图(图的遍历操作)
  8. fedora java 开发环境_在Linux(Fedora)下搭建JAVA开发环境
  9. python3 sleep 并发_python异步编程之asyncio(百万并发)
  10. 神雕侠侣2服务器维护,《神雕侠侣2》手游10月22日停服维护公告