LOJ 3156 NOI2019 回家路線

2021-09-25 07:35:20 字數 1677 閱讀 1461

傳送門

明明可以bfs

bfsbf

s寫了個dij

dijdi

j把自己強行玩wawa

wa有2種做法

第一種:

考慮對於同乙個點的入邊i,j

i,ji,

j轉移給出邊xxx

把式子列出來後發現是乙個標準的斜率優化

在凸包上二分就可以了

複雜度o(m

logm

)o(mlogm)

o(mlog

m)第二種:

發現時間很小

f [i

][j]

f[i][j]

f[i][j

]表示在點i

ii時間j

jj時最小值

用m ap

mapma

p存一下暴力轉移也可以過

複雜度o(m

klog

k),k

o(mklogk),k

o(mklo

gk),

k是最大的時間

常數很小也可以卡過

好像是原題簡化版

算了c cf

ccfcc

f都讓人家出題人做綠皮火車了也不奢求什麼了

#include

using

namespace std;

const

int rlen=

1<<21|

1;inline

chargc(

)#define gc getchar

inline

intread()

#define re register

#define ll long long

#define pb push_back

#define pii pair

#define fi first

#define se second

#define pob pop_back

#define pf push_front

#define pof pop_front

const

int n=

100005

,m=200005

;int n,m;

ll a,b,c;

const ll inf=

1e15

;map<

int,ll> f[n]

;#define it map::iterator

struct node

}p[m]

;inline ll calc

(ll x)

intmain()

sort

(p+1

,p+m+1)

; f[1]

[0]=

0;for(

int i=

1;i<=m;i++)}

ll res=inf;

for(it it=f[n]

.begin()

;it!=f[n]

.end()

;it++

)res=

min(res,

(*it)

.fi+

(*it)

.se)

; cout<}

loj 3161 NOI2019 君的探險

考慮b型資料,也就是圖是乙個父親編號小於兒子的樹的情況的做法.考慮整體二分,對於當前區間 l,r 維護父親屬於當前區間的集合 s 現在要將 s 分為父親在 l,mid 中的和 mid 1,r 中的兩類.首先如果 x in l,mid 那麼它的父親一定在左區間.考慮對於所有 l,mid 區間的節點呼叫...

NOI2019 回家路線

點此看題 首先可以用暴力dpdp dp艹過去,設dp i j dp i j dp i j 為到了i ii點的時間是j jj的最小花費,由於時間是單向流逝的,我們可以先把邊按出發時間排序,用邊轉移,列舉到達出發點的時間jjj d p y i q i dp x i j cost p i j dp y i...

NOI2019 回家路線

link solution 演算法一通過觀察範圍發現 q leq1000 所以直接暴力拆點 dp 時間複雜度 o 1000m o 能過 演算法二因為有 a times x 2 b times x c 考慮斜率優化。設 f i 表示走完第 i 條邊的最小煩躁值,則 f i min space u i ...