接水果 題解

2021-08-22 18:11:19 字數 2433 閱讀 1818

雖然是noi-/noi/ctsc,但感覺還沒有平時考試難,可能是這種題太套路了.

給了你一棵樹,給了你一些路徑,每次詢問,u,v兩點間的第k小的子路徑(必須是給出的那些路徑中的)

怎麼判某條路徑是某條路徑的子路徑?

乙個套路就是用dfs序的區間包含關係.這個套路大概自己推理一下就出來了.

然後發現限制條件是乙個二維的,所以這個區間不是乙個線段,而是乙個矩形,所以用一下掃瞄線.當然可以用樹套樹,二維樹狀陣列,但是他們大材小用。注意到不需要修改,而這些資料結構支援修改,所以不需要用。

掃瞄線就是把乙個矩形拆成兩條線段,分別是平行於y軸的兩條.每個線段記錄一下橫座標,記錄一下兩個縱座標,然後在記錄一下是左邊的還是右邊的。然後按x排序然後順次加入,計入左邊的就給y1-y2加一,計入右邊的就減一.

// luogu-judger-enable-o2

#include

using

namespace

std;

template

inline

void read(t&data)

return;

}#define rg register

const

int _ = 100011;

struct edge e[_<<1];

int cnt=0,n,head[_],m,q,son[_],size[_],top[_],fa[_],deep[_],index,dfn[_],low[_];

int map[_],ans[_];

struct lineq[_<<2],q1[_<<2],q2[_<<2];

int tree[_<<2];

inline

int lowbit(register

int k)

inline

void modify(register

int loc,register

int zh)

inline

int query(register

int loc)

void add(register

int a,register

int b)

bool cmp(line a,line b)

}void dfsii(register

int now,register

int topf)

inline

int getlca(register

int a,register

int b,register

int &yl)

inline

void insert(register

int a,register

int b,register

int c,register

int d,register

int e,register

int f)

void divide(register

int l,register

int r,register

int l,register

int r)

register

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

register

int t1=0,t2=0;

for(register

int i=l;i<=r;++i)

else

else q[i].d-=su,q2[++t2]=q[i]/*,cout<;}}

for(register

int i=1;i<=t1;++i)q[i+l-1]=q1[i];

for(register

int i=1;i<=t2;++i)q[t1+l-1+i]=q2[i];

divide(l,mid,l,l+t1-1),divide(mid+1,r,l+t1,r);return;

}int main()

else insert(1,dfn[b],dfn[a],low[b],low[a],c);

}//exit(0);

/*for(register int i=1;i<=cnt;++i)

//coutint yl=b;

for(register

int i=1;i<=q;++i)

sort(q+1,q+cnt+1,cmp2);b=yl;

divide(1,b,1,cnt);

for(register

int i=1;i<=q;++i){

cout

5 4 4

1 22 3

3 44 5

1 2 10

2 4 11

3 4 12

3 5 13

1 3 2

1 3 1

1 4 4

1 5 3

*/

HNOI2015 接水果 題解

hnoi2015 接水果 給你乙個樹上路徑集合 s 每條路徑有個權值。每次詢問一條路徑 x,y 問它在 s 中包含的路徑中權值第 k 小的是多少。首先考慮如何判斷判斷一條路徑是否被另一條路徑包含。當一條路徑 x,y dep x dep y 是一條深度從淺到深的鏈時,路徑 u,v dep u dep ...

接水問題 題解

學校裡有乙個水房,水房裡一共裝有 m mm 個龍頭可供同學們開啟水,每個龍頭每秒鐘的供水量相等,均為 111。現在有 n nn 名同學準備接水,他們的初始接水順序已經確定。將這些同學按接水順序從 1 11 到 n nn 編號,i ii 號同學的接水量為 w iw i wi 接水開始時,1 11 到 ...

排隊接水 題解

題目描述 有 n個人在乙個水龍頭前排隊接水,假如每個人接水的時間為 ti,請程式設計找出這 n個人排隊的一種順序,使得 n 個人的平均等待時間最小。輸入格式 第一行為乙個整數 n。第二行 n個整數,第 i 個整數 ti,表示第 i 個人的等待時間 ti。輸出格式 輸出檔案有兩行,第一行為一種平均時間...