考試的時候以為兩者最短路差值的絕對值為「階梯拋物線」,
像這樣: --------- -------
--------- -------
-------
可以二分,然而並沒有單峰性。。不過騙了70分,混了個rank1,血賺~~
#include.h>
#define gt()
(p1==p2&&
(p2=
(p1=buf)
+fread
(buf,1,
1000000
,stdin)
,p1==p2)
?eof:
*p1++
)#define pt
(ch)
(top<
1000000
?st[top++
]=ch:
(out()
,st[
(top=0)
++]=ch)
)#define out()
(fwrite
(st,
1,top,stdout)
)#define ll long
long
using namespace std;
int top;
static
char st[
1000000
],buf[
1000000],
*p1=buf,
*p2=buf;
const
int maxn=
(1e3)+
5,maxe=
(2e4)+
5;int len,t,n,m,s,t;ll ans,s,dis[maxn]
;bool vis[maxn]
,de[maxn]
;int tot,lnk[maxn]
,nxt[maxe]
,son[maxe]
,w[maxe]
;void
add_e
(int x,
int y,
int z)
intre()
void
wri(
int x)
struct ff
}hep[maxe]
;void
put(ff x)
ff get()
ll dij_heap
(bool f,ll h));
while
(len));
}return dis[t];}
ll check
(ll x)
void
inti()
intmain()
int k=re(
);while
(k--
) vis[re(
)]=1
; ll l=
1,r=s,mid;
while
(l<=r)if(
!check
(ans)
)else
puts
("impossible");
}return0;
}
考慮每條邊都加乙個整數,那麼隨著這個值變大,肯定是使 s 到 t 的路徑經過的點變少,最後兩人走同一條路
我們記fi,
jf_
fi,j
經過 i 條連線關鍵點的邊,到達節點 j 的最短路徑長度
g i,
jg_
gi,j
經過任意 i 條邊,到達節點 j 的最短路徑長度
值為inf表示無法到達
我們列舉乙個fi,
tf_
fi,t
此時我們得到了a的乙個範圍[l,r],然後最大值取r即可
複雜度o(t
(nm+
n2))
o(t(nm+n^2))
o(t(nm
+n2)
)
#include.h>
#define gt()
(p1==p2&&
(p2=
(p1=buf)
+fread
(buf,1,
1000000
,stdin)
,p1==p2)
?eof:
*p1++
)#define pt
(ch)
(top<
1000000
?st[top++
]=ch:
(out()
,st[
(top=0)
++]=ch)
)#define out()
(fwrite
(st,
1,top,stdout)
)#define ll long
long
using namespace std;
int top;
static
char st[
1000000
],buf[
1000000],
*p1=buf,
*p2=buf;
const
int maxn=
(1e3)+
5,maxe=
(2e4)+
5;int cs,n,m,s,t,k;ll ans,f[maxn]
[maxn][2
],inf;bool vis[maxn]
;int tot,lnk[maxn]
,nxt[maxe]
,son[maxe]
,w[maxe]
;void
add_e
(int x,
int y,
int z)
intre()
void
wri(
int x)
void
inti()
void
del()}
void
getdis
(bool g)
#define f
(x)(f[
(x)]
[t][0]
)#define g
(x)(f[
(x)]
[t][1]
)int
main()
k=re(
);for(
int i=
1;i<=k;i++
) vis[re(
)]=1
;getdis(1
),del(),
getdis(0
);for(
int i=
1;i<=k;i++)if
(f(i)!=inf&&
g(i)
>=
f(i))}
if(a)
continue;if
(!b)
ll l=-1
,r=inf;
for(
int j=
1;j(g
(j)!=inf) r=
min(r,(g
(j)-
f(i))/
(i-j));
for(
int j=i+
1;j<=n;j++)if
(g(j)!=inf) l=
max(l,(f
(i)-
g(j))/
(j-i));
if(l>r)
continue;if
(r>ans) ans=r;}if
(!(~ans)
)puts
("impossible");
else
if(ans>inf)
puts
("infinity");
else
printf
("%lld\n"
,ans);}
return0;
}
2017 山東一輪集訓 Day4 基因
設定 sqrt 個關鍵點,維護出關鍵點到每個右端點之間的答案以及pam的左指標,每次暴力向左插入元素即可,為了去重,還需要記錄一下pam上每個節點在每個關鍵點為左端點插入到時候到最左邊出現位置,總複雜度 o n sqrt program by mangoyang pragma gcc optimiz...
2017 山東一輪集訓 Day7 逆序對
題解 滿滿的套路題。首先顯然從大到小列舉 然後每次生成的逆序對是1 i 1 的 這樣做dp是nk的 複雜度太高了 那我們轉化一下問題 變成sigma ai ai 據說是個經典問題。感覺非常奇妙 先容斥一下,也就是說 總的 至少1個條件不滿足 至少2個條件不滿足 那考慮一下如何算有x個條件不滿足 不滿...
費用流 2017 山東一輪集訓 Day4 棋盤
求放k個棋子在n n的棋盤上,最少互相攻擊的棋子對數。能夠攻擊僅當兩旗子在一條直線上,且中間無障礙物。共有q個詢問 不難想到這種棋盤上放棋子的題考得是網路流 積累 按行 縱分別按其對應連通塊編號,s 行 縱 t 但明顯新一行的點互相攻擊的話,隨點數的增加,貢獻是0,1,2,3這樣遞增的。於是我們想到...