zoukankan      html  css  js  c++  java
  • POJ 1984

    我做过的最棘手的一道题了,不是因为难,难就是不懂,而是因为明明思路对了,却调了很久程序没发现自己哪错了。。。。。就连样例都不过

    操,别人的代码::::::::::::::::::::::::::::...。。。

    突然醒悟了,好像在坐标转换时错了。注意哦,坐标转换的方法。。。

    坑了我一晚上。。

    #include <cstdio> 
    #include <iostream> 
    #include <cstring>  
    #include <cctype>  
    #include <algorithm>  
    #define LL unsigned __int64
    using namespace std; 
    
    const int N=  40100;
    
    int pre[N],rank[N];
    struct Edge{
    	int u,v,c;
    	char dir;
    }edge[N];
    struct Quest{
    	int u,v;
    	int index,idp;
    	bool operator <(const Quest &a)const{
    		if(index<a.index) return true;
    		return false;
    	}
    }qask[N/4];
    struct Node{
    	int dx,dy;
    }node[N];
    int ans[N];
    int n,m,qk;
    
    int findx(int x){
        int r=x;
        int tx=node[x].dx,ty=node[x].dy;
        while(pre[r]!=-1){
    	    r=pre[r];
    	    tx+=node[r].dx;
    	    ty+=node[r].dy;
        }
        int dtx,dty,q;
        while(x!=r){
    	    q=pre[x];
    	    dtx=node[x].dx,dty=node[x].dy;
    	    node[x].dx=tx,node[x].dy=ty;
    	    pre[x]=r;
    	    tx-=dtx,ty-=dty;
        	x=q;
        }
    	return r;   
    }
    
    void Union(int u,int v,int k){
    	int uf=findx(u);
    	int vf=findx(v);
    	pre[uf]=vf;
    	node[uf].dx=node[v].dx-node[u].dx;
    	node[uf].dy=node[v].dy-node[u].dy;
    	switch(edge[k].dir){
    		case 'N':node[uf].dy+=edge[k].c; break;
    		case 'S':node[uf].dy-=edge[k].c; break;
    		case 'W':node[uf].dx+=edge[k].c; break;
    		case 'E':node[uf].dx-=edge[k].c; break;
    	}
    }
    
    void work(){
    	int li=0,root1,root2;
    	for(int i=0;i<qk;i++){
    		for(int k=li;k<qask[i].index&&k<m;k++){
    			Union(edge[k].u,edge[k].v,k);
    		}
    		root1=findx(qask[i].u);
    		root2=findx(qask[i].v);
    		if(root1!=root2){
    			ans[qask[i].idp]=-1;
    		}
    		else {
    			int a=abs(node[qask[i].u].dx-node[qask[i].v].dx);
    			int b=abs(node[qask[i].u].dy-node[qask[i].v].dy);
    			ans[qask[i].idp]=a+b;
    		}
    		li=qask[i].index;
    	}
    }
    
    int main(){
    	while(scanf("%d%d",&n,&m)!=EOF){
    		for(int i=1;i<=n;i++){
    			pre[i]=-1;
    			node[i].dx=node[i].dy=0;
    		}
    		for(int i=0;i<m;i++){
    			scanf("%d %d %d %c",&edge[i].u,&edge[i].v,&edge[i].c,&edge[i].dir);
    		}
    		scanf("%d",&qk);
    		for(int i=0;i<qk;i++){
    			scanf("%d%d%d",&qask[i].u,&qask[i].v,&qask[i].index);
    			qask[i].idp=i;
    		}
    		sort(qask,qask+qk);
    		work();
    		for(int i=0;i<qk;i++)
    		printf("%d
    ",ans[i]);
    	}
    	return 0;
    }
    

      

  • 相关阅读:
    将SVD应用于推荐系统
    matrix.A
    机架感知配置
    PCA主成分分析进行数据降维
    Rabbitmq的高级特性
    Topics(主题模式)
    Routing(exchange--direct)
    fanout(Publish/Subscribe)发布/订阅
    Work Queues(工作队列)
    simple queue(简单队列)
  • 原文地址:https://www.cnblogs.com/jie-dcai/p/4328606.html
Copyright © 2011-2022 走看看