[COJ0988]WZJ的数据结构(负十二)

试题描述

输入

见题目,注意本题不能用文件输入输出

输出

见题目,注意本题不能用文件输入输出

输入示例


输出示例


数据规模及约定

1≤N≤1500,M≤N×N 且 M≤300000。

题解

我们先预处理出 d[i][j] 表示距离 (i, j) 这个点最近的点(只考虑第 i 行)的欧几里得距离的平方。那么我们可以枚举行数 i,然后变成一维问题从上往下扫,设 f(i, j) 为离该点最近的点的欧几里得距离的平方(即答案),那么有 f(i, j) = min{ d[k][j] + (i - k)2 | 1 ≤ k ≤ i },显然可以用斜率优化来搞,最后记得再从下往上扫一遍。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cctype>
#include <algorithm>
using namespace std; int read() {
int x = 0, f = 1; char c = getchar();
while(!isdigit(c)){ if(c == '-') f = -1; c = getchar(); }
while(isdigit(c)){ x = x * 10 + c - '0'; c = getchar(); }
return x * f;
} #define maxn 1510
#define oo 1000000000 struct Vec {
int x, y; Vec() {}
Vec(int _, int __): x(_), y(__) {} Vec operator - (const Vec& t) const { return Vec(x - t.x, y - t.y); }
int operator ^ (const Vec& t) const { return x * t.y - y * t.x; }
} ps[maxn]; bool Map[maxn][maxn];
int n, dis[maxn][maxn], f[maxn][maxn], g[maxn][maxn], q[maxn], hd, tl; bool isup(Vec a, int k) { return a.y <= a.x * k; }
bool isup(Vec a, Vec b) { return (b ^ a) >= 0; } int main() {
n = read();
for(int i = 1; i <= n; i++) {
char c = getchar();
while(!isdigit(c)) c = getchar();
int j = 0;
while(isdigit(c)) Map[i][++j] = c - '0', dis[i][j] = oo, c = getchar();
} for(int i = 1; i <= n; i++) {
for(int j = 1; j <= n; j++)
if(Map[i][j]) dis[i][j] = 0;
else if(j > 1 && dis[i][j-1] < oo) dis[i][j] = min(dis[i][j], dis[i][j-1] + 1);
for(int j = n; j; j--)
if(Map[i][j]) dis[i][j] = 0;
else if(j < n && dis[i][j+1] < oo) dis[i][j] = min(dis[i][j], dis[i][j+1] + 1);
for(int j = 1; j <= n; j++) if(dis[i][j] < oo) dis[i][j] = dis[i][j] * dis[i][j];
// for(int j = 1; j <= n; j++) printf("%d%c", dis[i][j], j < n ? ' ' : '\n');
}
for(int j = 1; j <= n; j++) {
hd = 1; tl = 0;
for(int i = 1; i <= n; i++) {
if(dis[i][j] < oo) {
ps[i] = Vec(i, dis[i][j] + i * i);
while(hd < tl && isup(ps[q[tl]] - ps[q[tl-1]], ps[i] - ps[q[tl-1]])) tl--;
q[++tl] = i;
}
while(hd < tl && isup(ps[q[hd+1]] - ps[q[hd]], 2 * i)) hd++;
// printf("%d: (%d, %d)\n", hd, ps[q[hd]].x, ps[q[hd]].y);
if(hd <= tl) f[i][j] = ps[q[hd]].y - 2 * i * ps[q[hd]].x + i * i;
else f[i][j] = oo;
// printf("%d %d: %d\n", i, j, f[i][j]);
} for(int i = 1; i <= (n >> 1); i++) swap(dis[i][j], dis[n-i+1][j]); hd = 1; tl = 0;
for(int i = 1; i <= n; i++) {
if(dis[i][j] < oo) {
ps[i] = Vec(i, dis[i][j] + i * i);
while(hd < tl && isup(ps[q[tl]] - ps[q[tl-1]], ps[i] - ps[q[tl-1]])) tl--;
q[++tl] = i;
}
while(hd < tl && isup(ps[q[hd+1]] - ps[q[hd]], 2 * i)) hd++;
if(hd <= tl) g[i][j] = ps[q[hd]].y - 2 * i * ps[q[hd]].x + i * i;
else g[i][j] = oo;
} for(int i = 1; i <= n; i++) f[i][j] = min(f[i][j], g[n-i+1][j]);
} int q = read();
while(q--) {
int x = read(), y = read();
printf("%d\n", f[x][y]);
} return 0;
}

