NOIP2013模擬 Freda的傳呼機

2021-07-12 01:46:34 字數 1460 閱讀 4636

給出一張n個點,m條邊的無向聯通圖,和q次詢問,每次詢問x到y的最短路。

n,q<=10^4,m<=1.2*10^4

時限100ms

10% n<=10^3,m<=1.2*10^3

另外30% n=m+1

另外50% n=m

這題畫風突然就變了。

10%暴力,30%樹,50%換套樹,10%。。。仙人掌!@#¥%……&*

還開100ms,嚇得我都不敢打玄學演算法sp(b)fa了.

不過事實證明出題人不卡。。。

首先我們從root開始跑一遍sp(b)fa

然後把仙人掌變成樹

鏈結乙個把仙人掌變成樹的方法

這樣我們就得到了一顆仙人掌樹(是這樣叫的吧?)

並且這棵樹中的所有環頂(父親)都是兒子的spfa必經點。

那麼對於兩個點x,y,我們我們把他們往上跳,跳到lca的下面,設為a和b。

如果這兩個點不屬於乙個乙個環,那麼答案就是dis[x]+dis[y]-2*dis[lca]

如果屬於,那麼我們就用dis[x]-dis[a]+dis[y]-dis[b]再加上a到b走環的距離(min一下就好了)

infleaking同學竟然比我早a,不爽(*  ̄︿ ̄)

#include

#include

#include

#include

#define fo(i,a,b) for(int i=a;i<=b;i++)

#define fd(i,a,b) for(int i=a;i>=b;i--)

#define rep(i,a) for(int i=last[a];i;i=next[i])

#define n 22005

using namespace std;

int n,m,x,y,z,l,q,tot;

int d[n],c[n],dfn[n],dis[n],cir[n],p[n],len[n];

int t[n*2],v[n*2],next[n*2],last[n],fa[n][17],que[n*5];

bool e[n*2],bz[n];

void add(int

x,int

y,int z)

void spfa()

bz[que[i]]=0;

}}void cate(int s,int t,int line)

}void dfs(int

x) else

if (dfn[t[i]]x]) cate(t[i],x,i);

}void make(int

x,int

y)

int lca(int &x,int &y)

int main()

printf("%d\n",dis[a]+dis[b]-2

*dis[z]);

}}

模擬 NOIP 2013 花匠

花匠棟棟種了一排花,每株花都有自己的高度。花兒越長越大,也越來越擠。棟棟決定把這排中的一部分花移走,將剩下的留在原地,使得剩下的花能有空間長大,同時,棟棟希望剩下的花排列得比較別緻。具體而言,棟棟的花的高度可以看成一列整數h 1,h 2,h n。設當一部分花被移走後,剩下的花的高度依次為g 1,g ...

NOI(P)2013模擬 秘密任務

這題是在最短路上研究問題的,所以理所當然要建個圖先。其次我們先考慮費用,看看這圖,再yy一下,那麼我們可以發現這就是典型的最小割問題,可是我們還是要考慮如何判斷這個割是否唯一。首先,大家可以先去看我的另乙個blog,上面有寫類似這樣的判斷最大流是否唯一。其實這兩題是不同的。所以我在考試時就掛了。因為...

NOIP2013模擬 粉刷匠

給出n個球,其中有c1個球是顏色1的,有c2個球是顏色2的,有c3個球是顏色3的 有ck個球是顏色k的。求相鄰兩個球顏色不同的排列方案。k 15,ci 6,資料組數 2000 這種題一般很難有直接的通式,可以考慮dp。設fi,j表示,前i中顏色已經放完了,其中產生了j個不合法的空的方案數。這裡的空指...