傳送門
tips
如果兩個點的lca會被反覆用到,就可以拿乙個陣列存下來,避免反覆計算
analysis
又是一道好喵喵喵妙的題啊!!!樹上差分太棒了,簡直太厲害
不過首先我們得看出來這是一道二分可以解決的問題
然後問題就變成了怎麼check
看看gsj大佬怎麼說吧
code
注意常數因子帶來的程式效率上的影響。
所以樹鏈剖分貌似要快得多
但……hhh,寫的倍增
#include
#define in read()
#define n 600009
#define m 600009
using
namespace std;
inline
intread()
return f==
1?res:
-res;
}int n,m,dis[n]
,dep[n]
,val[n]
;int nxt[m]
,to[m]
,head[n]
,w[m]
,ecnt=0;
inline
void
add(
int x,
int y,
int z)
int fa[n][25
];struct nodep[n]
;void
dfs(
int u,
int fu)
}inline
intgetlca
(int x,
int y)
}return fa[x][0
];}int maxn,num,s[n]
,del;
void
dfs(
int u)
if(s[u]
==num) del=
max(del,val[u]);
}inline
bool
check
(int std)
}dfs(1
);if(maxn-del<=std)
return1;
return0;
}int
main()
dfs(1,
0);for
(j=1
;j<=19;
++j)
for(i=
1;i<=n;
++i)
fa[i]
[j]=fa[fa[i]
[j-1]]
[j-1];
for(i=
1;i<=m;
++i)
int l=
0,r=maxn,ans=0;
//while
(l<=r)
cout
}
NOIP2015提高組Day2 運輸計畫
其實題目說那麼多,一句話就是 給定一棵帶權樹與m mm條路徑,你可以使一條樹上的邊的權值變為0,問你m mm條路徑的長度的最大值最小是多少。這道題讓我想到了貨車運輸這道題,但是更難,但方法可以借鑑。因為這是最大值最小問題,很顯然可以二分答案。那這個二分判斷怎麼打呢?我們如果遇到某條邊,所有超時的邊 ...
Noip2015提高組總結
總體而言noip還行吧,每天前兩題都穩穩地,但是最後一題做得不好。day1,看完題目後,第一題簽到,第二題很直觀想出來了,又畫了個圖驗證了一下,tarjan雖然可能爆棧,但人工棧就沒問題了。第三題認為是dp一類的東西。畢竟是第一次提高組,還是挺緊張的,一二題打得特別仔細特別慢,對拍,肉眼查錯,搞了接...
NOIP2015提高組解析
題目見此 day1 神奇的幻方 裸裸的模擬 其實也可以發現規律 i 1在i的右上方,如果已經有數了,就填在i的下方 include includeusing namespace std int a 50 50 int nx,ny,n int main else elseelse a tx ty i ...