這套題我們沒有考,但是卻也作為作業題寫了。
怎麼說啊。。。反正我是想不到思路的。
題面:題目描述
在上半套題中提到的那家公司在你的幫助之下服務成本大幅降低,於是這家公司開始快速發展,現在這家公司已經擁有了n名員工,分別從1到n編號。
為了方便管理。公司集體會議決定,可以將某個員工a任命為乙個之前沒有直接上司的員工b的直接上司,並且規定,當某個員工b收到並閱讀完某個檔案時,若b當前有直接上司a,則b需要繼續將它交給a,a收到並閱讀這個檔案後,若當前a還有直接上司,那麼還需將檔案交給a的直接上司閱讀,以此類推,直到某個閱讀的人c沒有直接上司,這時候c便會將該檔案存檔。
舉個例子,比如b在t-1時刻收到了檔案x,而a在t時刻成為了b的直接上司,那麼a不會重新閱讀b在t-1時刻收到的檔案x。
這家公司又邀請你來幫忙,他們除了給你任命資訊以及接收檔案的資訊之外,還會詢問某乙個人是否讀過乙個指定的檔案,具體來說,現在這家公司按時間順序給你m條資訊/詢問,為以下三種之一(一開始員工間無上下級關係):
1、(1操作,輸入格式為1 b a)表示員工a成為了員工b的直接上司,保證在此之前b沒有直接上司,並且上司關係顯然不會構成環。
2、(2操作,輸入格式為2 b)表示員工b收到了乙份新檔案,在下乙個資訊/詢問之前,所有應該讀到這份檔案的人都會讀到它。
3、(3操作,輸入格式為3 a i)詢問a是否讀過這家公司按時間順序收到的第i份檔案,如果讀過就輸出"yes"字串(不包括引號),否則輸出"no"(也不包括引號),保證在詢問的時候第i份檔案已存在。
輸入格式
第一行兩個正整數n,m,分別表示員工數和資訊/詢問數。
接下來m行按時間順序給出資訊/詢問,每行都是上述三種輸入格式之一。
輸出格式
對每一條詢問輸出一行表示答案。
其實我挺想貼題解的,但是終究感覺不太道德(汗)
所以我們考慮離線處理所有操作。
求u到v的邊權最值,若時間大於現在的檔案i,說明兩點間路徑上有邊在檔案傳輸後出現,所以u接收不到,反之則可以。
哎,蒟蒻原本想寫個樹剖練練手的,結果寫到一半腦殘了覺得樹剖不能找到兩點之間的邊權最大只能維護有可減性的資訊,然後寫到一半棄了寫倍增,還調了n年。其實感覺樹剖會好些一些。
這就導致了這個lca用的是樹剖,結果還是用倍增維護最大值的奇怪**,跑的奇慢。
\(code:\)
#include#define n 300010
#define int long long
using namespace std;
int n, m;
int fl[n] = {}, len = 0;
struct rode e[n << 1] = {};
int a[n] = {};
struct question que[n] = {};
int si[n] = {}, d[n] = {}, hs[n] = {}, ff[n] = {};
int top[n] = {}, pr[n] = {}, tr[n] = {};
int f[n] = {};
int in[n] = {};
int read()
inline void inc(int x, int y)
int ti = 0, cnt = 0;
int fie[n] = {};
int block;//倍增步數
int mx[n][35] = {}, z[n][35] = {};
//mx[i][j]就是i向上跳2^j步的最大邊權值,z是倍增的陣列
void dfs(int u, int fa)
si[u] += si[v];
if (si[v] > maxn)maxn = si[v], hs[u] = v;
}}int vs = 0, hai = 0;
void dfs1(int u, int k)
//處理top陣列
int lca(int x, int y)
if (d[x] < d[y])swap(x, y); return y;
}//樹剖lca
signed main()
if (op == 2)
if (op == 3)
; //離線下所有詢問
} }for (int i = 1; i <= n; i++)
if (!in[i]) inc(0, i);
//建立乙個虛擬源點0,因為原圖是乙個森林
dfs(0, -1); dfs1(0, 0); //預處理
for (int i = 1; i <= cnt; ++i)
//如果u本來就沒有接收到這份檔案,輸出no
int maxn = 0, x = v;
for (int j = 30; j >= 0; --j)
if (d[z[x][j]] >= d[lca]) maxn = max(maxn, mx[x][j]), x = z[x][j];
//倍增法找u到v路徑上的最大邊權
//這樣可以確認u能接收到這份檔案
//如果路徑上有邊比檔案晚出現,那u是接收不到檔案的
if (maxn < que[i].y)puts("yes");
else puts("no");
} return 0;
}
大概就是這樣了,我覺得**裡也講的挺清楚的。
這是在的第二篇題解,原本說好的在這發(實際上確實),不過我很久沒寫blog了。
都快聯賽了,多複習吧
day23 系統服務
今日內容 1.系統服務 1.開機啟動流程 2.centos6與centos7區別 3.系統的執行級別 1.centos6 臨時性的操作 root oldboy runlevel 檢視級別 n 3 n 表示上一次是什麼級別 3 當前系統正在執行的級別 root oldboy init 3 切換到3級別...
實習日記 Day23
今天是週三,一周之中的 駝峰日 駝峰日通常是一周中最難過的日子,但也是最充滿希望的時日,過去了就是週末了。今天的task數量之多,達到了我入職以來的頂峰呢,刺激 犯了低階的錯誤呢 快下班時,leader突然在skype找我了,甩過來乙個鏈結,問我用 賬號能不能登陸。我一看,不正是我上週已經交付的任務...
前端學習Day23
一 查詢 查詢 由裝置型別 監測裝置特性表示式構成。語法 media 裝置型別 all screen and 條件表示式 注 1 and兩側必須有空格 2 not放在裝置型別的前面 反向選擇 排除某個範圍 3 查詢 做樣式微小調整,例如 浮動,顯示隱藏,文字大小,寬高 二 移動端準備工作 1 met...