码迷,mamicode.com
首页 > 其他好文 > 详细

【HDOJ】4400 Mines

时间:2015-12-19 16:34:12      阅读:240      评论:0      收藏:0      [点我收藏+]

标签:

(1) KD树,但实际没有STL快,3000+

  1 /* 4400 */
  2 #include <iostream>
  3 #include <string>
  4 #include <map>
  5 #include <queue>
  6 #include <set>
  7 #include <stack>
  8 #include <vector>
  9 #include <deque>
 10 #include <algorithm>
 11 #include <cstdio>
 12 #include <cmath>
 13 #include <ctime>
 14 #include <cstring>
 15 #include <climits>
 16 #include <cctype>
 17 #include <cassert>
 18 #include <functional>
 19 #include <iterator>
 20 #include <iomanip>
 21 using namespace std;
 22 //#pragma comment(linker,"/STACK:102400000,1024000")
 23 
 24 #define sti                set<int>
 25 #define stpii            set<pair<int, int> >
 26 #define mpii            map<int,int>
 27 #define vi                vector<int>
 28 #define pii                pair<int,int>
 29 #define vpii            vector<pair<int,int> >
 30 #define rep(i, a, n)     for (int i=a;i<n;++i)
 31 #define per(i, a, n)     for (int i=n-1;i>=a;--i)
 32 #define clr                clear
 33 #define pb                 push_back
 34 #define mp                 make_pair
 35 #define fir                first
 36 #define sec                second
 37 #define all(x)             (x).begin(),(x).end()
 38 #define SZ(x)             ((int)(x).size())
 39 #define lson            l, mid, rt<<1
 40 #define rson            mid+1, r, rt<<1|1
 41 
 42 typedef struct Point_t {
 43     int x, y, d, id;
 44 
 45     Point_t() {}
 46     Point_t(int x, int y, int d, int id):
 47         x(x), y(y), d(d), id(id) {}
 48 
 49 } Point_t;
 50 
 51 typedef struct node_t{
 52     int axis;
 53     int id;
 54     int l, r;
 55 } node_t;
 56 
 57 const int maxn = 1e5+5;
 58 Point_t P[maxn];
 59 node_t nd[maxn];
 60 bool visit[maxn];
 61 int Q[maxn];
 62 int L, head, tail;
 63 
 64 bool compx(const Point_t& a, const Point_t& b) {
 65     return a.x < b.x;
 66 }
 67 
 68 bool compy(const Point_t& a, const Point_t& b) {
 69     return a.y < b.y;
 70 }
 71 
 72 bool compid(const Point_t& a, const Point_t& b) {
 73     return a.id < b.id;
 74 }
 75 
 76 int newNode() {
 77     ++L;
 78     nd[L].l = nd[L].r = 0;
 79 
 80     return L;
 81 }
 82 
 83 int create(int l, int r, int d) {
 84     if (l > r)    return 0;
 85 
 86     int rt = newNode();
 87     nd[rt].axis = d & 1;
 88     if (l == r) {
 89         nd[rt].id = P[l].id;
 90         return rt;
 91     }
 92 
 93     if (d & 1) {
 94         sort(P+l, P+r+1, compy);
 95     } else {
 96         sort(P+l, P+r+1, compx);
 97     }
 98 
 99     int mid = (l + r) >> 1;
100 
101     nd[rt].id = P[mid].id;
102     nd[rt].l = create(l, mid-1, d+1);
103     nd[rt].r = create(mid+1, r, d+1);
104 
105     return rt;
106 }
107 
108 int Distance(int i, int j) {
109     return abs(P[i].x-P[j].x) + abs(P[i].y-P[j].y);
110 }
111 
112 void search(int rt, int kth) {
113     if (rt == 0)
114         return ;
115 
116     int i, j, k;
117     int id = nd[rt].id;
118     int dis = Distance(id, kth);
119 
120     if (dis <= P[kth].d) {
121         if (!visit[id]) {
122             visit[id] = true;
123             Q[tail++] = id;
124         }
125     }
126 
127     if (nd[rt].axis) {
128         // y
129         if (dis <= P[kth].d) {
130             search(nd[rt].l, kth);
131             search(nd[rt].r, kth);
132         } else {
133             int dy = abs(P[id].y - P[kth].y);
134             if (dy > P[kth].d) {                
135                 if (P[id].y <= P[kth].y)
136                     search(nd[rt].r, kth);
137                 else
138                     search(nd[rt].l, kth);
139             } else {
140                 search(nd[rt].l, kth);
141                 search(nd[rt].r, kth);
142             }
143         }
144 
145     } else {
146 
147         // x
148         if (dis <= P[kth].d) {
149             search(nd[rt].l, kth);
150             search(nd[rt].r, kth);
151         } else {
152             int dx = abs(P[id].x - P[kth].x);
153             if (dx > P[kth].d) {                
154                 if (P[id].x <= P[kth].x)
155                     search(nd[rt].r, kth);
156                 else
157                     search(nd[rt].l, kth);
158             } else {
159                 search(nd[rt].l, kth);
160                 search(nd[rt].r, kth);
161             }
162         }
163     }
164 }
165 
166 void init() {
167     L = 0;
168     memset(visit, false, sizeof(visit));
169 }
170 
171 int solve(int rt, int k) {
172     if (visit[k])
173         return 0;
174 
175     head = tail = 0;
176     visit[k] = true;
177     Q[tail++] = k;
178 
179     while (head < tail) {
180         search(rt, Q[head++]);
181     }
182 
183     return tail;
184 }
185 
186 int main() {
187     ios::sync_with_stdio(false);
188     #ifndef ONLINE_JUDGE
189         freopen("data.in", "r", stdin);
190         freopen("data.out", "w", stdout);
191     #endif
192 
193     int t = 0;
194     int n, q;
195     int kth, ans;
196 
197     while (scanf("%d", &n)!=EOF && n) {
198         rep(i, 0, n) {
199             scanf("%d %d %d", &P[i].x, &P[i].y, &P[i].d);
200             P[i].id = i;
201         }
202         init();
203         int rt = create(0, n-1, 0);
204         sort(P, P+n, compid);
205         scanf("%d", &q);
206         printf("Case #%d:\n", ++t);
207         while (q--) {
208             scanf("%d", &kth);
209             ans = solve(rt, kth-1);
210             printf("%d\n", ans);
211         }
212     }
213 
214 
215     #ifndef ONLINE_JUDGE
216         printf("time = %d.\n", (int)clock());
217     #endif
218 
219     return 0;
220 }

