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

试题描述

输入

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

输出

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

输入示例

  1.  

输出示例

  1.  

数据规模及约定

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 },显然可以用斜率优化来搞,最后记得再从下往上扫一遍。

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <cstdlib>
  5. #include <cctype>
  6. #include <algorithm>
  7. using namespace std;
  8.  
  9. int read() {
  10. int x = 0, f = 1; char c = getchar();
  11. while(!isdigit(c)){ if(c == '-') f = -1; c = getchar(); }
  12. while(isdigit(c)){ x = x * 10 + c - '0'; c = getchar(); }
  13. return x * f;
  14. }
  15.  
  16. #define maxn 1510
  17. #define oo 1000000000
  18.  
  19. struct Vec {
  20. int x, y;
  21.  
  22. Vec() {}
  23. Vec(int _, int __): x(_), y(__) {}
  24.  
  25. Vec operator - (const Vec& t) const { return Vec(x - t.x, y - t.y); }
  26. int operator ^ (const Vec& t) const { return x * t.y - y * t.x; }
  27. } ps[maxn];
  28.  
  29. bool Map[maxn][maxn];
  30. int n, dis[maxn][maxn], f[maxn][maxn], g[maxn][maxn], q[maxn], hd, tl;
  31.  
  32. bool isup(Vec a, int k) { return a.y <= a.x * k; }
  33. bool isup(Vec a, Vec b) { return (b ^ a) >= 0; }
  34.  
  35. int main() {
  36. n = read();
  37. for(int i = 1; i <= n; i++) {
  38. char c = getchar();
  39. while(!isdigit(c)) c = getchar();
  40. int j = 0;
  41. while(isdigit(c)) Map[i][++j] = c - '0', dis[i][j] = oo, c = getchar();
  42. }
  43.  
  44. for(int i = 1; i <= n; i++) {
  45. for(int j = 1; j <= n; j++)
  46. if(Map[i][j]) dis[i][j] = 0;
  47. else if(j > 1 && dis[i][j-1] < oo) dis[i][j] = min(dis[i][j], dis[i][j-1] + 1);
  48. for(int j = n; j; j--)
  49. if(Map[i][j]) dis[i][j] = 0;
  50. else if(j < n && dis[i][j+1] < oo) dis[i][j] = min(dis[i][j], dis[i][j+1] + 1);
  51. for(int j = 1; j <= n; j++) if(dis[i][j] < oo) dis[i][j] = dis[i][j] * dis[i][j];
  52. // for(int j = 1; j <= n; j++) printf("%d%c", dis[i][j], j < n ? ' ' : '\n');
  53. }
  54. for(int j = 1; j <= n; j++) {
  55. hd = 1; tl = 0;
  56. for(int i = 1; i <= n; i++) {
  57. if(dis[i][j] < oo) {
  58. ps[i] = Vec(i, dis[i][j] + i * i);
  59. while(hd < tl && isup(ps[q[tl]] - ps[q[tl-1]], ps[i] - ps[q[tl-1]])) tl--;
  60. q[++tl] = i;
  61. }
  62. while(hd < tl && isup(ps[q[hd+1]] - ps[q[hd]], 2 * i)) hd++;
  63. // printf("%d: (%d, %d)\n", hd, ps[q[hd]].x, ps[q[hd]].y);
  64. if(hd <= tl) f[i][j] = ps[q[hd]].y - 2 * i * ps[q[hd]].x + i * i;
  65. else f[i][j] = oo;
  66. // printf("%d %d: %d\n", i, j, f[i][j]);
  67. }
  68.  
  69. for(int i = 1; i <= (n >> 1); i++) swap(dis[i][j], dis[n-i+1][j]);
  70.  
  71. hd = 1; tl = 0;
  72. for(int i = 1; i <= n; i++) {
  73. if(dis[i][j] < oo) {
  74. ps[i] = Vec(i, dis[i][j] + i * i);
  75. while(hd < tl && isup(ps[q[tl]] - ps[q[tl-1]], ps[i] - ps[q[tl-1]])) tl--;
  76. q[++tl] = i;
  77. }
  78. while(hd < tl && isup(ps[q[hd+1]] - ps[q[hd]], 2 * i)) hd++;
  79. if(hd <= tl) g[i][j] = ps[q[hd]].y - 2 * i * ps[q[hd]].x + i * i;
  80. else g[i][j] = oo;
  81. }
  82.  
  83. for(int i = 1; i <= n; i++) f[i][j] = min(f[i][j], g[n-i+1][j]);
  84. }
  85.  
  86. int q = read();
  87. while(q--) {
  88. int x = read(), y = read();
  89. printf("%d\n", f[x][y]);
  90. }
  91.  
  92. return 0;
  93. }

[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. mysql使用基础 sql语句(一)

    csdn博文地址:mysql使用基础 sql语句(一)  点击进入 命令行输入mysql -u root -p,回车再输入密码,进入mysql. 终端命令以分号作为一条语句的结束,可分为多行输入,只需 ...

  2. impdp使用

    创建一个dir,dump_dir1,将备份文件放在下面 impdp szfetsc_card/123456 directory=dump_dir1 dumpfile=130912.dmp REMAP_ ...

  3. [vijos1892]树上的最大匹配(树形DP)

    题目:https://vijos.org/p/1892 分析:(100分其实用到各种c++优化,没什么实际意义,所以弄70就可以了) 题目很简单,很容易想出用树形DP,但是求方案数的时候,满满都是细节 ...

  4. 《TCP/IP详解卷1:协议》第4章 ARP:地址解析协议-读书笔记

    章节回顾: <TCP/IP详解卷1:协议>第1章 概述-读书笔记 <TCP/IP详解卷1:协议>第2章 链路层-读书笔记 <TCP/IP详解卷1:协议>第3章 IP ...

  5. WCF 入门 (17)

    前言 看的是入门视频,就希望培养一个学习的习惯吧. 前段时间看了微软的SurfaceBook的视频,被惊艳到了,但是我没钱买啊... 第17集 WCF中未经处理的异常 Unhandled except ...

  6. zoj1665 dij变形

    既然输入的是损坏率,那1-x就是剩余的.最后只要剩余的最大. #include<stdio.h> #include<string.h> #define Max 99999999 ...

  7. 《疯狂Java:突破程序员基本功的16课》读书笔记-第一章 数组与内存控制

    很早以前就听过李刚老师的疯狂java系列很不错,所以最近找一本拿来拜读,再此做下读书笔记,促进更好的消化. 使用Java数组之前必须先对数组对象进行初始化.当数组的所有元素都被分配了合适的内存空间,并 ...

  8. Oracle修改数据表

    (1)修改数据表中某个字段值为空: update 表明   别名  set 别名.字段名 例子:update JWT_JYWF t set t.jdsbh=''(2)设置数据表中某个字段值和rownu ...

  9. .net String.Format数字格式化输出

    内容转载自:http://www.cnblogs.com/lqb/archive/2008/08/04/1259498.html 前面内容这个做的总结的很全,今后有新增的我继续往后补充.请留意我增加的 ...

  10. Mysql安全配置

    相关学习资料 http://drops.wooyun.org/tips/2245 http://www.cnblogs.com/siqi/archive/2012/11/21/2780966.html ...