0分求调,悬赏1关
查看原帖
0分求调,悬赏1关
409774
Maysoul楼主2023/7/13 21:11

好像是DP的问题,但是我调不出来QAQ

目前就是MLE+TLE+WA,毫无疑问是死循环了

//2023/7/13
//别着急,先通读一遍题目
//别忘了开long long
//写完先看一遍怎么降复杂度
//要么开全局变量要么给定初值
//想想看,有什么情况需要特判
//看看数组开的够不够大
//std::ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e6+10;
int num,ans;
struct linkstar{
	int from,to,next,w;
}edge[2*MAXN];
int head[MAXN];
int escnt=0;
void add(int from,int to)
{
	edge[++escnt].from=from;
	edge[escnt].to=to;
	edge[escnt].next=head[from];
	head[from]=escnt;
}
int f1[MAXN][2],f2[MAXN][2];
int a[MAXN];
int bk,ht;
bool vis[MAXN];
int root;
void dp1(int x,int fa)
{
	//if(x==ht) return;
	f1[x][1]=a[x];
	//cout<<x<<endl;
	for (int i=head[x];i!=-1;i=edge[i].next){
		int y=edge[i].to;
		if(y==fa) continue;
		if(i==root||(i^1)==root) continue;
		dp1(y,x);
		f1[x][0]+=max(f1[y][0],f1[y][1]);
		f1[x][1]+=f1[y][0]; 
	}
}
void dp2(int x,int fa)
{
	//if(x==bk) return;
	f2[x][1]=a[x];
	for (int i=head[x];i!=-1;i=edge[i].next){
		int y=edge[i].to;
		if(y==fa) continue;
		if(i==root||(i^1)==root) continue;
		dp2(y,x);
		f2[x][0]+=max(f2[y][0],f2[y][1]);
		f2[x][1]+=f2[y][0]; 
	}
}

void dfs(int x,int fa)
{
	vis[x]=1;
	for (int i=head[x];i!=-1;i=edge[i].next){
		int y=edge[i].to;
		if(y==fa) continue;
		if(!vis[y]) dfs(y,x);
		else{
			bk=x;
			ht=y;
			root=i;
			return;
		}
	}
}
int main()
{
	memset(head,-1,sizeof(head));
	int n,pos;
	cin>>n;
	for (int i=1;i<=n;i++){
		cin>>a[i]>>pos;
		add(pos,i);
		add(i,pos);
	}
	for (int i=1;i<=n;i++){
		if(!vis[i]){
			ht=bk=0;
			dfs(i,0);
			//cout<<ht<<" "<<bk<<endl;
			if(bk&&ht){
				dp1(bk,0);
				dp2(ht,0);
				ans+=max(f1[bk][0],f2[ht][0]);
				//cout<<ans<<endl;
			}
		}
		
	
	}
	cout<<ans<<endl;
	return 0;
}
2023/7/13 21:11
加载中...