這題其實沒什麼,但用到的演算法都十分有用。做乙個不恰當的比喻,這是乙隻必須用牛刀殺的雞,但因為我這個蒟蒻殺不死牛,所以只能找只雞來練練手。
題目描述
farmer john 想出了乙個給牛棚旁的長圍牆塗色的好方法。(為了簡單起見,我們把圍牆看做一維的數軸,每乙個單位長度代表一塊柵欄)他只是簡單的把刷子蘸滿顏料,系在他最喜歡的奶牛bessie上,然後讓bessie來回地經過圍牆,自己則在一旁喝一杯冰鎮的涼水。(……-_-|||) bessie 經過的所有圍牆都會被塗上一層顏料。bessie從圍牆上的位置0出發,並將會進行n次移動(1 <= n <= 100,000)。比如說,「10 l」的意思就是bessie向左移動了10個單位。再比如說「15 r」的意思就是bessie向右移動了15個單位。給出一系列bessie移動的清單。fj 想知道有多少塊柵欄塗上了至少k層塗料。注意:bessie最多會移動到離原點1,000,000,000單位遠的地方。
輸入輸出格式
輸入格式:
第1行: 兩個整數: n k
第2...n+1 行: 每一行都描述了bessie的一次移動。 (比如說 「15 l")
輸出格式:
乙個整數:被至少塗上k層塗料的柵欄數
好像一眼就能看出離散化,但我這個蒟蒻之前並沒有太多的了解掃瞄線。
思路:離散化掃瞄。
把一條線段的兩個端點存下來,左邊那個點的值是+1,右邊是-1。之後按距離排序。
然後開始掃瞄,每掃到乙個點就加上它的值到sum裡,如果有時候sum>=k,那麼ans加上這條線段的長度(這個一會兒看注釋)
#include#include#include
using
namespace
std;
struct
nodew[
400001
];char
c;int
n,l,i,k,ans,cnt;
inline
bool
cmp(node a,node b)
intmain()
else
}sort(w+1,w+cnt+1
,cmp);
l=w[1
].v;
for (i=2; i<=cnt; i++)
l+=w[i].v;
}printf(
"%d\n
",ans);
return0;
}
洛谷 P1605 迷宮 USACO
1.problem description 迷宮 問題描述 給定乙個n m方格的迷宮,迷宮裡有t處障礙,障礙處不可通過。給定起點座標和 終點座標,問 每個方格最多經過1次,有多少種從起點座標到終點座標的方案。在迷宮 中移動有上下左右四種方式,每次只能移動乙個方格。資料保證起點上沒有障礙。輸入樣例 輸...
洛谷 P1339 USACO09OCT 熱浪
有乙個 n 個點 m 條邊的無向圖,請求出從 s 到 t 的最短路長度 簡單的無向圖最短路問題,採用堆優化的dijkstra dijkstra 初始到所有點的距離標記為很大很大,兩個集合 已發現和未發現。將起點距離標記為0。之後,每次從未發現的節點集合中挑選距離起點最近的 單源最短路 放入已發現的節...
洛谷 P2894 USACO08FEB 酒店
題目描述 用線段樹維護三個值 區間最長空位長度,從左端點可以延伸的最長空位長度,從右端點可以延伸的最長空位長度。include include using namespace std const int n 2e6 7 int n,m intlen n max n maxl n maxr n laz...