shortcut(NOIP模擬賽)(裸的排序)

2022-05-16 03:52:23 字數 1807 閱讀 1770

原題:

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)

12nnnennwwwssw

sample output(shortcut.out)

2 3 11 w

題目滿足:

45%的資料n<=1000

100%的資料n<=250000

時限 2s

首先我們要理解shortcut的含義,他是一條在網格上的線段,且不與路徑重合

然後我們想到了乙個性質,即判斷2點之間有無路徑及判斷點的指標與另一點的指標的差是否為1,若為1則為路徑

然後就可以掃瞄線掃瞄點+統計答案。做2次即可

下面貼**

#include#include

#include

#define inf 0x3f3f3f3f

using

namespace

std;

int point[250005][2

];int sorted[250005

];int

n,bestlen,bestbeg,bestend;

bool cmp(int a,int b)

bool cmp2(int a,int b)

void sort1(int

step)

void solve(int

step)

}}int

main()

solve(0);

solve(1);

char

ans;

if(point[bestbeg][0]==point[bestend][0])ans=point[bestbeg][1]1]?'

n':'s'

;

else ans=point[bestbeg][0]0]?'

e':'w'

; printf(

"%d %d %d %c\n

",bestlen,bestbeg,bestend,ans);

return0;

fclose(stdin);

fclose(stdout);

}

《省賽模擬賽補》

c題 比賽的時候已經想到了統計最底層的每個序列的出現次數,但是一開始想的是建圖之後dfs處理,但是發現很難處理出來。其實正確的思路是拓撲排序去處理次數。我們在最後建圖完成之後,倒著從n回去拓撲即可。但是這裡有個坑點,就是一開始統計入度可能是不正確的。例如 3 1 2 4 1 2 3是1,2的父節點,...

日常模擬賽

none 100 100 10 210 不太會做.好像.是個sb題.嗯.div3t1難度 include include define int long long define gc getchar define pc putchar inline int read void print int x...

模擬賽記錄

模擬賽記錄 8.20 7 30 9 30 數學入門難度6道題 300分 8.21 7 40 9 50 圖論 普及 6道題 500分 8.22 學長模擬賽 7 40 10 00 提高 300 分 80 分 8.23 圖論 普及 提高 8 40 11 30 300分 180分 8.24 字串 入門難度 ...