原題:
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 字串 入門難度 ...