比賽 HNOI2018 轉盤

2022-05-26 17:12:09 字數 1849 閱讀 6383

通過這題,我發現了我最大的缺陷,就是題目中重要的性質發現不了,所以導致後期根本做不了。還是要多做題,培養思維

對於這道題,來發現性質吧

對於每一條路線,因為它有用的就是最終的時刻,所以我們都可以把它變成一條由中間乙個點出發,在起點等待一些時刻,然後接下來的每個時刻都向右走,在同一時刻完成任務

可以知道,每個路線都是可以這樣轉化的

所以我們要考慮的路線就只有在起點等待,然後不斷向右走的路線

然後就有了這麼乙個式子(陣列加長一倍,去掉環的影響)

\(ans=min_\ \-j\}+n-1\}\)

因為每種路線的瓶頸在於過每個點作 \(y=x+b\) 的線後(先要把點的時刻轉化成二位平面內的點),最上方的那根線,所以取max找那根線,然後再取min,找所有路線的最優解

繼續推,\(ans=min_\\+n-1\}=min_\\+i+n-1\}\)

因為max的範圍讓我們很不爽,不好一起維護,於是考慮把max的範圍改一下,而又不影響答案

發現因為 \(t_j=t_\) , 所以 \(t_j-j>t_-j-n\),那麼我們就算多考慮到複製的陣列裡去,由於我們找的是max,所以也不會影響答案

於是max的範圍就變成了 \(2n\) , \(ans=min_\\+i\}+n-1\)

然後就要對於每個 \(i\) ,既要維護這個東西, \(max_\+i\),又要維護所有 \(i\) 的這個東西的min

那就用線段樹

線段樹對於每個區間維護兩個東西,乙個是整塊區間的max,另乙個是左半區間的答案(就是上面那個式子)

類似於樓房重建去修改和查詢就可以了

#include#define ui unsigned int

#define ll long long

#define db double

#define ld long double

#define ull unsigned long long

const int maxn=100000+10,inf=0x3f3f3f3f;

int n,m,p,ans;

templateinline void read(t &x)

templateinline void write(t x,char ch='\0')

templateinline void chkmin(t &x,t y)

templateinline t min(t x,t y)

#define mid ((l+r)>>1)

#define ls rt<<1

#define rs rt<<1|1

#define lson ls,l,mid

#define rson rs,mid+1,r

struct segment_tree

} inline void pushup(int rt,int l,int r)

inline void update(int rt,int l,int r,int pos,int k) }

};segment_tree t;

#undef mid

#undef ls

#undef rs

#undef lson

#undef rson

int main()

write(ans=t.mn[1]+n-1,'\n');

while(m--)

return 0;

}

比賽 HNOI2018 總結

一將功成萬骨枯,我就是給那些隊爺做基數的 看完題,暴力好打,然後就打 覺得第三題模型很好建啊,先看第三題吧 結果第三題是最。的 圖建出來,先看樹的情況,設dp試一下 結果一直只想著一維的dp,沒去想0 1狀態表示是否選取,於是老久都沒想出來 第一題一開始沒看到30分的狀壓,突然看到,然後就趕緊碼一下...

HNOI AHOI2018 轉盤 題解

題目鏈結 好難的題。首先,有等待操作不太好弄。可以發現 在總時間一定的情況下,到每個點越晚越好。所以,可以把所有等待都移到起點處,解不會變差。由於是環,破環為鏈處理。如果在 s 時間在 i 1 i n 出發,那麼到 j i j的時間為 s j i 根據要求,得 s j i t j 即 s max t...

心情 HNOI2018遊記

day 0.全機房的人好像都在做題。然而下午是社團節的遊園會,身為社幹的我風風雨雨在外面各種搬凳子搬椅子換場地招待外校同學 就這樣我好像什麼都沒有複習。晚上就一起去酒店了。大概因為是高一的緣故,並沒有非常的緊張。住進了酒店,滿腦子都是和豆豆 ww3113306 如何吃吃吃玩玩玩。非常開心的擺了一晚上...