社区讨论

90pts WA on #13 求调

P7443 「EZEC-7」加边参与者 1已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@lo19mtuk
此快照首次捕获于
2023/10/22 17:27
2 年前
此快照最后确认于
2023/11/02 17:44
2 年前
查看原帖
CPP
#include <bits/stdc++.h>
#define LL long long
using namespace std;
struct edge{
	LL to,nt;
}a[400005];
LL n,i,j,k,m,cnt=0,t,val1,val2,tmp,ans=0x7fffffffffffffffll,minx,dfs_clock=0;
LL fa[200005],nxt[200005],val[200005],dfn[200005],low[200005],b[200005],min1[200005],min2[200005];
char ch;
bool flag[200005],tag[200005];
void add(LL x,LL y){
	a[++cnt].to=y;a[cnt].nt=nxt[x];nxt[x]=cnt;
}
LL read(){
	tmp=0;
	while(ch<'0' || ch>'9') ch=getchar();
	while(ch>='0' && ch<='9'){
		tmp=tmp*10ll+ch-'0';
		ch=getchar();
	}
	//printf("%d ",tmp);
	return tmp;
	
}
void dfs(LL x){
	if(nxt[x]==0){
		flag[x]=false;
		return ;
	}
	LL cnt=0;
	for(LL i=nxt[x];i;i=a[i].nt){
		dfs(a[i].to);
		if(flag[a[i].to]==false){
			//printf("%d\n",a[i].to);
			cnt++;
		}
	}
	if(cnt==0) flag[x]=false;
	else flag[x]=true;
	//printf("%d %d %d\n",x,cnt,flag[x]);
}
void getmin(){
	min1[0]=0x7ffffffffffffffll;
	for(LL i=1;i<=dfs_clock;i++)
	  min1[i]=min(min1[i-1],b[i]);
	min2[dfs_clock+1]=0x7fffffffffffffffll;
	for(LL i=dfs_clock;i>=1;i--)
	  min2[i]=min(min2[i+1],b[i]);
}
void tagit(LL x){
	if(flag[x]==false){
		dfn[x]=dfs_clock;
		b[++dfs_clock]=val[x];
	}
	tag[x]=true;
	if(flag[x]==true){
		LL cnt=0;
		for(LL i=nxt[x];i;i=a[i].nt)
		  if(flag[a[i].to]==false) cnt++;
		if(cnt>=2){
			return ;
		}
		for(LL i=nxt[x];i;i=a[i].nt)
		  if(flag[a[i].to]==false) tagit(a[i].to);
	}
	else{
		for(LL i=nxt[x];i;i=a[i].nt)
		  tagit(a[i].to);
	}
	low[x]=dfs_clock+1;
}
void dfs1(LL x){
	if(x>1 && flag[x]==false){
		if(tag[x]==true && (dfn[x]>0 || low[x]<dfs_clock+1)) ans=min(ans,min(min1[dfn[x]],min2[low[x]])*1ll*val1+val[x]*1ll*val2);
		else ans=min(ans,min1[dfs_clock]*1ll*val1+val[x]*1ll*val2);
	}
	//printf("%lld %lld\n",x,ans);
	for(LL i=nxt[x];i;i=a[i].nt)
	  dfs1(a[i].to);
}
void csh(){
	for(LL i=1;i<=n;i++){
		nxt[i]=dfn[i]=low[i]=fa[i]=b[i]=0;
		flag[i]=tag[i]=false;
	}
}
int main() {
    t=read();
    LL useless=0;
    while(t--){
    	useless++;
    	minx=0x7fffffffffffffffll;
    	ans=0x7fffffffffffffffll;
    	dfs_clock=0;
    	cnt=0;
    	n=read();k=read();val1=read();val2=read();
    	if(n==1) while(1);
    	for(i=2;i<=n;i++){
    		fa[i]=read();
    		add(fa[i],i);
		}
		for(i=1;i<=n;i++)
		  val[i]=read();
		/*
		for(i=1;i<=n;i++){
			for(j=nxt[i];j;j=a[j].nt)
			  printf("%d ",a[j].to);
			printf("\n");
		}*/
		dfs(1);
		//for(i=1;i<=n;i++)
		  //printf("%d ",flag[i]);
		if(k==0){
			if(flag[1]==true) printf("0\n");
			else if(n==1) printf("-1\n");
			else{
				tagit(1);
				getmin();
				dfs1(1);
				printf("%lld\n",ans);
			}
		}
		else{
		    if(flag[1]==false) printf("0\n");
		    else{
		    	if(n==2){
		    		printf("-1\n");
				}
				else{
					LL cnt1=0;
				    for(i=nxt[1];i;i=a[i].nt)
				      if(flag[a[i].to]==false) cnt1++;
				    if(cnt1>=2){
					    printf("-1\n");
					}
					else{
						LL num=0;
						for(i=nxt[1];i;i=a[i].nt)
				  		  if(flag[a[i].to]==false) {
				  		 	num=a[i].to;
				  			break;
				  		  }
						tagit(num);
						getmin();
						dfs1(1);
						printf("%lld\n",ans);
					}
				}
				
			}
		}
		csh();
	}

	return 0;
}

主体思路和第一页最后一篇题解差不多,但#13的201个点挂了,已经调了一天了qaq

回复

1 条回复,欢迎继续交流。

正在加载回复...