雖然是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。輸出格式 輸出檔案有兩行,第一行為一種平均時間...