社区讨论
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 条回复,欢迎继续交流。
正在加载回复...