(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的更多相关文章

  1. 【HDOJ】4729 An Easy Problem for Elfness

    其实是求树上的路径间的数据第K大的题目.果断主席树 + LCA.初始流量是这条路径上的最小值.若a<=b,显然直接为s->t建立pipe可以使流量最优:否则,对[0, 10**4]二分得到 ...

  2. 【HDOJ】【3506】Monkey Party

    DP/四边形不等式 裸题环形石子合并…… 拆环为链即可 //HDOJ 3506 #include<cmath> #include<vector> #include<cst ...

  3. 【HDOJ】【3516】Tree Construction

    DP/四边形不等式 这题跟石子合并有点像…… dp[i][j]为将第 i 个点开始的 j 个点合并的最小代价. 易知有 dp[i][j]=min{dp[i][j] , dp[i][k-i+1]+dp[ ...

  4. 【HDOJ】【3480】Division

    DP/四边形不等式 要求将一个可重集S分成M个子集,求子集的极差的平方和最小是多少…… 首先我们先将这N个数排序,容易想到每个自己都对应着这个有序数组中的一段……而不会是互相穿插着= =因为交换一下明 ...

  5. 【HDOJ】【2829】Lawrence

    DP/四边形不等式 做过POJ 1739 邮局那道题后就很容易写出动规方程: dp[i][j]=min{dp[i-1][k]+w[k+1][j]}(表示前 j 个点分成 i 块的最小代价) $w(l, ...

  6. 【HDOJ】【3415】Max Sum of Max-K-sub-sequence

    DP/单调队列优化 呃……环形链求最大k子段和. 首先拆环为链求前缀和…… 然后单调队列吧<_<,裸题没啥好说的…… WA:为毛手写队列就会挂,必须用STL的deque?(写挂自己弱……s ...

  7. 【HDOJ】【3530】Subsequence

    DP/单调队列优化 题解:http://www.cnblogs.com/yymore/archive/2011/06/22/2087553.html 引用: 首先我们要明确几件事情 1.假设我们现在知 ...

  8. 【HDOJ】【3068】最长回文

    Manacher算法 Manacher模板题…… //HDOJ 3068 #include<cstdio> #include<cstring> #include<cstd ...

  9. 【HDOJ】【1512】Monkey King

    数据结构/可并堆 啊……换换脑子就看了看数据结构……看了一下左偏树和斜堆,鉴于左偏树不像斜堆可能退化就写了个左偏树. 左偏树介绍:http://www.cnblogs.com/crazyac/arti ...

随机推荐

  1. c# 单例模式[Singleton]之深夜闲聊

    都有点记不起认识单例模式(也有叫单件模式的)是在什么时候了,有时候东西认多了不常用的话也经常抛之脑后甚至逐渐从大脑里被移除.不闲扯了,直接入正题吧. 什么是单例模式? 保证在整个应用程序的生命周期中, ...

  2. Ext.Net学习笔记18:Ext.Net 可编辑的GridPanel

    Ext.Net学习笔记18:Ext.Net 可编辑的GridPanel Ext.Net GridPanel 有两种编辑模式:编辑单元格和编辑行. 单元格编辑: 行编辑: 可以看出,单元格编辑的时候,只 ...

  3. java取随机数

    一, 指定的特定几个数据集合里按“随机顺序”全部取出 一碰到随机, 可能第一个想到的是用Math.Random() 来处理, 其实java本身提供了现成的类 通过 “打乱顺序”来处理“随机”问题 方法 ...

  4. ajax和jsonp的封装

    一直在用jQuery的ajax,跨域也是一直用的jQuery的jsonp,jQuery确实很方便,$.ajax({...})就可以搞定. 为了更好的理解ajax和jsonp,又重新看了下书,看了一些博 ...

  5. npm:Node.js的软件包管理器

    npm https://www.npmjs.com/ 2016-08-03

  6. PHPCMS 核心代码与 www 分离部署

    为了满足更多用户二次开发的兴趣与爱好,同时,为了更加安全.可以通过修改入口代码的包含方式来让主程序和www程序分开. 先看下面目录结构: (图1) 我们需要将 phpcms 目录和 index.php ...

  7. python 中函数的参数

    一.python中的函数参数形式 python中函数一般有四种表现形式: 1.def function(arg1, arg2, arg3...) 这种是python中最常见的一中函数参数定义形式,函数 ...

  8. 【加密】RSA加密之算法

    RSA公钥加密算法是1977年由Ron Rivest.Adi Shamirh和LenAdleman在(美国麻省理工学院)开发的. RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥, ...

  9. SSH搭建完美CURD,含分页算法

    今日开始研究使用java平台上的框架解决web服务端的开发. 这是一个完整的SSH实例,在马士兵老师的SSH整合代码基础上,增加用户的增删改查,同时实现structs方式的分页 放出源代码供大家学习参 ...

  10. Oracle数据库插入图片和读取图片

    package com.basicSql.scroll_page; import java.io.File; import java.io.FileInputStream; import java.i ...