当前位置: 首页 > news >正文

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\n",ans[i]);
	}
	return 0;
}

  

 

转载于:https://www.cnblogs.com/jie-dcai/p/4328606.html

相关文章:

  • Ubuntu 配置开机启动到字符界面
  • 【监控】天机镜——优土大数据平台应用级别监控利器
  • Webpack - CommonJs AMD 模块打包器
  • 浅谈Swift语法
  • 开通博客园
  • 简谈软件测试
  • Android更新UI的五种方式
  • 构造函数实例化
  • Lintcode: Merge Sorted Array II
  • C++ 常量类型 const 详解
  • 创建非arc的项目
  • processing fill()和stroke()函数
  • C++移位运算符
  • Android 如何通过 Windows 录制视频
  • 利用Excel批量高速发送电子邮件
  • 【笔记】你不知道的JS读书笔记——Promise
  • CSS实用技巧干货
  • JS 面试题总结
  • Map集合、散列表、红黑树介绍
  • Object.assign方法不能实现深复制
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 高程读书笔记 第六章 面向对象程序设计
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • 警报:线上事故之CountDownLatch的威力
  • 每个JavaScript开发人员应阅读的书【1】 - JavaScript: The Good Parts
  • 网页视频流m3u8/ts视频下载
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • ​sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块​
  • #DBA杂记1
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (2)nginx 安装、启停
  • (C语言)球球大作战
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • (转)C#开发微信门户及应用(1)--开始使用微信接口
  • .NET 8.0 发布到 IIS
  • .NET版Word处理控件Aspose.words功能演示:在ASP.NET MVC中创建MS Word编辑器
  • @hook扩展分析
  • [ 云计算 | AWS 实践 ] Java 如何重命名 Amazon S3 中的文件和文件夹
  • [20170705]diff比较执行结果的内容.txt
  • [Angularjs]ng-select和ng-options
  • [APUE]进程关系(下)
  • [BZOJ4016][FJOI2014]最短路径树问题
  • [C/C++] C/C++中数字与字符串之间的转换
  • [C++提高编程](三):STL初识
  • [codevs 1288] 埃及分数 [IDdfs 迭代加深搜索 ]
  • [CVPR 2023:3D Gaussian Splatting:实时的神经场渲染]
  • [IE编程] WebBrowser控件的多页面浏览(Tabbed Browsing)开发接口
  • [IE编程] 如何设置IE8的WebBrowser控件(MSHTML) 的渲染模式
  • [leetcode 189][轮转数组]
  • [mysql]游标和触发器
  • [Notice] 朋友们,blog更新http://jiang-hongfei.spaces.live.com
  • [ORM]register db Ping `default`, Error 1130: Host '' is not allow connect to this MySQL server