C 最短路 線段樹 例題 Board

2021-08-04 01:47:28 字數 1805 閱讀 2631

source:noip2016-rzz-2 t3

給出這樣一棵「二叉樹」:

下面是乙個例子:

每一條圖上的路徑用乙個字串表示,字串中的每乙個字元表示乙個移動。字元僅包含如下五種:

用一條路徑來表示這條路徑的終點,例如路徑:221lu 就表示上圖中的節點 a 。

給出兩條路徑,你的任務是求出著兩條路徑的終點之間的最短路。

輸入兩行,每行乙個字串,分別表示兩條路徑。

輸出一行乙個整數,表示能得到的串的總數。

輸入

221lu 

12l2

輸出

3
【資料規模與約定】

用 d 表示所有經過的節點中,深度最大的節點的深度;s 表示輸入字串的最大長度。

對於 10% 的資料,d≤10。

對於 30% 的資料,d≤50。

對於 50% 的資料,d≤1000。

對於 70% 的資料,d≤20000。

對於 100% 的資料,d≤100000;s≤100000。

#include#include#include#includeusing namespace std;

struct nodetrans[270000];

int string_s[100003],string_t[100003],string_s_n,string_t_n;

void put(int x)

while(x);

while(num) putchar(c[num--]);

putchar('\n');

}void build_a_tree(int left,int right,int now)

void add_lazy(int now,int lazy)

void push_down(int now)

}void update(int now)

void modify(int left,int right,int now,int x,int y,int z)

int query_left(int left,int right,int now,int x)

int query_right(int left,int right,int now,int x)

void tree_export(int left,int right,int now,int x,int *_string)

int middle=(left+right)>>1;

push_down(now);

tree_export(left,middle,now<<1,x,_string);

tree_export(middle+1,right,now<<1|1,x,_string);

}void read(int *_string,int &string_n)

case '2':

case 'u':

case 'l':

case 'r':

} }tree_export(1,char_length,1,string_n,_string);

delete character;

}int main()

if(string_s[i]!=string_t[i]&&flag)

if(distance>answer) break;

answer=min(answer,distance+!flag+2*(_n-i));

} put(_summary+answer);

return 0;

}

CodeVS1021 瑪麗卡 最短路 線段樹

題目鏈結 宣告 感謝fzw kryj 的創意和熱心講解 麥克找了個新女朋友,瑪麗卡對他非常惱火並伺機報復。因為她和他們不住在同乙個城市,因此她開始準備她的長途旅行。在這個國家中每兩個城市之間最多只有一條路相通,並且我們知道從乙個城市到另乙個城市路上所需花費的時間。麥克在車中無意中聽到有一條路正在維修...

HNOI2014 道路堵塞 最短路,線段樹

對不起對不起,辣雞蒟蒻又來用核彈打蚊子了 完全ignore了題目給出的最短路,手工搞出乙個最短路,發現對答案沒什麼影響 所以乾脆轉化為經典問題 每次詢問刪掉一條邊後的最短路 如果刪掉的是非最短路邊,那麼顯然毫無影響 如果刪掉的是最短路邊,那麼我們倒過來,考慮這個時候每條非最短路邊的貢獻。對於一條非最...

迷宮的最短路線(BFS

迷宮的最短路線 bfs 題目 給定乙個大小為n m的迷宮。迷宮由通道和牆壁足證,每一步可以向鄰接的上下左右四格的通道移動。請求出從起點到終點所需要的最小步數。請注意,本體假定從起點一定可以移動到終點。限制條件 n,m 100 思路 1.初始化迷宮maze i j 並對其每乙個位置附上乙個很大的值來表...