【HDOJ】4400 Mines
(1) KD树,但实际没有STL快,3000+
/* 4400 */
#include <iostream>
#include <string>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <vector>
#include <deque>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <ctime>
#include <cstring>
#include <climits>
#include <cctype>
#include <cassert>
#include <functional>
#include <iterator>
#include <iomanip>
using namespace std;
//#pragma comment(linker,"/STACK:102400000,1024000") #define sti set<int>
#define stpii set<pair<int, int> >
#define mpii map<int,int>
#define vi vector<int>
#define pii pair<int,int>
#define vpii vector<pair<int,int> >
#define rep(i, a, n) for (int i=a;i<n;++i)
#define per(i, a, n) for (int i=n-1;i>=a;--i)
#define clr clear
#define pb push_back
#define mp make_pair
#define fir first
#define sec second
#define all(x) (x).begin(),(x).end()
#define SZ(x) ((int)(x).size())
#define lson l, mid, rt<<1
#define rson mid+1, r, rt<<1|1 typedef struct Point_t {
int x, y, d, id; Point_t() {}
Point_t(int x, int y, int d, int id):
x(x), y(y), d(d), id(id) {} } Point_t; typedef struct node_t{
int axis;
int id;
int l, r;
} node_t; const int maxn = 1e5+;
Point_t P[maxn];
node_t nd[maxn];
bool visit[maxn];
int Q[maxn];
int L, head, tail; bool compx(const Point_t& a, const Point_t& b) {
return a.x < b.x;
} bool compy(const Point_t& a, const Point_t& b) {
return a.y < b.y;
} bool compid(const Point_t& a, const Point_t& b) {
return a.id < b.id;
} int newNode() {
++L;
nd[L].l = nd[L].r = ; return L;
} int create(int l, int r, int d) {
if (l > r) return ; int rt = newNode();
nd[rt].axis = d & ;
if (l == r) {
nd[rt].id = P[l].id;
return rt;
} if (d & ) {
sort(P+l, P+r+, compy);
} else {
sort(P+l, P+r+, compx);
} int mid = (l + r) >> ; nd[rt].id = P[mid].id;
nd[rt].l = create(l, mid-, d+);
nd[rt].r = create(mid+, r, d+); return rt;
} int Distance(int i, int j) {
return abs(P[i].x-P[j].x) + abs(P[i].y-P[j].y);
} void search(int rt, int kth) {
if (rt == )
return ; int i, j, k;
int id = nd[rt].id;
int dis = Distance(id, kth); if (dis <= P[kth].d) {
if (!visit[id]) {
visit[id] = true;
Q[tail++] = id;
}
} if (nd[rt].axis) {
// y
if (dis <= P[kth].d) {
search(nd[rt].l, kth);
search(nd[rt].r, kth);
} else {
int dy = abs(P[id].y - P[kth].y);
if (dy > P[kth].d) {
if (P[id].y <= P[kth].y)
search(nd[rt].r, kth);
else
search(nd[rt].l, kth);
} else {
search(nd[rt].l, kth);
search(nd[rt].r, kth);
}
} } else { // x
if (dis <= P[kth].d) {
search(nd[rt].l, kth);
search(nd[rt].r, kth);
} else {
int dx = abs(P[id].x - P[kth].x);
if (dx > P[kth].d) {
if (P[id].x <= P[kth].x)
search(nd[rt].r, kth);
else
search(nd[rt].l, kth);
} else {
search(nd[rt].l, kth);
search(nd[rt].r, kth);
}
}
}
} void init() {
L = ;
memset(visit, false, sizeof(visit));
} int solve(int rt, int k) {
if (visit[k])
return ; head = tail = ;
visit[k] = true;
Q[tail++] = k; while (head < tail) {
search(rt, Q[head++]);
} return tail;
} int main() {
ios::sync_with_stdio(false);
#ifndef ONLINE_JUDGE
freopen("data.in", "r", stdin);
freopen("data.out", "w", stdout);
#endif int t = ;
int n, q;
int kth, ans; while (scanf("%d", &n)!=EOF && n) {
rep(i, , n) {
scanf("%d %d %d", &P[i].x, &P[i].y, &P[i].d);
P[i].id = i;
}
init();
int rt = create(, n-, );
sort(P, P+n, compid);
scanf("%d", &q);
printf("Case #%d:\n", ++t);
while (q--) {
scanf("%d", &kth);
ans = solve(rt, kth-);
printf("%d\n", ans);
}
} #ifndef ONLINE_JUDGE
printf("time = %d.\n", (int)clock());
#endif return ;
}
(2) STL 1400+
/* 4400 */
#include <iostream>
#include <string>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <vector>
#include <deque>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <ctime>
#include <cstring>
#include <climits>
#include <cctype>
#include <cassert>
#include <functional>
#include <iterator>
#include <iomanip>
using namespace std;
//#pragma comment(linker,"/STACK:102400000,1024000") #define sti set<int>
#define stpii set<pair<int, int> >
#define mpii map<int,int>
#define vi vector<int>
#define pii pair<int,int>
#define vpii vector<pair<int,int> >
#define rep(i, a, n) for (int i=a;i<n;++i)
#define per(i, a, n) for (int i=n-1;i>=a;--i)
#define clr clear
#define pb push_back
#define mp make_pair
#define fir first
#define sec second
#define all(x) (x).begin(),(x).end()
#define SZ(x) ((int)(x).size())
#define lson l, mid, rt<<1
#define rson mid+1, r, rt<<1|1 typedef struct node_t {
int x, y, d; node_t() {}
node_t(int x, int y, int d):
x(x), y(y), d(d) {} friend bool operator< (const node_t& a, const node_t& b) {
return a.y < b.y;
} } node_t; typedef struct {
int y, id;
} pair_t; const int maxn = 1e5+;
int X[maxn];
bool visit[maxn];
node_t nd[maxn];
vector< pii > vc[maxn];
int n, m; bool comp(const node_t& a, const node_t& b) {
return a.y < b.y;
} void init() {
memset(visit, false, sizeof(visit)); rep(i, , n) {
X[i] = nd[i].x;
vc[i].clr();
} sort(X, X+n);
m = unique(X, X+n) - X;
node_t tmp; rep(i, , n) {
int id = lower_bound(X, X+m, nd[i].x) - X;
vc[id].pb(mp(nd[i].y, i));
} rep(i, , m)
sort(all(vc[i]));
} int bfs(int kth) {
if (visit[kth])
return ; int ret = ;
int x, y, dx, dy;
int lx, rx, ly, ry;
int id, xid;
vector< pii >::iterator iter, liter, riter;
queue<int> Q;
pii p; visit[kth] = true;
Q.push(kth);
p.sec = -; while (!Q.empty()) {
kth = Q.front();
Q.pop();
id = lower_bound(X, X+m, nd[kth].x) - X;
lx = lower_bound(X, X+m, nd[kth].x - nd[kth].d) - X;
rx = upper_bound(X, X+m, nd[kth].x + nd[kth].d) - X;;
for (xid=lx; xid<rx; ++xid) {
x = X[xid];
dx = abs(x - nd[kth].x);
dy = nd[kth].d - dx;
ly = nd[kth].y - dy;
ry = nd[kth].y + dy; // find lower_bound
p.fir = ly;
p.sec = -;
liter = lower_bound(all(vc[xid]), p); // find upper_bound
p.fir = ry;
p.sec = maxn;
riter = upper_bound(all(vc[xid]), p); for (iter=liter; iter!=riter; ++iter) {
int k = iter->sec;
if (!visit[k]) {
visit[k] = true;
++ret;
Q.push(k);
}
} // vc[xid].erase(liter, riter);
}
} return ret;
} int main() {
ios::sync_with_stdio(false);
#ifndef ONLINE_JUDGE
freopen("data.in", "r", stdin);
freopen("data.out", "w", stdout);
#endif int q;
int t = ;
int ans; while (scanf("%d", &n)!=EOF && n) {
rep(i, , n)
scanf("%d %d %d", &nd[i].x, &nd[i].y, &nd[i].d);
init();
scanf("%d", &q);
printf("Case #%d:\n", ++t);
int kth;
while (q--) {
scanf("%d", &kth);
--kth;
ans = bfs(kth);
printf("%d\n", ans);
}
} #ifndef ONLINE_JUDGE
printf("time = %d.\n", (int)clock());
#endif return ;
}
【HDOJ】4400 Mines的更多相关文章
- 【HDOJ】4729 An Easy Problem for Elfness
其实是求树上的路径间的数据第K大的题目.果断主席树 + LCA.初始流量是这条路径上的最小值.若a<=b,显然直接为s->t建立pipe可以使流量最优:否则,对[0, 10**4]二分得到 ...
- 【HDOJ】【3506】Monkey Party
DP/四边形不等式 裸题环形石子合并…… 拆环为链即可 //HDOJ 3506 #include<cmath> #include<vector> #include<cst ...
- 【HDOJ】【3516】Tree Construction
DP/四边形不等式 这题跟石子合并有点像…… dp[i][j]为将第 i 个点开始的 j 个点合并的最小代价. 易知有 dp[i][j]=min{dp[i][j] , dp[i][k-i+1]+dp[ ...
- 【HDOJ】【3480】Division
DP/四边形不等式 要求将一个可重集S分成M个子集,求子集的极差的平方和最小是多少…… 首先我们先将这N个数排序,容易想到每个自己都对应着这个有序数组中的一段……而不会是互相穿插着= =因为交换一下明 ...
- 【HDOJ】【2829】Lawrence
DP/四边形不等式 做过POJ 1739 邮局那道题后就很容易写出动规方程: dp[i][j]=min{dp[i-1][k]+w[k+1][j]}(表示前 j 个点分成 i 块的最小代价) $w(l, ...
- 【HDOJ】【3415】Max Sum of Max-K-sub-sequence
DP/单调队列优化 呃……环形链求最大k子段和. 首先拆环为链求前缀和…… 然后单调队列吧<_<,裸题没啥好说的…… WA:为毛手写队列就会挂,必须用STL的deque?(写挂自己弱……s ...
- 【HDOJ】【3530】Subsequence
DP/单调队列优化 题解:http://www.cnblogs.com/yymore/archive/2011/06/22/2087553.html 引用: 首先我们要明确几件事情 1.假设我们现在知 ...
- 【HDOJ】【3068】最长回文
Manacher算法 Manacher模板题…… //HDOJ 3068 #include<cstdio> #include<cstring> #include<cstd ...
- 【HDOJ】【1512】Monkey King
数据结构/可并堆 啊……换换脑子就看了看数据结构……看了一下左偏树和斜堆,鉴于左偏树不像斜堆可能退化就写了个左偏树. 左偏树介绍:http://www.cnblogs.com/crazyac/arti ...
随机推荐
- JavaScript高级程序设计(九):基本概念----语句的特殊点
一.Label语句.break/continue语句和for循环语句的结合使用: 1.Label语句可以在代码中添加标签,以便将来使用.语法: label:statment eg: start:f ...
- WCF编程系列(一)初识WCF
WCF编程系列(一)初识WCF Windows Communication Foundation(WCF)是微软为构建面向服务的应用程序所提供的统一编程模型.WCF的基本概念: 地址:定义服务的 ...
- RabbitMQ远程访问配置
1 首先创建一个新的账户 并给上Administrator标签 2然后给这个新账户添加虚拟主机访问权限 3在windows 下的 rabbitmq安装文件下的etc文件下的配置文件添加以下 [ ...
- 在ctex环境下利用Metapost作图
使用Metapost作图,是LaTeX的好搭档.下面介绍如何在ctex环境下的使用Metapost作图. 首先新建一个test.mp的Metapost文件. 在文件开始需要声明如下代码: prolog ...
- Linux内核Radix Tree(三):API介绍
1. 单值查找radix_tree_lookup 函数radix_tree_lookup执行查找操作,查找方法是:从叶子到树顶,通过数组索引键值值查看数组元素的方法,一层层地查找slot.其列 ...
- cookie、localStorage、sessionStorage之间的区别
sessionStorage 和 localStorage 是HTML5 Web Storage API 提供的,可以方便的在web请求之间保存数据.有了本地数据,就可以避免数据在浏览器和服务器间不必 ...
- JS拖拽原理
实现拖拽效果主要跟鼠标的三个事件有关: onmousedown : 选择要拖拽的元素 onmousemove : 移动元素 onmouseup : 释放元素 三个事件的关系: obj.onmoused ...
- jQuery中模拟用户操作
有时为了节省不想手动操作网页,但又想看到用户操作时的效果,可以用到jQuery提供的trigger方法.见下图代码 在不点击按钮时仍然想弹出this.value 我们只需要在后面加上.trigger( ...
- 使用weinre通过PC浏览器调试手机网页
Weinre是什么? Weinre代表Web Inspector Remote,是一种远程调试工具.举个例子,在电脑上可以即时的更改手机上对应网页的页面元素.样式表, 或是查看Javascript变量 ...
- 模拟请求之 HTTP_Request2
简单安装: pear install HTTP_Request2 使用例子: <?php require_once 'HTTP/Request2.php'; $request = new HTT ...