(2) STL 1400+

  1 /* 4400 */
  2 #include <iostream>
  3 #include <string>
  4 #include <map>
  5 #include <queue>
  6 #include <set>
  7 #include <stack>
  8 #include <vector>
  9 #include <deque>
 10 #include <algorithm>
 11 #include <cstdio>
 12 #include <cmath>
 13 #include <ctime>
 14 #include <cstring>
 15 #include <climits>
 16 #include <cctype>
 17 #include <cassert>
 18 #include <functional>
 19 #include <iterator>
 20 #include <iomanip>
 21 using namespace std;
 22 //#pragma comment(linker,"/STACK:102400000,1024000")
 23 
 24 #define sti                set<int> 
 25 #define stpii            set<pair<int, int> > 
 26 #define mpii            map<int,int> 
 27 #define vi                vector<int> 
 28 #define pii                pair<int,int> 
 29 #define vpii            vector<pair<int,int> > 
 30 #define rep(i, a, n)     for (int i=a;i<n;++i)
 31 #define per(i, a, n)     for (int i=n-1;i>=a;--i)
 32 #define clr                clear
 33 #define pb                 push_back
 34 #define mp                 make_pair
 35 #define fir                first
 36 #define sec                second
 37 #define all(x)             (x).begin(),(x).end()
 38 #define SZ(x)             ((int)(x).size())
 39 #define lson            l, mid, rt<<1
 40 #define rson            mid+1, r, rt<<1|1
 41 
 42 typedef struct node_t {
 43     int x, y, d;
 44     
 45     node_t() {}
 46     node_t(int x, int y, int d):
 47         x(x), y(y), d(d) {}
 48         
 49     friend bool operator< (const node_t& a, const node_t& b) {
 50         return a.y < b.y;
 51     }
 52     
 53 } node_t;
 54 
 55 typedef struct {
 56     int y, id;
 57 } pair_t;
 58 
 59 const int maxn = 1e5+5;
 60 int X[maxn];
 61 bool visit[maxn];
 62 node_t nd[maxn];
 63 vector< pii > vc[maxn];
 64 int n, m;
 65 
 66 bool comp(const node_t& a, const node_t& b) {
 67     return a.y < b.y;
 68 }
 69 
 70 void init() {
 71     memset(visit, false, sizeof(visit));
 72     
 73     rep(i, 0, n) {
 74         X[i] = nd[i].x;
 75         vc[i].clr();
 76     }
 77     
 78     sort(X, X+n);
 79     m = unique(X, X+n) - X;
 80     node_t tmp;
 81     
 82     rep(i, 0, n) {
 83         int id = lower_bound(X, X+m, nd[i].x) - X;
 84         vc[id].pb(mp(nd[i].y, i));
 85     }
 86     
 87     rep(i, 0, m)
 88         sort(all(vc[i]));
 89 }
 90 
 91 int bfs(int kth) {
 92     if (visit[kth])
 93         return 0;
 94     
 95     int ret = 1;
 96     int x, y, dx, dy;
 97     int lx, rx, ly, ry;
 98     int id, xid;
 99     vector< pii >::iterator iter, liter, riter;
100     queue<int> Q;
101     pii p;
102     
103     visit[kth] = true;
104     Q.push(kth);
105     p.sec = -1;
106     
107     while (!Q.empty()) {
108         kth = Q.front();
109         Q.pop();
110         id = lower_bound(X, X+m, nd[kth].x) - X;
111         lx = lower_bound(X, X+m, nd[kth].x - nd[kth].d) - X;
112         rx = upper_bound(X, X+m, nd[kth].x + nd[kth].d) - X;;
113         for (xid=lx; xid<rx; ++xid) {
114             x = X[xid];
115             dx = abs(x - nd[kth].x);
116             dy = nd[kth].d - dx;
117             ly = nd[kth].y - dy;
118             ry = nd[kth].y + dy;
119             
120             // find lower_bound
121             p.fir = ly;
122             p.sec = -1;
123             liter = lower_bound(all(vc[xid]), p);
124             
125             // find upper_bound
126             p.fir = ry;
127             p.sec = maxn;
128             riter = upper_bound(all(vc[xid]), p);
129             
130             for (iter=liter; iter!=riter; ++iter) {
131                 int k = iter->sec;
132                 if (!visit[k]) {
133                     visit[k] = true;
134                     ++ret;
135                     Q.push(k);
136                 }
137             }
138             
139             // vc[xid].erase(liter, riter);
140         }
141     }
142     
143     return ret;
144 }
145 
146 int main() {
147     ios::sync_with_stdio(false);
148     #ifndef ONLINE_JUDGE
149         freopen("data.in", "r", stdin);
150         freopen("data.out", "w", stdout);
151     #endif
152     
153     int q;
154     int t = 0;
155     int ans;
156     
157     while (scanf("%d", &n)!=EOF && n) {
158         rep(i, 0, n)
159             scanf("%d %d %d", &nd[i].x, &nd[i].y, &nd[i].d);
160         init();
161         scanf("%d", &q);
162         printf("Case #%d:\n", ++t);
163         int kth;
164         while (q--) {
165             scanf("%d", &kth);
166             --kth;
167             ans = bfs(kth);
168             printf("%d\n", ans);
169         }
170     }
171     
172     #ifndef ONLINE_JUDGE
173         printf("time = %d.\n", (int)clock());
174     #endif
175     
176     return 0;
177 }

 

【HDOJ】4400 Mines

标签:

原文地址:http://www.cnblogs.com/bombe1013/p/5059284.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!