首页 > 其他分享 >P1686 挑战 题解

P1686 挑战 题解

时间:2023-07-31 19:45:36浏览次数:36  
标签:捷径 P1686 fx 题解 top ++ nowx nowy 挑战

原题链接

题目大意

\(图上两个x或y值相同的点,如果其没有一条线段直接相连,则这两个点之间的距离为一条捷径\)
\(给定一条路径,求此路径上最短的捷径长度(注意,是捷径最短)以及捷径的起止点和方向\)

数据范围

\(1\le n\le 250000\)
\(先考虑x值相同的情况,假设有3个点A,B,C可以互相构成捷径\)
\(假设A_y>B_y>C_y,则捷径AC<捷径AB,且捷径AC<捷径BC\)
\(所以在x相同的时候,只需按照y值排序,即可使得最短捷径一定在相邻两点之间\)
\(于是可以O(n)求解\)
\(于是贪心方案即为,先把点按x排序,在x相同的时候按y排序\)\

bool cmp1(dian i,dian j)
{
	if(i.x==j.x)
	return i.y<j.y;
	return i.x<j.x;
}

\(可以使用这样的函数加上sort实现\)
\(再考虑y相同的点,其实和x值相同的情况类似,可以用同样方法求解\)
\(复杂度为排序复杂度\)
\(ps:此题要求在捷径长度相同时输出起点编号小的,如果起点编号也相同,则输出终点编号大的,坑死我了\)\

附AC代码
#include<bits/stdc++.h>
using namespace std;
int n,nowx,nowy,top;
struct dian
{
	int x,y,d;
}d[300009];
bool cmp1(dian i,dian j)
{
	if(i.x==j.x)
	return i.y<j.y;
	return i.x<j.x;
}
bool cmp2(dian i,dian j)
{
	if(i.y==j.y)
	return i.x<j.x;
	return i.y<j.y;
}
int len,l,r;
char fx;
int main()
{
	len=1e9;
	cin>>n;
	nowx=nowy=2500000;
	d[++top]={nowx,nowy,0};
	for(int i=1;i<=n;i++)
	{
		char a;
		cin>>a;
		if(a=='N')
		{
			nowy++;
			d[++top]={nowx,nowy,i};
		}
		if(a=='S')
		{
			nowy--;
			d[++top]={nowx,nowy,i};
		}
		if(a=='E')
		{
			nowx++;
			d[++top]={nowx,nowy,i};
		}
		if(a=='W')
		{
			nowx--;
			d[++top]={nowx,nowy,i};
		}
	}
	sort(d+1,d+top+1,cmp1);
	for(int i=2;i<=top;i++)
	{
		if(d[i].x!=d[i-1].x)
		continue;
		if(d[i].y-d[i-1].y<=len)
		{
			if(abs(d[i].d-d[i-1].d)<=1)
			continue;
			if(len==d[i].y-d[i-1].y)
			{
				int ll=d[i-1].d;
				int rr=d[i].d;
				if(ll>rr)
				swap(ll,rr);
				if(ll>l)
				continue;
				if(l==ll&&rr<r)
				continue;
				l=ll;
				r=rr;
				if(d[i].d>d[i-1].d)
				fx='N';
				else
				fx='S';
			}
			else
			{
				len=d[i].y-d[i-1].y;
				l=d[i-1].d;
				r=d[i].d;
				if(d[i].d>d[i-1].d)
				fx='N';
				else
				{
					swap(l,r);
					fx='S';
				}
			}
		}
	}
	sort(d+1,d+top+1,cmp2);
	for(int i=2;i<=top;i++)
	{
		if(d[i].y!=d[i-1].y)
		continue;
		if(d[i].x-d[i-1].x<=len)
		{
			if(abs(d[i].d-d[i-1].d)<=1)
			continue;
			if(len==d[i].x-d[i-1].x)
			{
				int ll=d[i-1].d;
				int rr=d[i].d;
				if(ll>rr)
				swap(ll,rr);
				if(ll>l)
				continue;
				if(l==ll&&rr<r)
				continue;
				l=ll;
				r=rr;
				if(d[i].d>d[i-1].d)
				fx='E';
				else
				fx='W';
			}
			else
			{
				len=d[i].x-d[i-1].x;
				l=d[i-1].d;
				r=d[i].d;
				if(d[i].d>d[i-1].d)
				fx='E';
				else
				{
					swap(l,r);
					fx='W';
				}
			}
		}
	}
	cout<<len<<' '<<l<<' '<<r<<' '<<fx;
	return 0;
}

