标签:
Time Limit: 2000MS | Memory Limit: 30000K | |
Total Submissions: 5939 | Accepted: 2102 | |
Case Time Limit: 1000MS |
Description
F1 --- (13) ---- F6 --- (9) ----- F3
| |
(3) |
| (7)
F4 --- (20) -------- F2 |
| |
(2) F5
|
F7
Input
* Line 1: Two space-separated integers: N and M
* Lines 2..M+1: Each line contains four space-separated entities, F1,
F2, L, and D that describe a road. F1 and F2 are numbers of
two farms connected by a road, L is its length, and D is a
character that is either ‘N‘, ‘E‘, ‘S‘, or ‘W‘ giving the
direction of the road from F1 to F2.
* Line M+2: A single integer, K (1 <= K <= 10,000), the number of FB‘s
queries
* Lines M+3..M+K+2: Each line corresponds to a query from Farmer Bob
and contains three space-separated integers: F1, F2, and I. F1
and F2 are numbers of the two farms in the query and I is the
index (1 <= I <= M) in the data after which Bob asks the
query. Data index 1 is on line 2 of the input data, and so on.
Output
* Lines 1..K: One integer per line, the response to each of Bob‘s
queries. Each line should contain either a distance
measurement or -1, if it is impossible to determine the
appropriate distance.
Sample Input
7 6 1 6 13 E 6 3 9 E 3 5 7 S 4 1 3 N 2 4 20 W 4 7 2 S 3 1 6 1 1 4 3 2 6 6
Sample Output
13 -1 10
Hint
#include<set> #include<map> #include<queue> #include<stack> #include<cmath> #include<string> #include<time.h> #include<vector> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define INF 1000000001 #define ll long long #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 using namespace std; const int MAXN = 40010; struct node { int x; int y; int z; int id; char s[10]; ll ans; }q[10010],a[MAXN]; int pa[MAXN],n,m,k,siz[MAXN]; ll rel[MAXN][2]; void Init() { for(int i = 0; i <= n; i++){ pa[i] = i; siz[i] = 1; } memset(rel,0,sizeof(rel)); } bool cmp1(node fa,node fb) { return fa.z < fb.z; } bool cmp2(node fa,node fb) { return fa.id < fb.id; } void getp(int& x,int& y,node fp,int flag) { if(fp.s[0] == ‘E‘){ x = fp.z; y = 0; } else if(fp.s[0] == ‘W‘){ x = - fp.z; y = 0; } else if(fp.s[0] == ‘S‘){ x = 0; y = fp.z; } else { x = 0; y = - fp.z; } if(flag)x *= -1, y *= -1; } int find(int x) { if(x != pa[x]){ int fx = find(pa[x]); siz[fx] += siz[x]; rel[x][0] = rel[x][0] + rel[pa[x]][0]; rel[x][1] = rel[x][1] + rel[pa[x]][1]; pa[x] = fx; } return pa[x]; } int main() { while(~scanf("%d%d",&n,&m)){ Init(); for(int i = 0; i < m; i++){ scanf("%d%d%d%s",&a[i].x,&a[i].y,&a[i].z,a[i].s); } scanf("%d",&k); for(int i = 0; i < k; i++){ q[i].id = i; scanf("%d%d%d",&q[i].x,&q[i].y,&q[i].z); } sort(q,q+k,cmp1); int p = 0; for(int i = 0; i < m; i++){ int x = a[i].x; int y = a[i].y; int tx = 0,ty = 0; int fx = find(x); int fy = find(y); if(fx != fy){ if(siz[fx] > 1){ getp(tx,ty,a[i],0); siz[fx] += siz[fy]; pa[fy] = fx; rel[fy][0] = -rel[y][0] - tx + rel[x][0]; rel[fy][1] = -rel[y][1] - ty + rel[x][1]; } else { getp(tx,ty,a[i],1); siz[fy] += siz[fx]; pa[fx] = fy; rel[fx][0] = rel[y][0] - tx - rel[x][0]; rel[fx][1] = rel[y][1] - ty - rel[x][1]; } } while(p < k && q[p].z == i + 1){ x = q[p].x; y = q[p].y; fx = find(x); fy = find(y); if(fx != fy){ q[p].ans = -1; } else { // cout<<rel[x][0]<<‘ ‘<<rel[y][0]<<‘ ‘<<rel[x][1]<<‘ ‘<<rel[y][1]<<endl; q[p].ans = fabs(rel[x][0] - rel[y][0]) + fabs(rel[x][1] - rel[y][1]); } p ++; } } sort(q,q+k,cmp2); for(int i = 0; i < k; i++){ printf("%lld\n",q[i].ans); } } return 0; }
标签:
原文地址:http://www.cnblogs.com/sweat123/p/5479192.html