题目概述

一个$n \times m$的整点集。其中$q$个点被m被设置为不能访问。

问这个点集中含有多少个不同的正方形,满足不包含任何一个不能访问的点。

对于$50\%$的数据满足$1 \leq n,m \leq 10^4, 1 \leq q \leq 10^3$

对于另外$50\%$的数据满足$1 \leq n,m \leq 2\times 10^5, 1 \leq q \leq 200$

Solution 

  我们规定行递增的方向为$x$的正方向,列递增的方向为$y$的正方向。

  设$f[i][j]$表示以$(i,j)$为左上角的正方形最大边长。

    则$\sum\limits_{i=1}^{n} \sum\limits_{j=1}^{m} f[i][j]$就是所求。

  我们可以枚举对角线,然后再枚举每个标记点,分别计算各个标记点对这条对角线的影响。

  不妨设当前直线是$y = x + b$。

  • 若点$(i,j)$在直线下方(即顺时针方向),其会限制到点$(j-b,j)$左上方的所有点。
  • 若点$(i,j)$在直线上,其会限制到这个点左上方的所有点。
  • 若点$(i,j)$在直线上方(即逆时针方向),其会限制到点$(i,i+b)$左上方的所有点

  注意到,对于每一条对角线,由于标记点个数是$q$个,那么限制的记录点最多也是$q$个。

  两个记录点间的转移可以使用一些数学计算来加速做到$O(1)$,但是需要注意非常多的细节。

  人傻常数大,后面用一个set,复杂度到了$O(nq \ log_2  \ q)$

# pragma GCC optimize()
# include<bits/stdc++.h>
# define int long long
using namespace std;
const int N=2e5+;
int n,m,q;
namespace fast_IO{
const int IN_LEN = , OUT_LEN = ;
char ibuf[IN_LEN], obuf[OUT_LEN], *ih = ibuf + IN_LEN, *oh = obuf, *lastin = ibuf + IN_LEN, *lastout = obuf + OUT_LEN - ;
inline char getchar_(){return (ih == lastin) && (lastin = (ih = ibuf) + fread(ibuf, , IN_LEN, stdin), ih == lastin) ? EOF : *ih++;}
inline void putchar_(const char x){if(oh == lastout) fwrite(obuf, , oh - obuf, stdout), oh = obuf; *oh ++= x;}
inline void flush(){fwrite(obuf, , oh - obuf, stdout);}
int read(){
int x = ; int zf = ; char ch = ' ';
while (ch != '-' && (ch < '' || ch > '')) ch = getchar_();
if (ch == '-') zf = -, ch = getchar_();
while (ch >= '' && ch <= '') x = x * + ch - '', ch = getchar_(); return x * zf;
}
void write(int x){
if (x < ) putchar_('-'), x = -x;
if (x > ) write(x / );
putchar_(x % + '');
}
}
set< pair<int,int> >st;
struct point { int x,y;}r[N];
int cross(point a,point b) {
return a.x*b.y-a.y*b.x;
}
int direct (point a,point b,point c) {
point ba={a.x-b.x,a.y-b.y};
point bc={c.x-b.x,c.y-b.y};
int ret=cross(bc,ba);
if (ret==) return ;
else if (ret<) return -;
else if (ret>) return ;
}
pair<int,int>bag[N],p[N];
int work(int b) {
int cnt=;
int Lx=max(-b,0ll),Rx=min(n,m-b);
int Ly=Lx+b,Ry=Rx+b;
for (int i=;i<=q;i++) {
int rec=direct(r[i],(point){-b,},(point){,b}); if (b<) rec=-rec;
if (b==) rec=direct(r[i],(point){-,-},(point){,});
if (rec==-) {
if (r[i].y-b>=Lx&&r[i].y-b<=Rx&&r[i].y>=Ly&&r[i].y<=Ry) bag[++cnt]=make_pair(r[i].y-b,r[i].x-r[i].y+b-);
} else if (rec==) {
if (r[i].x>=Lx&&r[i].x<=Rx&&r[i].y>=Ly&&r[i].y<=Ry) bag[++cnt]=make_pair(r[i].x,);
} else if (rec==) {
if (r[i].x>=Lx&&r[i].x<=Rx&&r[i].x+b>=Ly&&r[i].x+b<=Ry) bag[++cnt]=make_pair(r[i].x,r[i].y-r[i].x-b-);
}
}
sort(bag+,bag++cnt);
int tot=;
for (int i=,j;i<=cnt;i=j) {
j=i; int ret=bag[i].second;
while (bag[j].first==bag[i].first&&j<=cnt) j++;
p[++tot]=make_pair(bag[i].first,ret);
}
if (tot==) {
int tmp=min(n-Lx,m-Ly);
return (tmp+)*(tmp)/;
}
int ans=(min(n-(p[tot].first+),m-(p[tot].first++b)))*(min(n-(p[tot].first+),m-(p[tot].first++b))+)/;
p[tot].second=min(p[tot].second,min(n-p[tot].first,m-p[tot].first-b));
int last=-;
for (int i=tot;i>=;i--) {
if (last==-) { ans+=p[i].second; last=i; continue;}
int num=p[last].first-p[i].first-;
int val=p[last].second+;
if (st.find(make_pair(p[last].first,p[last].first+b))!=st.end()) val--;
ans+=num*(val+val+num-)/;
if (st.find(make_pair(p[last].first,p[last].first+b))!=st.end()) p[i].second=min(p[i].second,p[last].second+num);
else p[i].second=min(p[i].second,p[last].second+num+);
ans+=p[i].second;
last=i;
}
int num=p[].first-Lx;
int val=p[].second+;
if (st.find(make_pair(p[].first,p[].first+b))!=st.end()) val--;
ans+=num*(val+val+num-)/;
return ans;
}
using namespace fast_IO;
signed main() {
n=read(),m=read(),q=read(); n--; m--;
for (int i=;i<=q;i++) {
r[i].x=read();r[i].y=read();
r[i].x--; r[i].y--;
st.insert(make_pair(r[i].x,r[i].y));
}
int ans=;
for (int i=-n;i<=m;i++) ans+=work(i);
write(ans); flush();
return ;
}

