一个疑问
查看原帖
一个疑问
935908
zengziqvan楼主2024/7/31 13:18

以下代码的思路是二分答案然后判定是否可行。

每次判定 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;
}
2024/7/31 13:18
加载中...