标签:捷径,P1686,fx,题解,top,++,nowx,nowy,挑战
From: https://www.cnblogs.com/tx-Elysia/p/17594322.html

相关文章

  • 梯度消失:深度学习的挑战
    介绍深度学习使计算机能够从大量数据中学习并做出复杂的决策,从而彻底改变了人工智能领域。这一成功在很大程度上归功于深度神经网络的发展,它能够从数据中学习分层表示。然而,这些网络面临着一个被称为“梯度消失”的重大挑战,这可能会阻碍它们的训练和表现。在本文中,我们将探讨梯度......
  • 人工智能 (AI) 的未来:未来的进步和挑战
    介绍:人工智能(AI)已成为21世纪最具变革性的技术之一。随着人工智能研究和机器学习算法的快速发展,我们站在一个新时代的风口浪尖。在这篇博文中,我们将探讨人工智能的最新突破、机器学习的发展趋势,以及人工智能对各个行业和整个社会的潜在影响。人工智能和机器学习的演变:自成立以来,人工......
  • [JOI 2020 Final] 火事 题解
    题面给定一个长为\(N\)的序列\(S_i\),刚开始为时刻\(0\)。定义\(t\)时刻第\(i\)个数为\(S_i(t)\),那么:\[\left\{\begin{array}{ll}S_0(t)=0\\S_i(0)=S_i\\S_i(t)=\max\{S_{i-1}(t-1),S_i(t-1)\}\end{array}\right.\]共有\(Q\)个询问,每......
  • DASCTF 2023 & 0X401七月暑期挑战赛
    比赛只出了一道,小菜不是罪过-_-controlflow这个题动调到底就行foriinrange(40):after_xor[i]=inp[i]^0x401after_xor[i]+=i*i;foriinrange(11,30,1):x=i-10after_xor[i]^=x*(x+1)foriinrange(40):after_xor[i]-=iafter_xo......
  • 【867】pgAdmin4 无法加载 loading 的问题解决
    ref:LoadingpgAdmin4v7.4...whileopeningpgAdminIhadthesameproblemwheninstallingpgAdminviathepostgresql-15.3-3-windows-x64installer.Solution:uninstallPostgreSQL;reinstallPostgreSQLbutinthecomponentsselection,uncheckPGAdmin;......
  • 【NOIP模拟题】我要的幸福 题解
    1.题意简述\(Zyh\)相信自己想要的幸福在不远处。然而,\(zyh\)想要得到这幸福,还需要很长的一段路。\(Zyh\)坚持认为整个人生可以抽象为一个\(n*m\)的棋盘。左上角的格子为\((1,1)\),右下角的格子为\((n,m)\)。整个棋盘上的格子都有不同的事件,因为生活的多姿多彩,事件的权值......
  • 2009NOIP普及组 题解
    第一题第二题\(一二题太简单就不在此处提了\)\(直接看到\)第三题细胞分裂题目大意\(有m1^{m2}个试管和n种细胞,第i种细胞初始有1个,每过1秒每一个会分裂成a_i个\)\(当有某种细胞可以平均分到试管中时开始实验,求开始实验的\)时间\((顺便说一下,我一开始没看到是时间,以为是求哪......
  • 洛谷-P9485 题解
    写在前面:这是蒟蒻交的第一篇绿题题解(大祭),因为线性做法比较难想,本篇会着重讲述用RMQ问题求解,并尽可能用清晰明了的图片和简易的文字讲明白。正文最坏时间复杂度:\(\mathcal{O}(\sumn+\log\sumn)\)在求解之前,先让我们想个问题,如何求解积水格数?再简单点,对于每个\(i\),其积水......
  • DASCTF 2023 & 0X401七月暑期挑战赛——— 解析viphouse
    DASCTF2023&0X401七月暑期挑战赛———解析viphouse保护策略静态分析main  主函数在while循环提供了一个菜单。void__fastcall__noreturnmain(__int64a1,char**a2,char**a3){charnptr[10];//[rsp+Eh][rbp-12h]BYREFunsigned__int64v4;//[rsp......
  • AcWing 4797. 移动棋子题解
    算出数值为\(1\)的点离\((3,3)\)的距离即可。#include<iostream>#include<cstring>#include<algorithm>usingnamespacestd;intmain(){intpx=-1,py=-1;for(inti=1;i<=5;i++){for(intj=1;j<=5;j++)......