zoukankan      html  css  js  c++  java
  • POJ 1984 Navigation Nightmare

    题目

    Farmer John's pastoral neighborhood has N farms (2 <= N <= 40,000), usually numbered/labeled 1..N. A series of M (1 <= M < 40,000) vertical and horizontal roads each of varying lengths (1 <= length <= 1000) connect the farms. A map of these farms might look something like the illustration below in which farms are labeled F1..F7 for clarity and lengths between connected farms are shown as (n):

               F1 --- (13) ---- F6 --- (9) ----- F3
    
    | |
    (3) |
    | (7)
    F4 --- (20) -------- F2 |
    | |
    (2) F5
    |
    F7


    Being an ASCII diagram, it is not precisely to scale, of course.

    Each farm can connect directly to at most four other farms via roads that lead exactly north, south, east, and/or west. Moreover, farms are only located at the endpoints of roads, and some farm can be found at every endpoint of every road. No two roads cross, and precisely one path
    (sequence of roads) links every pair of farms.

    FJ lost his paper copy of the farm map and he wants to reconstruct it from backup information on his computer. This data contains lines like the following, one for every road:

    There is a road of length 10 running north from Farm #23 to Farm #17
    There is a road of length 7 running east from Farm #1 to Farm #17
    ...

    As FJ is retrieving this data, he is occasionally interrupted by questions such as the following that he receives from his navigationally-challenged neighbor, farmer Bob:

    What is the Manhattan distance between farms #1 and #23?

    FJ answers Bob, when he can (sometimes he doesn't yet have enough data yet). In the example above, the answer would be 17, since Bob wants to know the "Manhattan" distance between the pair of farms.
    The Manhattan distance between two points (x1,y1) and (x2,y2) is just |x1-x2| + |y1-y2| (which is the distance a taxicab in a large city must travel over city streets in a perfect grid to connect two x,y points).

    When Bob asks about a particular pair of farms, FJ might not yet have enough information to deduce the distance between them; in this case, FJ apologizes profusely and replies with "-1".

    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

    At time 1, FJ knows the distance between 1 and 6 is 13.
    At time 3, the distance between 1 and 4 is still unknown.
    At the end, location 6 is 3 units west and 7 north of 2, so the distance is 10.

    题解

    仍然是带权并查集……

    不过这次是用两个带权并查集,而且还要离线操作

    把并查集封装成struct用起来很方便……

    直接开int就能过

    AC代码

    //#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<cctype>
    using namespace std;
    
    #define REP(r,x,y) for(register int r=(x); r<(y); r++)
    #define PER(r,x,y) for(register int r=(x); r>(y); r--)
    #define REPE(r,x,y) for(register int r=(x); r<=(y); r++)
    #define PERE(r,x,y) for(register int r=(x); r>=(y); r--)
    #ifdef sahdsg
    #define DBG(...) printf(__VA_ARGS__)
    #else
    #define DBG(...) (void)0
    #endif
    
    #define MAXN 1000007
    template <class T>
    inline void read(T& x) {
    	char c=getchar();
    	int f=1;
    	x=0;
    	while(!isdigit(c)&&c!='-')c=getchar();
    	if(c=='-')f=-1,c=getchar();
    	while(isdigit(c)) {
    		x=x*10+c-'0';
    		c=getchar();
    	}
    	x*=f;
    }
    struct info {
    	int f1,f2,l;
    	char d;
    } infos[40007];
    struct que {
    	int f1,f2,i,id;
    } ques[10007];
    int ans[10007];
    inline bool cmp(const que &l, const que &r) {
    	return l.i<r.i;
    }
    int head[40007];
    int m,n,k;
    struct uset {
    	int fa[40007],fav[40007];
    	inline void initfa(int x) {
    		REPE(i,0,x) fa[i]=i;
    		memset(fav,0,sizeof fav);
    	}
    	inline int findfa(int x) {
    		int t = x, p, v=0;
    		while(t!=fa[t]) {
    			v+=fav[t];
    			t=fa[t];
    		}
    		while(x!=t) {
    			int k=v;
    			p = fa[x];
    			fa[x] = t;
    			v -= fav[x];
    			fav[x]=k;
    			x = p;
    		}
    		return t;
    	}
    	inline void uu(int l, int r, int v) {
    		int f1=findfa(l), f2=findfa(r);
    		fa[f1]=f2;
    		fav[f1]=-fav[l]+fav[r]+v;
    	}
    	inline int getdis(int l, int r, bool &suc) {
    		int f1=findfa(l), f2=findfa(r);
    		if(f1!=f2) {suc=false; return -1;}
    		suc=true;
    		return fav[l]-fav[r];
    	}
    	uset(int x) {
    		initfa(x);
    	}
    };
    inline int iabs(int x) {return x<0?-x:x;}
    int main() {
    #ifdef sahdsg
    	freopen("in.txt", "r", stdin);
    #endif
    	read(n);
    	read(m);
    	REPE(i,1,m) {
    		scanf("%d%d%d %c", &infos[i].f1, &infos[i].f2, &infos[i].l, &infos[i].d);
    	}
    	read(k);
    	REPE(i,1,k) {
    		scanf("%d%d%d", &ques[i].f1, &ques[i].f2, &ques[i].i);
    		ques[i].id=i;
    	}
    	sort(ques,ques+k,cmp);
    	memset(head,-1,sizeof head);
    	REPE(i,1,k) {
    		int tom=ques[i].i;
    		if(head[tom]<0) head[tom]=i;
    	}
    	uset setn(n), setw(n);
    	REPE(i,1,m) {
    		info &now = infos[i];
    		switch(now.d) {
    			case 'S': now.l=-now.l;
    			case 'N': setn.uu(now.f1,now.f2,now.l);setw.uu(now.f1,now.f2,0); break;
    			case 'E': now.l=-now.l;
    			case 'W': setw.uu(now.f1,now.f2,now.l);setn.uu(now.f1,now.f2,0); break;
    		}
    		for(int j=head[i];j>=0 && j<=k && ques[j].i==i;j++) {
    			bool sucnw; int disnw=setn.getdis(ques[j].f1,ques[j].f2,sucnw);
    			bool sucwe; int diswe=setw.getdis(ques[j].f1,ques[j].f2,sucwe);
    			if(sucnw && sucnw) {
    				ans[ques[j].id]=iabs(disnw)+iabs(diswe);
    			} else {
    				ans[ques[j].id]=-1;
    			}
    		}
    	}
    	REPE(i,1,k) {
    		printf("%d
    ", ans[i]);
    	}
    	return 0;
    }
    
  • 相关阅读:
    删除Tomcat服务及其它注意
    下拉菜单被js图片挡住
    There are no resources that can be added or removed from the server
    Mysql存中文值乱码
    myeclipse的项目导入到eclipse下,com.sun.org.apache.commons.beanutils.BeanUtils不能导入
    No enclosing instance of type E is accessible. Must qualify the allocation with an enclosing
    winServer2003除默认端口外的其他端口只能本地访问,关闭防火墙即可
    Oracle 11.2.0.3 on windows 2008 r2
    windows2008 r2 卸载GI
    初始化参数(Initialization Parameter)知识合集 based on 11g
  • 原文地址:https://www.cnblogs.com/sahdsg/p/10581053.html
Copyright © 2011-2022 走看看