HDU6089 恐怖分子(变形线段树)

题目描述

n*m的平面内有K个不安全点,Q个询问位置在(x,y)的人能走到多少个点?从(x,y)走到(x',y')是合法的,当且仅当(x,y)和(x',y')之间的矩形中不包含不安全点。

题解

问题相当于平面中有若干障碍点,询问以某一个点为四个角之一的不包含障碍点的矩形有多少个。

我们只需要考虑一个方向,接下来把整个图旋转90度再算即可 

那一个方向怎么求呢?

正难则反,我们可以考虑逆向思考

如图,线与线交点表示一个坐标,黑点表示不安全点,白点表示询问点

白点右下方可以走到的点数=蓝线内的点数-阴影内的点数

那阴影到底是什么呢?

它其实就是 每一高度的最右边的黑点向下作垂线,与坐标轴围成的最大区域

换句话说,它满足 如果上方的右边界在下方的原右边界右边, 则下方的右边界按上方的算

那我们可以以高度划定区间建一颗线段树,做一些特殊处理就可以求出阴影了
原谅我表达能力有限,具体看代码吧
//正难则反 
#include<bits/stdc++.h>
#define mid ((l+r)>>1)
using namespace std;
const int N=100005;
typedef long long ll;
int n,m,K,Q,T_Max[N<<2],tot,Max;
//T_Max表y在某一区间内的x的最大值
ll ans[N],T_sum[N<<2],T_suml[N<<2];
struct node {int x,y,id,pd;node() {} node(int a,int b,int c,int d) {x=a;y=b;id=c;pd=d;}
}a[N*2],tr[N],q[N];
bool cmp(const node &A,const node &B){return A.x<B.x||(A.x==B.x&&A.y<B.y)||(A.x==B.x&&A.y==B.y&&A.pd<B.pd);
}
int read(){int x=0,f=1;char ch=getchar();while (ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}while (ch>='0'&&ch<='9')x=(x<<1)+(x<<3)+ch-'0',ch=getchar();return x*f;
}
ll query_sum(int u,int l,int r,int a,int b,int &mx){if (a<=l&&r<=b){if(mx>=T_Max[u]) return (ll)mx*(r-l+1);if(l==r) return mx=T_Max[u];int tt=T_Max[u<<1|1];ll res=0;if(mx>=tt){//即T_Max[u<<1|1]<=mx<T_Max[u<<1] res+=(ll)mx*(r-mid);res+=query_sum(u<<1,l,mid,a,b,mx);}else{//即mx<T_Max[u<<1|1](T_Max[u<<1]的范围不限) res+=T_suml[u];res+=query_sum(u<<1|1,mid+1,r,a,b,mx);}mx=T_Max[u];return res;}ll s=0;if(b>mid) s+=query_sum(u<<1|1,mid+1,r,a,b,mx);//先更新上边以更新右边界 if(a<=mid) s+=query_sum(u<<1,l,mid,a,b,mx);return s;
}
void ins(int u,int l,int r,int y,int x){if(l==r){if(x>T_Max[u]) T_Max[u]=T_sum[u]=x;return;}if(y<=mid) ins(u<<1,l,mid,y,x);else ins(u<<1|1,mid+1,r,y,x);int tt=T_Max[u<<1|1];T_suml[u]=query_sum(u<<1,l,mid,l,mid,tt);//注意直接写T_max[u<<1|1]的话可能会被修改T_Max[u]=max(T_Max[u<<1],T_Max[u<<1|1]);T_sum[u]=T_suml[u]+T_sum[u<<1|1];//如果T_max[u<<1|1]>[l,mid]区间的原右边界,则[l,mid]区间的右边界按T_max[u<<1|1]算 //否则,按原右边界算
}
void calc(){tot=0;for (int i=1;i<=K;i++) a[++tot]=node(tr[i].x,tr[i].y,i,0);for (int i=1;i<=Q;i++) a[++tot]=node(q[i].x,q[i].y,i,1);sort(a+1,a+tot+1,cmp);for (int i=1;i<=tot;i++){if(!a[i].pd) ins(1,1,m,a[i].y,a[i].x);else{Max=0;ans[a[i].id]+=query_sum(1,1,m,1,a[i].y,Max);//二维数点 Max=0;ans[a[i].id]-=query_sum(1,1,m,a[i].y,a[i].y,Max);//减去重复的同行/同列轴 
        }}
}
int main(){n=read();m=read();K=read();Q=read();for (int i=1;i<=K;i++) tr[i].x=read(),tr[i].y=read();for (int i=1;i<=Q;i++) q[i].x=read(),q[i].y=read(),ans[i]=0;for (int i=0;i<4;i++){calc();for (int i=1;i<=(m<<2); i++) T_sum[i]=T_suml[i]=T_Max[i]=0;//清零for (int j=1;j<=K;j++) tr[j].x=n-tr[j].x+1,swap(tr[j].x,tr[j].y);//旋转90度 for (int j=1;j<=Q;j++) q[j].x=n-q[j].x+1,swap(q[j].x,q[j].y);swap(n,m);}for (int i=1;i<=Q;i++) printf("%lld\n",(ll)n*m-ans[i]);return 0;
}

转载于:https://www.cnblogs.com/HarryPotter-fan/p/11317080.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/423744.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mybatis学习(45):开启二级缓存

目录结构 com.geyao.mybatis.mapper BlogMapper类 package com.geyao.mybatis.mapper;import java.util.List; import java.util.Map;import org.apache.ibatis.annotations.Param;import com.geyao.mybatis.pojo.Blog;public interface BlogMapper {Blog selectBlog(Integer…

【读书笔记】重要的东西

以上摘自一本叫做《大道至简》的小册子&#xff0c;有关介绍可以参考下面的链接 http://www.china-pub.com/34356转载于:https://www.cnblogs.com/chenxizhang/archive/2008/08/11/1264917.html

七夕秀恩爱新姿势!这波操作我给十分!

一、前言 像每一滴酒回不了最初的葡萄&#xff0c;我回不到年少。爱情亦是如此&#xff0c;这就是写一篇小程序的初衷&#xff0c;用来记录我和她最美的恋爱。什么是最美恋爱&#xff1f;就是繁忙之余的一封书信&#xff0c;一起奋斗的目标&#xff0c;精彩的瞬间&#xff0c;旅…

mybatis学习(46):二级缓存被刷新的情况

目录结构 com.geyao.mybatis.mapper BlogMapper类 package com.geyao.mybatis.mapper;import java.util.List; import java.util.Map;import org.apache.ibatis.annotations.Param;import com.geyao.mybatis.pojo.Blog;public interface BlogMapper {Blog selectBlog(Integer…

python 主函数 输入

python 主函数 输入 看一段主函数调用函数的小程序&#xff1a; 1 import sys2 def Fuc():3 print hello4 5 if __name__ __main__:6 if len(sys.argv) ! 3:7 print Usage: python input_name output_name8 exit(1)9 f_input sys.argv[1] 10…

mybatis学习(47):嵌套查询--一对一

数据库 目录结构 映入jar包和junit单元测试 com.geyao.mybatis.mapper AuthorMapper类 package com.geyao.mybatis.mapper;import com.geyao.mybatis.pojo.Author; public interface AuthorMapper {Author selectAuthorById(Integer id); } BlogMapper类 package com.gey…

element-ui select

1. 组合 label <!DOCTYPE html> <html><head><meta charset"UTF-8"><!-- import CSS --><link rel"stylesheet" href"https://unpkg.com/element-ui/lib/theme-chalk/index.css"> </head><body>…

WEBSERVICE 之WSDL

使用WSDL生成SOAP请求 转载于:https://www.cnblogs.com/canlove/archive/2008/08/18/1270099.html

mybatis学习(48):列表信息查询

数据库 目录结构 映入jar包和junit单元测试 com.geyao.mybatis.mapper AuthorMapper类 package com.geyao.mybatis.mapper;import com.geyao.mybatis.pojo.Author; public interface AuthorMapper {Author selectAuthorById(Integer id); } BlogMapper类 package com.gey…

Pycharm中运行Python代码的几种方式

Pycharm中运行Python代码的几种方式 在pycharm中的Python代码运行会出现各种奇葩的问题&#xff0c;比如&#xff0c;密码输入时不显示或没有提示&#xff0c;给我们带来一些麻烦&#xff0c;下面介绍几种代码运行的几种方式&#xff1a; 一、直接运行&#xff08;Run按钮或者快…

mybatis学习(49):嵌套查询--一对多

数据库表 数据库叫blog_gp1701 author表 数据 blog表 数据 comment表 数据 post表 数据 目录结构 jar包导入 先给对应的jar包导入 建立一个junit单元测试 配置文件 log4j.properties ### \u914D\u7F6E\u6839 ### log4j.rootLogger debug,console ,fileAppender,dailyRo…

诗词歌赋,样样精通!诗词古语小程序带你领略魅力古风丨实战

1. 小程序功能 古诗词大全成语大全成语接龙诗词飞花令诗词分享、收藏诗词接龙唐诗宋词起名字百家姓猜谜语2. 小程序预览&#xff1a; 3. 部分截图 首页 列表页 详情页 分享页 唐诗宋词 成语接龙 4. 项目结构 . ├── README.md ├── project.config.json …

mybatis学习(50):嵌套查询

数据库表 数据库叫blog_gp1701 author表 数据 blog表 数据 comment表 数据 post表 数据 目录结构 jar包导入 先给对应的jar包导入 建立一个junit单元测试 配置文件 log4j.properties ### \u914D\u7F6E\u6839 ### log4j.rootLogger debug,console ,fileAppender,dailyRo…

《WF编程》系列之3 - 漫游工作流:Visual Studio 2005 扩展

《WF编程》系列之3 - 漫游工作流:Visual Studio 2005 扩展 1.2.2 Visual Studio 2005 扩展 Microsoft提供了一个Visual Studio 2005 的工作流扩展(Microsoft Visual Studio 2005 Extensions for Windows Workflow)其中包含用于构建工作流的可视化设计器. 活动排列在工具箱里,可…

只需20小时,让0基础的你掌握小程序云开发!这个暑假,约否?

今天的故事要从小开和小发这对好基友的假期说起...... 没错&#xff01;他来了&#xff0c;他来了&#xff0c;云开发带着小程序开发夏令营最新情报向我们走来了&#xff01; 为了让更多的童鞋享受高效率、“在云上”掌握小程序开发这一热门技术&#xff0c;也为了解决大家自学…

Python 字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转换、分割等)

去空格及特殊符号 s.strip().lstrip().rstrip(,) 复制字符串 #strcpy(sStr1,sStr2) sStr1 strcpy sStr2 sStr1 sStr1 strcpy2 print sStr2 连接字符串 #strcat(sStr1,sStr2) sStr1 strcat sStr2 append sStr1 sStr2 print sStr1 查找字符 #strchr(sStr1,sStr2) # < 0 …

mybatis学习(52):扩展结果的展现

首先使用逆向工程创建相关类 数据库表 author blog 新建一个项目&#xff0c;将逆向工程的生成的拷贝进来 配置文件 log4j.properties ### \u914D\u7F6E\u6839 ### log4j.rootLogger debug,console ,fileAppender,dailyRollingFile,ROLLING_FILE,MAIL,DATABASE### \u8BBE\…

统计HDFS文件数量,大小,以及在某范围大小的文件数量

统计HDFS文件数量大小&#xff0c;小于20M文件数量 hadoop fs -du -h / # 统计文件大小hadoop fs -count / # 统计文件数量&#xff0c;返回的数据是目录个数&#xff0c;文件个数&#xff0c;文件总计大小&#xff0c;输入路径hadoop fs -ls -R /path/data | grep ^- > ~/d…

mybatis学习(53):构造方法映射

数据库表 数据库叫blog_gp1701 author表 数据 blog表 数据 comment表 数据 post表 数据 目录结构 jar包导入 先给对应的jar包导入 建立一个junit单元测试 配置文件 log4j.properties ### \u914D\u7F6E\u6839 ### log4j.rootLogger debug,console ,fileAppender,dailyRo…

python 实现统计ftp服务器指定目录下文件夹数目、文件数目及所有文件大小 本次主要为满足应用方核对上传到ftp服务器的文件是否缺漏。 主要要求:指定目录下,文件夹数目/文件数目/所有文件大小

python 实现统计ftp服务器指定目录下文件夹数目、文件数目及所有文件大小 本次主要为满足应用方核对上传到ftp服务器的文件是否缺漏。 主要要求&#xff1a;指定目录下&#xff0c;文件夹数目/文件数目/所有文件大小&#xff0c;类似Windows如下功能&#xff1a; 模块介绍&…