2017 山東一輪集訓 Day6 重建

2021-09-25 05:49:27 字數 4024 閱讀 1986

考試的時候以為兩者最短路差值的絕對值為「階梯拋物線」,

像這樣: ---------         -------

---------   -------

-------

可以二分,然而並沒有單峰性。。不過騙了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這樣遞增的。於是我們想到...