Lefkaritika.cpp

『HGOI 20190917』Lefkaritika 题解 (DP)的更多相关文章

  1. 『HGOI 20190917』Cruise 题解 (计算几何+DP)

    题目概述 在平面直角坐标系的第$1$象限和第$4$象限有$n$个点,其中第$i$个点的坐标为$(x_i,y_i)$,有一个权值$p_i$ 从原点$O(0,0)$出发,不重复的经过一些点,最终走到原点, ...

  2. 洛谷 P6383 -『MdOI R2』Resurrection(DP)

    洛谷题面传送门 高速公路上正是补 blog 的时候,难道不是吗/doge,难不成逆在高速公路上写题/jy 首先形成的图显然是连通图并且有 \(n-1\) 条边.故形成的图是一棵树. 我们考虑什么样的树 ...

  3. LuoguP7337 『MdOI R4』Fun 题解

    Content 有 \(n\) 个人去打比赛.给出第 \(i\) 个人的交通方式 \(t_i\) 和颓废值 \(q_i\)(均以 \(0/1\) 表示).如果 \(t_i=1,q_i=1\) 的人数 ...

  4. 『土地征用 Land Acquisition 斜率优化DP』

    斜率优化DP的综合运用,对斜率优化的新理解. 详细介绍见『玩具装箱TOY 斜率优化DP』 土地征用 Land Acquisition(USACO08MAR) Description Farmer Jo ...

  5. 关于『进击的Markdown』:第二弹

    关于『进击的Markdown』:第二弹 建议缩放90%食用 众里寻他千百度,蓦然回首,Markdown却在灯火灿烂处 MarkdownYYDS! 各位早上好!  我果然鸽稿了  Markdown 语法 ...

  6. 似魔鬼的 『 document.write 』

    在平时的工作中,楼主很少用 document.write 方法,一直觉得 document.write 是个危险的方法.楼主不用,并不代表别人不用,最近给维护的项目添了一点代码,更加深了我对 &quo ...

  7. 拾遗:『Linux Capability』

    『Linux Capability』 For the purpose of performing permission checks, traditional UNIX implementations ...

  8. 『创意欣赏』20款精致的 iOS7 APP 图标设计

    这篇文章给大家分享20款精致的 iOS7 移动应用程序图标,遵循图形设计的现代潮流,所有图标都非常了不起,给人惊喜.通过学习这些移动应用程序图标,设计人员可以提高他们的创作,使移动用户界面看起来更有趣 ...

  9. 『设计前沿』14款精致的国外 iOS7 图标设计示例

    每天都有大量的应用程序发布到 iOS App Store 上,在数量巨大的应用中想要引起用户的主要,首要的就是独特的图标设计.这篇文章收集了14款精致的国外 iOS7 图标设计示例,希望能带给你设计灵 ...

随机推荐

  1. vue 动态添加对象属性

    昨天使用vue发现直接给对象添加属性,并不能触发响应更新,后来看文档发现要通过this.$set 函数动态添加才可用,eg: this.$set( obj, key, data)

  2. MySQL安装及初级增删改查一

    学习MYsql 是参照这个维C果糖的总结,学习目录网址:https://blog.csdn.net/qq_35246620/article/details/70823903,谢谢大神的无私分享. 一. ...

  3. asp.net 8 Request,Response,Server

    Request成员: 1.Request.UrlReferrer 获取请求的来源,可以防盗链 Response.Write(Request.Url.ToString());//获取当前请求的URL地址 ...

  4. shell 中的 set -e 和 set +e的区别

    区别: set -e : 执行的时候如果出现了返回值为非零,整个脚本 就会立即退出 set +e: 执行的时候如果出现了返回值为非零将会继续执行下面的脚本 set -e 命令用法总结如下:1. 当命令 ...

  5. SIP笔记

    消息代号: 1)1XX:临时响应,表示请求消息正在被处理. 2)2XX:成功响应,表示请求已被成功接收,完全理解并被接受. 3)3XX:重定向响应,表示需采取进一步以完成该请求. 4)4XX:客户机错 ...

  6. ES6基础之——get 与 set

    class Chef{ constructor(food){ this.food = food; thid.dish = []; } //getter get menu(){ return this. ...

  7. 4.ID主键生成策略

    保证唯一性(auto_increment) 一.xml方式 <?xml version="1.0"?> <!DOCTYPE hibernate-mapping P ...

  8. shell脚本中使用nohup执行命令不生效

    1 例如 !#/bin/bash nohup echo "hello world" 2 解决办法 加上 source /etc/profile 就好了 !#/bin/bash so ...

  9. 【异常】Could not find artifact com.wm.****:

    1 详细异常 [ERROR] Failed to execute goal on project spark-etl: Could not resolve dependencies for proje ...

  10. sql注入搞事情(连载二)

    sql注入(连载二)安信华web弱点测试系统注入 好多人问我sql怎么学习,我一下也说不出来.我就在此做统一的解答: sql语句分为两种,不管怎么用还是怎么学习主要是要理解SQL语句的基本概念,框架, ...