「將世界終結前最後的畫面,深深刻印進死水般的心海.」
祈願沒有得到回應,雷聲衝破雲霄,正在祈願的洛天依受到了極大的打擊。
洛天依嘆了口氣,說:」看來這個世界正如我之前所說的一樣,早已失去一切生機」
你沉默了下來,沒有說什麼話,只是靜靜地坐在洛天依的身旁,一同觀賞這末日之景.
天空被雲朵覆蓋,一朵具有強大能量的雲映入你們的眼簾,這是始雲!是抽取世界能量的最重要的一朵雲!但是洛天依明顯沒有破壞這朵雲的鬥志了,你也只好靜靜地觀賞.
這個世界被吸取的能量從始雲開始傳遞,通過願銀線輸送到各個積雨雲上,每朵積雨雲即作為能量中轉點,又作為能量湮滅點。如此,整片天空構成了乙個巨大的能量輸送網路。很巧,我們可以用圖論中的有向圖來描述這個網路.
我們定義始雲的編號為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,然後我們來拋硬幣到桌子上,拋下之後硬幣有時候會和一些直線相交 相切的情況也算是相交 有時候不會。請你來計算一下拋一次硬幣之後,該硬幣和直線相交數目的期望。...