傳送門
明明可以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 ...