原题:

Description

Mirek有一条每天从他家去大学工作的最喜欢的路。这个路径由若干个部分组成,且每个部分是10米长的直线。每一个部分是直线连接(没有拐弯)上一个部分或垂直连接上一个部分。在走过每一个部分后,Mirek会休息下欣赏美丽的自然景色。在他走路的过程之中,他不会重复访问一个地点

昨天,Mirek在party中熬夜到很迟,并且今天他迟起床了。他意识到他会错过第一堂课除非他改变他平时走的路径。他计划找一条捷径(shortcut)但他希望捷径尽量的短。捷径必须是水平的或者是垂直的并且连接两个Mirek原先路径的休息的地点。

请帮助Mirek找到最短的捷径。

Task

写一个程序:

读入Mirek的路径,计算路径上面最短的捷径,输出结果。

Input

第一行包含一个整数n(3<=n<=250000)作为路径的部分的个数。第二行包含一组长度为n的序列,每个字母为N,E,S或W,

之间没有空格。每一个字母描述路径的一个部分。字母N,E,S或W表示Mirek向这些方向走了10米。你可以假设至少存在一个捷径。

Output

第一行也就是唯一的一行包括 l,b,e 3个整数和一个字母d,用空格隔开。整型变量l是最短的捷径(以长度10为单位)。整数b和e是休息点的编号,也就是捷径的起点和终点(Mirek的home的编号为0,大学的编号为n)。字母d是捷径的方向。如果有超过1条最短的捷径存在,你应该输出起点最小的,如果有多个捷径最短,起点相同的捷径,你应该输出终点编号最大的。

Sample Input(shortcut.in)

12

NNNENNWWWSSW

Sample Output(shortcut.out)

2 3 11 W

题目满足:

45%的数据n<=1000

100%的数据n<=250000

时限 2s

首先我们要理解shortcut的含义,他是一条在网格上的线段,且不与路径重合

然后我们想到了一个性质,即判断2点之间有无路径及判断点的指针与另一点的指针的差是否为1,若为1则为路径

然后就可以扫描线扫描点+统计答案。做2次即可

下面贴代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#define inf 0x3f3f3f3f
using namespace std;
int point[][];
int sorted[];
int n,bestlen,bestbeg,bestend;
bool cmp(int a,int b){return (point[a][]<point[b][])||((point[a][]==point[b][])&&(point[a][]<point[b][]));}
bool cmp2(int a,int b){return (point[a][]<point[b][])||((point[a][]==point[b][])&&(point[a][]<point[b][]));}
void sort1(int step)
{
for(int i=;i<=n;i++)
sorted[i]=i;
sort(sorted,sorted+n+,step==?cmp:cmp2);
}
void solve(int step){
sort1(step);
for(int i=;i<=n;i++)
{
if(point[sorted[i-]][step]==point[sorted[i]][step])
{
int len=abs(point[sorted[i-]][-step]-point[sorted[i]][-step]);
int b=sorted[i-]<sorted[i]?sorted[i-]:sorted[i];
int e=b==sorted[i-]?sorted[i]:sorted[i-];
if(e-b!=)
if((len<bestlen)||(len==bestlen&&b<bestbeg)||((len==bestlen)&&(b==bestbeg)&&(e>bestend)))
bestlen=len,bestbeg=b,bestend=e;
}
}
}
int main(){
freopen("shortcut.in","r",stdin);
freopen("shortcut.out","w",stdout);
bestbeg=n+;bestend=-;bestlen=inf;
scanf("%d",&n);
int x=,y=;
char ch[];
scanf("%s",ch);
point[][]=;point[][]=;
for(int i=;i<n;i++)
{
if(ch[i]=='N')++y;
else if(ch[i]=='S')--y;
else if(ch[i]=='W')--x;
else ++x;
point[i+][]=x;point[i+][]=y;
}
solve();
solve();
char ans;
if(point[bestbeg][]==point[bestend][])ans=point[bestbeg][]<point[bestend][]?'N':'S';
else ans=point[bestbeg][]<point[bestend][]?'E':'W';
printf("%d %d %d %c\n",bestlen,bestbeg,bestend,ans);
return ;
fclose(stdin);
fclose(stdout);
}

