以下代码的思路是二分答案然后判定是否可行。
每次判定 dfs,看子树能否凑出二分的值。
但在 CF #19 WA了。
这个思路正确吗?怎么把他调对呢?
#include <bits/stdc++.h>
#define LL long long
#define ULL unsigned long long
#define int long long
//#define double long double
#define FOR(i,l,r) for(int i=l;i<=r;++i)
#define ROF(i,r,l) for(int i=r;i>=l;--i)
#define mkp make_pair
#define fr first
#define se second
#define pb push_back
#define cmax(a,b) a=max(a,b)
#define cmin(a,b) a=min(a,b)
using namespace std;
void IOS() {
ios::sync_with_stdio(false);
cin.tie(0);
}
void Document() {
freopen(".in","r",stdin);
freopen(".out","w",stdout);
}
inline int read(){
int s=0,w=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-') w=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){s=(s<<3)+(s<<1)+(ch^48);ch=getchar();}
return s*w;
}
inline void write(int x){
if(x<0){putchar('-');x=-x;}
if(x>9) write(x/10);
putchar(x%10+'0');
}
void Tell() {
//写数据结构注意初始化!
//浮点数类题目过不了优先考虑精度!
//vector动态开点注意内存重分配!
//有本地写freopen!没本地别写!!!
//最后几分钟给我老老实实坐那里,别手贱!!!
//long long 级别的常数运算一定要用 xll!!!
//一定要手玩几组极限数据,防止爆数。
//大数据关同步流! 大数据关同步流! 大数据关同步流!
//删调试!删调试!删调试!删调试!删调试!
}
const int N=2e5+10;
int t,n,a[N];
vector<int>e[N];
bool dfs(int x,int fa,int val) {
int tmp=1;
if(a[x]>=val) {
for(int y:e[x]) {
if(!dfs(y,x,val)) tmp=0;
}
} else {
int tp=val-a[x];
for(int y:e[x]) {
if(!dfs(y,x,tp+val)) tmp=0;
}
if(!e[x].size()) tmp=0;
}
return tmp;
}
bool check(int val) {
if(val<=a[1]) return true;
int tmp=1;int ch=val-a[1];
for(int y:e[1])
if(!dfs(y,1,ch)) tmp=0;
return tmp;
}
void solve() {
cin>>n;
FOR(i,1,n) a[i]=read(),e[i].clear();
FOR(i,2,n) {
int x=read();
e[x].pb(i);
}
int l=0,r=2e9,ans=0;
while(l<=r) {
int mid=l+r>>1;
if(check(mid)) {
l=mid+1;
ans=mid;
}
else r=mid-1;
}
cout<<ans<<"\n";
}
main() {
cin>>t;
while(t--) solve();
return 0;
}