hdu 4400 离散化+二分+BFS(暴搜剪枝还超时的时候可以借鉴一下)
Mines
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 1110 Accepted Submission(s): 280
More specifically, we put the mines in the Cartesian coordinate system. Each mine has position (x,y) and power distance d.
The police want you to write a program and calculate the result of each operation.
In each test case:
Line 1: an integer N, indicating that there are N mines. All mines are numbered from 1 to N.
Line 2…N+1: There are 3 integers in Line i+1 (i starts from 1). They are the i-th mine’s position (xi,yi) and its power distance di. There can be more than one mine in the same point.
Line N+2: an integer M, representing the number of operations.
Line N+3...N+M+2 : Each line represents an operation by an integer k meaning that in this operation, the k-th mine will be ignited. It is possible to ignite a mine which has already exploded, but it will have no effect.
1<=M<=N<=100000,0<=xi,yi<=10^9,0<=di<=10^9
Input ends with N=0.
/*
曼哈顿距离为两坐标的轴绝对值和即:abs(a.x-b.x)+abs(a.y-b.y)
直接暴搜时间复杂度O(N*M)会超时
对它进行优化剪枝,先对x值离散化,再通过二分查找范围,
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <set>
#include <queue>
#include <cmath>
#include <algorithm>
using namespace std; const int maxn=;
int N,M,X,f[maxn];
bool vis[maxn];//标记数组 struct Point
{
int x,y,d;//x坐标,y坐标,曼哈顿距离
}p[maxn]; Point read_point()
{
Point t;
scanf("%d %d %d",&t.x,&t.y,&t.d);
return t;
}
struct Mine
{
int y,n;//y坐标,编号
Mine(){}
Mine(int y=,int n=):y(y),n(n){}
bool operator<(const Mine &A) const//对y重载小于号
{
return y<A.y;
}
};
multiset<Mine>s[maxn]; void fun()
{
int k,ans=,l,r,yl,yr,i;
scanf("%d",&k);k--;
if(vis[k])
{
printf("0\n");
return ;
}
queue<int> Q;
Q.push(k);vis[k]=true;
while(!Q.empty())
{
ans++;
k=Q.front();Q.pop();
l=lower_bound(f,f+X,p[k].x-p[k].d)-f;//二分查找大于等于val的下标
r=upper_bound(f,f+X,p[k].x+p[k].d)-f;//二分查找“元素值>查找值”的第一个元素的位置
for(i=l;i<r;i++)
{
int dy=p[k].d-abs(p[k].x-f[i]);
multiset<Mine>::iterator it,yl,yr;
yl=s[i].lower_bound(Mine(p[k].y-dy,));//返回的是指针
yr=s[i].upper_bound(Mine(p[k].y+dy,));
for(it=yl;it!=yr;it++)
{
if(!vis[it->n])
{
vis[it->n]=true;
Q.push(it->n);
}
}
s[i].erase(yl,yr);
}
}
printf("%d\n",ans);
}
void solve()
{
int i,j;
for(i=;i<N;i++)
{
p[i]=read_point();
f[i]=p[i].x;
}
sort(f,f+N);
X=unique(f,f+N)-f;
for(i=;i<X;i++) s[i].clear();
for(i=;i<N;i++)
{
j=lower_bound(f,f+X,p[i].x)-f;
s[j].insert(Mine(p[i].y,i));
}
memset(vis,false,sizeof(vis));
scanf("%d",&M);
while(M--)
fun();
}
int main()
{
int icase=;
while(scanf("%d",&N),N)
{
printf("Case #%d:\n",++icase);
solve();
}
return ;
}
hdu 4400 离散化+二分+BFS(暴搜剪枝还超时的时候可以借鉴一下)的更多相关文章
- HDU 4620 Fruit Ninja Extreme 暴搜
题目大意:题目就是描述的水果忍者. N表示以下共有 N种切水果的方式. M表示有M个水果需要你切. W表示两次连续连击之间最大的间隔时间. 然后下N行描述的是 N种切发 第一个数字C表示这种切法可以切 ...
- 紫书 习题7-14 UVa 307(暴搜+剪枝)
这道题一开始我想的是在排序之后只在头和尾往中间靠近来找木块, 然后就WA, 事实证明这种方法是错误的. 然后参考了别人的博客.发现别人是直接暴搜, 但是加了很多剪枝, 所以不会超时. 我也想过这个做法 ...
- hdu4982 暴搜+剪枝(k个数和是n,k-1个数的和是平方数)
题意: 给你两个数n,k问你是否怎在这样一个序列: (1)这个序列有k个正整数,且不重复. (2)这k个数的和是n. (3)其中有k-1个数的和是一个平方数. ...
- hdu 1242:Rescue(BFS广搜 + 优先队列)
Rescue Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total Submis ...
- HDU 5961:传递(暴搜)
http://acm.hdu.edu.cn/showproblem.php?pid=5961 题意:中文题意.给出两个图,判断这个两个图是否都是传递的.注意一下传递的定义要看清,一开始没看清连样例都看 ...
- HDOJ/HDU 1242 Rescue(经典BFS深搜-优先队列)
Problem Description Angel was caught by the MOLIGPY! He was put in prison by Moligpy. The prison is ...
- POJ 1167 The Buses 暴搜+剪枝
思路: 先把能选的路线都预处理出来 按照能停的车的多少排个序 (剪枝1) 搜搜搜 如果当前剩的车÷当前能停车的多少+deep>=ans剪掉 (剪枝2) //By SiriusRen #inclu ...
- 洛谷 1312 Mayan游戏——暴搜+剪枝
题目:https://www.luogu.org/problemnew/show/P1312 自己写了很久.又T又WA的. 发现对题理解有误.改完后应该只有T了,但还是T的. 自己写了许多剪枝,很鸡肋 ...
- CF1340B Nastya and Scoreboard(暴搜剪枝/dp)
Question 一个n个数码位的分数板,每一个数码位都是一个七段数码管,现在给出每个数码位的显示情况,问再点亮k段数码管的话能显示的最大的数是多少,如果不能构成一串数字,就输出-1 Solution ...
随机推荐
- vs2015驱动开发中使用RtlStringCchPrintfW()报错
法一: 在头顶添加一段代码 #pragam comment(lib,"xxxxxx.lib") 法二: 右击工程点属性,选择Linker下的Input,在依赖项后面写上$(DDK_ ...
- 使用jquery-validate校验表单
注意: 表单校验(validation校验[需要下载JQuery-validate插件,而且必须要在引入JQuery插件之后,再引入validate插件/*validate是建立在JQuery之上*/ ...
- 新手 WordPress主题制作全过程
WordPress主题制作全过程(一):基础准备 前言: 我想大多数使用WordPress的朋友都喜欢去尝试新的主题,但是换来换去,总是找不到那么一款适合自己的,让人很郁闷.于是很多人萌生了修改现有主 ...
- CF-1114 (2019/02/11)
CF-1114 A. Got Any Grapes? skip B. Yet Another Array Partitioning Task 将n个数分成连续的k组,使得每组的前m大的数字的总和最大. ...
- salt 模板
http://www.mamicode.com/info-detail-2297406.html
- Ubuntu下kaldi安装
该文章为博主原创,如若转载请注明出处:https://www.cnblogs.com/fengleixue/p/9482202.html 因公司业务需要需使用kaldi语音识别工具,现将kaldi环境 ...
- Java使用ResourceBundle类读取properties文件中文乱码的解决方案
Java使用java.util.ResourceBundle类的方式来读取properties文件时不支持中文,要想支持中文必须将文件设置为ISO-8859-1编码格式,这对于开发工具默认为UTF-8 ...
- nginx作为正向代理,反向代理的一些应用
正向代理代理的对象是客户端 反向代理代理的对象是服务端 举例说下nginx作为正向代理作访问控制 server{ listen 80; server_name localhost jeson.gaos ...
- day14-推导式和生成器表达式
1.推导式规则 [每一个元素或者是和元素相关的操作 for 元素 in 可迭代数据类型] ----------遍历之后挨个处理[满足条件的元素相关的操作 for 元素 in 可迭代数据类型 if 元素 ...
- Python语言程序设计之一--for循环中累加变量是否要清零
最近学到了Pyhton中循环这一章.之前也断断续续学过,但都只是到了函数这一章就停下来了,写过的代码虽然保存了下来,但是当时的思路和总结都没有记录下来,很可惜.这次我开通了博客,就是要把这些珍贵的学习 ...