shortcut(NOIP模拟赛)(裸的排序)的更多相关文章

  1. 【BZOJ 2957】楼房重建&&Codechef COT5 Count on a Treap&&【NOIP模拟赛】Weed 线段树的分治维护

    线段树是一种作用于静态区间上的数据结构,可以高效查询连续区间和单点,类似于一种静态的分治.他最迷人的地方在于“lazy标记”,对于lazy标记一般随我们从父区间进入子区间而下传,最终给到叶子节点,但还 ...

  2. NOIP模拟赛 by hzwer

    2015年10月04日NOIP模拟赛 by hzwer    (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...

  3. 队爷的讲学计划 CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的讲学计划 题解:刚开始理解题意理解了好半天,然后发 ...

  4. 队爷的新书 CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的新书 题解:看到这题就想到了 poetize 的封 ...

  5. CH Round #52 - Thinking Bear #1 (NOIP模拟赛)

    A.拆地毯 题目:http://www.contesthunter.org/contest/CH%20Round%20%2352%20-%20Thinking%20Bear%20%231%20(NOI ...

  6. NOIP模拟赛-2018.11.6

    NOIP模拟赛 今天想着反正高一高二都要考试,那么干脆跟着高二考吧,因为高二的比赛更有技术含量(我自己带的键盘放在这里). 今天考了一套英文题?发现阅读理解还是有一些困难的. T1:有$n$个点,$m ...

  7. NOI.AC NOIP模拟赛 第五场 游记

    NOI.AC NOIP模拟赛 第五场 游记 count 题目大意: 长度为\(n+1(n\le10^5)\)的序列\(A\),其中的每个数都是不大于\(n\)的正整数,且\(n\)以内每个正整数至少出 ...

  8. NOI.AC NOIP模拟赛 第一场 补记

    NOI.AC NOIP模拟赛 第一场 补记 candy 题目大意: 有两个超市,每个超市有\(n(n\le10^5)\)个糖,每个糖\(W\)元.每颗糖有一个愉悦度,其中,第一家商店中的第\(i\)颗 ...

  9. NOI.AC NOIP模拟赛 第四场 补记

    NOI.AC NOIP模拟赛 第四场 补记 子图 题目大意: 一张\(n(n\le5\times10^5)\)个点,\(m(m\le5\times10^5)\)条边的无向图.删去第\(i\)条边需要\ ...

  10. NOI.AC NOIP模拟赛 第三场 补记

    NOI.AC NOIP模拟赛 第三场 补记 列队 题目大意: 给定一个\(n\times m(n,m\le1000)\)的矩阵,每个格子上有一个数\(w_{i,j}\).保证\(w_{i,j}\)互不 ...

随机推荐

  1. 浅谈UWB(超宽带)室内定位技术(转载)

    技术背景 随着无线通信技术的发展和数据处理能力的提高,基于位置的服务成为最有前途的互联网业务之一.无论移动在室内还是室外环境下,快速准确地获得移动终端的位置信息和提供位置服务的需求变得日益迫切.通信和 ...

  2. openwrt(二) 配置openwrt及编译

    导航 1. 配置openwrt 2. 编译openwrt 3. 错误记录 1. 配置openwrt 在openwrt的根目录下,执行make menuconfig. 这个界面我也只是了解了这两个选项而 ...

  3. VIM安装YCM插件

    折腾了两天,终于好了 1.配置VIM (1)下载相关插件 sudo apt-get install git sudo apt-get install build-essential cmake sud ...

  4. SGU 169 numbers 数学

    169.Numbers Let us call P(n) - the product of all digits of number n (in decimal notation). For exam ...

  5. ESP-01S-ESP8266入门教程

    1.模块实物 2.引脚说明 3.连接说明,按下图将引脚连接到PC的串口(VCC接3V,GND接地,TX接串口TX,RX接串口的RX,CH_PD接3V,否则wifi不工作) 4.通过该PC串口配置WiF ...

  6. PHP.34-TP框架商城应用实例-后台10-商品分类-需求分析、创建无限级商品分类,递归

    商品管理需求分析 1.实现商品无限级分类管理[类似京东三级分类] 2.添加商品时要指定商品属于一个主分类和多个扩展分类[扩展分类可以是其他主分类] 3.商品列表中可以根据分类搜索商品 a) 搜索一个分 ...

  7. sublimeText3快捷键

      Ctrl+Shift+P:打开命令面板Ctrl+P:搜索项目中的文件Ctrl+G:跳转到第几行Ctrl+W:关闭当前打开文件Ctrl+Shift+W:关闭所有打开文件Ctrl+Shift+V:粘贴 ...

  8. Kinect关于PlayerIndex和SkeletonId之间的关系。

    项目中要锁定玩家骨骼后抠图, 一时没有灵感.google 关键词: the ralationship about skeletonid and playerindex. 结论: Player Segm ...

  9. 最“高大上”的Spring测试:Spring Test

    我想给大家介绍一款非常实用.且高端大气上档次的spring测试,在这里,我要强烈推荐使用Spring的Test Context框架,为什么呢?俗话说,“货比三家不上当”,要搞清楚这个问题,我们先来看一 ...

  10. USACO Section2.1 Hamming Codes 解题报告 【icedream61】

    hamming解题报告----------------------------------------------------------------------------------------- ...