51nod 2004 終結之時

2022-08-11 12:12:11 字數 2741 閱讀 1345

「將世界終結前最後的畫面,深深刻印進死水般的心海.」

祈願沒有得到回應,雷聲衝破雲霄,正在祈願的洛天依受到了極大的打擊。

洛天依嘆了口氣,說:」看來這個世界正如我之前所說的一樣,早已失去一切生機」

你沉默了下來,沒有說什麼話,只是靜靜地坐在洛天依的身旁,一同觀賞這末日之景.

天空被雲朵覆蓋,一朵具有強大能量的雲映入你們的眼簾,這是始雲!是抽取世界能量的最重要的一朵雲!但是洛天依明顯沒有破壞這朵雲的鬥志了,你也只好靜靜地觀賞.

這個世界被吸取的能量從始雲開始傳遞,通過願銀線輸送到各個積雨雲上,每朵積雨雲即作為能量中轉點,又作為能量湮滅點。如此,整片天空構成了乙個巨大的能量輸送網路。很巧,我們可以用圖論中的有向圖來描述這個網路.

我們定義始雲的編號為1.

對於一朵積雨雲y,如果從始雲開始到這個點的所有路徑都經過了點x,那麼我們稱x是y的支配雲,x支配y,y被x支配。顯然乙個點的支配雲可能有多個且至少有兩個。

旁邊的洛天依此時非常驚訝,因為她發現不同的積雨雲的能量強度不一樣!

洛天依用正整數來描述這個能量的強度,同時起名為湮滅能量數.

也就是說在這個雲朵湮滅的能量的單位數目.

然而整個網路中的雲湮滅的能量數在不斷的變化中,變化的情況如下:

c 1 u w有一股能量在雲朵u中湮滅了w的能量.

c 2 u w點u支配的所有雲朵上都湮滅了w能量

c 3 u w支配點u的所有的雲朵上都湮滅了w的能量

「最後一次求你了,為我推演一下這毀滅能量的變化吧.」

洛天依一共有四種請求:

q 1 u 詢問u支配的所有的雲朵的湮滅能量數之和.

q 2 u 詢問支配u的所有的雲朵的湮滅能量數權值之和.

q 3 s x1 x2 ... xs 詢問所有支配了其中任一雲朵的雲朵的湮滅能量數權值之和.

r k讓狀態回到k次變化之前.若k大於已經執行的運算元,則視為回到初始狀態.

你自然不忍心拒絕洛天依,於是你打算圓滿完成這個任務.

支配樹裸題,

先構出支配樹,然後樹鏈剖分。

經典的樹鏈剖分操作。

注:目前我還沒有打關於支配樹的介紹,因為我還不是理解透徹,本月內我將會打一篇支配樹的blog。

#include #include #include #include #include #include #include #include #include #include #include #define clear(a) memset(a,0,sizeof(a))

const int inf=2147483647;

const int mo=1e9+7;

const int n=100005;

using namespace std;

int head[n], pre[n], dom[n], to[n*20], nt[n*20], tot,lt[n],w[n];

void link(int *h,int fr,int tt)

int n, m;

void init()

}int bcj[n], semi[n], idom[n], best[n], dfn[n], id[n], fa[n], num;

int push(int v)

void dfs(int rt)

}void tarjan()

link(dom, semi[u], u);

bcj[u] = fa[u];u = id[i - 1];

for(int j = dom[u]; j; j = nt[j])

}for(int i = 2, u; i <= n; ++i) }

int son[n],size[n],deep[n],top[n],en[n];

void dg(int x)

}void dg1(int x)

en[x]=num;

}struct tree

tr[n*30];

int rt[n];

void newp(int v)

void down(int v,int l,int r,int mid)

void put(int v,int l,int r,int x,int y,int z)

int mid=(l+r)>>1;

down(v,l,r,mid);

if(y<=mid) tr[++num]=tr[tr[v].l],tr[v].l=num,put(tr[v].l,l,mid,x,y,z);

else

if(x>mid) tr[++num]=tr[tr[v].r],tr[v].r=num,put(tr[v].r,mid+1,r,x,y,z);

else

tr[++num]=tr[tr[v].l],tr[v].l=num,tr[++num]=tr[tr[v].r],tr[v].r=num,

put(tr[v].l,l,mid,x,mid,z),put(tr[v].r,mid+1,r,mid+1,y,z);

tr[v].s=tr[tr[v].l].s+tr[tr[v].r].s;

}long long find(int v,int l,int r,int x,int y)

void up(int v,int x,int y)

long long up1(int v,int x)

int st[n];

bool cmp(int x,int y)

int main()

else

if(ch=='q')

}else

}}

51nod 貪心入門

有若干個活動,第i個開始時間和結束時間是 si,fi 活動之間不能交疊,要把活動都安排完,至少需要幾個教室?分析 能否按照之一問題的解法,每個教室安排盡可能多的活動,即按結束時間排序,再貪心選擇不衝突的活動,安排乙個教室之後,剩餘的活動再分配乙個教室,繼續貪心選擇 反例 a 1,2 b 1,4 c ...

51nod 迷宮問題

1459 迷宮遊戲 基準時間限制 1 秒 空間限制 131072 kb 分值 0 難度 基礎題 你來到乙個迷宮前。該迷宮由若干個房間組成,每個房間都有乙個得分,第一次進入這個房間,你就可以得到這個分數。還有若干雙向道路鏈結這些房間,你沿著這些道路從乙個房間走到另外乙個房間需要一些時間。遊戲規定了你的...

51nod 硬幣遊戲

有乙個簡單但是很有趣的遊戲。在這個遊戲中有乙個硬幣還有一張桌子,這張桌子上有很多平行線 如下圖所示 兩條相鄰平行線之間的距離是1,硬幣的半徑是r,然後我們來拋硬幣到桌子上,拋下之後硬幣有時候會和一些直線相交 相切的情況也算是相交 有時候不會。請你來計算一下拋一次硬幣之後,該硬幣和直線相交數目的期望。...