[COJ0988]WZJ的数据结构(负十二)的更多相关文章

  1. COJ1012 WZJ的数据结构(十二)

    今天突然想写个树套树爽一爽(1810ms) 写的是树状数组套线段树(动态开节点) #include<cstdio> #include<cctype> #include<c ...

  2. COJ 1010 WZJ的数据结构(十) 线段树区间操作

    传送门:http://oj.cnuschool.org.cn/oj/home/problem.htm?problemID=1001 WZJ的数据结构(十) 难度级别:D: 运行时间限制:3000ms: ...

  3. 大话数据结构(十二)java程序——KMP算法及改进的KMP算法实现

    1.朴素的模式匹配算法 朴素的模式匹配算法:就是对主串的每个字符作为子串开头,与要连接的字符串进行匹配.对主串做大循环,每个字符开头做T的长度的小循环,直到成功匹配或全部遍历完成为止. 又称BF算法 ...

  4. java 数据结构(十二):Collections工具类的使用

    Collections工具类1.作用:操作Collection和Map的工具类 2.常用方法:reverse(List):反转 List 中元素的顺序shuffle(List):对 List 集合元素 ...

  5. Java数据结构(十二)—— 霍夫曼树及霍夫曼编码

    霍夫曼树 基本介绍和创建 基本介绍 又称哈夫曼树,赫夫曼树 给定n个权值作为n个叶子节点,构造一棵二叉树,若该树的带权路径长度(wpl)达到最小,称为最优二叉树 霍夫曼树是带权路径长度最短的树,权值较 ...

  6. COJ968 WZJ的数据结构(负三十二)

    WZJ的数据结构(负三十二) 难度级别:D: 运行时间限制:5000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 给你一棵N个点的无根树,边上均有权值,每个点上有 ...

  7. [COJ0968]WZJ的数据结构(负三十二)

    [COJ0968]WZJ的数据结构(负三十二) 试题描述 给你一棵N个点的无根树,边上均有权值,每个点上有一盏灯,初始均亮着.请你设计一个数据结构,回答M次操作. 1 x:将节点x上的灯拉一次,即亮变 ...

  8. [COJ0985]WZJ的数据结构(负十五)

    [COJ0985]WZJ的数据结构(负十五) 试题描述 CHX有一个问题想问问大家.给你一个长度为N的数列A,请你找到两个位置L,R,使得A[L].A[L+1].…….A[R]中没有重复的数,输出R- ...

  9. COJ966 WZJ的数据结构(负三十四)

    WZJ的数据结构(负三十四) 难度级别:C: 运行时间限制:20000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 给一棵n个节点的树,请对于形如"u  ...

随机推荐

  1. tmux列表重命名

    查看tmux会话列表时,会话名称是数值递增,不易识别 tmux ls 1: 1 windows (created Fri Oct 21 16:29:46 2016) [175x41]2: 1 wind ...

  2. [整理] ES5 词法约定文档树状图

    将ES5 词法说明整理为了树状图,方便查阅,请自行点开小图看大图:

  3. 05.C#泛型类型(三章3.1-3.2)

    接下来说下C#中的泛型,熟练地使用泛型能提高代码的重用性,使用我们代码瞬间就高大上了,当然只有一点点,真的只有一点点,因为后面要学习和掌握的知识还有很多.先来看下一个使用Dictionary<T ...

  4. 阿里面试回来,想和Java程序员谈一谈(转载)

    引言 其实本来真的没打算写这篇文章,主要是LZ得记忆力不是很好,不像一些记忆力强的人,面试完以后,几乎能把自己和面试官的对话都给记下来.LZ自己当初面试完以后,除了记住一些聊过的知识点以外,具体的内容 ...

  5. (Struts)ActionForm类及表单数据验证

    LoginForm代码: /* * Generated by MyEclipse Struts * Template path: templates/java/JavaClass.vtl */ pac ...

  6. IntelliJ13+tomcat+jrebel实现热部署(亲测可用)

       网上有很多介绍intellij idea整合jrebel插件实现热部署的文章,但是有的比较复杂,有的不能成功,最后经过各种尝试,实现了整合,亲测可用!步骤说明如下:   一.先下载jrebel安 ...

  7. Hibernate-缓存

    Hibernate是一个持久层框架,经常访问物理数据库.为了降低应用程序对物理数据源访问的频次,从而提高应用程序的运行性能.缓存内的数据是对物理数据源中的数据的复制,应用程序在运行时从缓存读写数据,在 ...

  8. 【uoj222】 NOI2016—区间

    http://uoj.ac/problem/222 (题目链接) 题意 有n个区间,当有m个区间有公共部分时,求m个区间长度的最大值与最小值之差的最小值. Solution 线段树+滑动窗口.这道题很 ...

  9. Search everything 使用说明

    Everything是速度最快的文件搜索软件,可以瞬间搜索到你需要的文件.

  10. 移动H5页面,keyup事件不好使用处理解决

    1.mouse事件换成touch,pointer事件,keyup换成textInput事件