(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. MySQL备份方案

    下面将分别模拟不同场景数据库宕机解决方案:这里应用到的技术分别为innobackuper及binlog日志来进入还原数据 一.主从库情况下(为了不影响主库的性能,备份都放在从库上进行)当主库宕机时,如 ...

  2. (十)Hibernate 查询方式

     所有项目导入对应的hibernate的jar包.mysql的jar包和添加每次都需要用到的HibernateUtil.java 第一节:Hibernate 查询方式简介 1,导航对象图查询方式: 2 ...

  3. hibernate的dao操作不能提交到数据库问题的解决

    刚学的时候总是各种错误,解决方法也无厘头的很 将UserDAO里面的的save方法修改try { getSession().save(transientInstance); log.debug(&qu ...

  4. 【制作镜像Win*】特殊配置

    下载disk.config: wget http://10.254.3.75/images/configdrive/disk.config 修改libvirt.xml,更换cdrom为disk.con ...

  5. 生产者-消费者模型的3种Java实现:synchronized,signal/notifyAll及BlockingQueue

    我的技术博客经常被流氓网站恶意爬取转载.请移步原文:http://www.cnblogs.com/hamhog/p/3555111.html,享受整齐的排版.有效的链接.正确的代码缩进.更好的阅读体验 ...

  6. java File详解

    一.简介 File类是“文件”和“目录名”的抽象表示形式.因此在java语言中,File类既可以表示文件也可以表示目录. 尽管java.io定义的大多数类是实行流式操作的,而File类则不是,它没有指 ...

  7. Beyond Compare 使用介绍

    Beyond Compare 背景 平时工作中对于源代码都是使用SVN来管理,在线状态下工作的很好,但是有时候离线状态下,对于多个版本之间的代码合并就比较麻烦.尤其是涉及到多人协作时更是如此. 所以找 ...

  8. 捕获ClientDataSet.ApplyUpdates和SocketConnection异常

    核心提示:如何捕获ClientDataSet.ApplyUpdates的错误,不用ReconcileError... var cdsEmp:TClientDataSet; //保存 procedure ...

  9. python 生成排列、组合以及选择

    from <python cookbook> 19.15 任务 需要对一个序列的排列(permutation).组合(combination)或选择(selection)进行迭代操作.即使 ...

  10. 两个不同于LR和jmeter的性能测试工具

    LR图形界面,更利于使用 jmeter采用java,也能够扩展 相对于上两款工具,下面两款性能测试工具都采用了异步IO模型,扩展性都更强速度也更快 gatling:基于scala,速度相比更快性能压力 ...