Submission #1096321

#TimeUsernameProblemLanguageResultExecution timeMemory
1096321vjudge1The Xana coup (BOI21_xanadu)C++14
100 / 100
41 ms24672 KiB
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<cstdlib>
#define int long long
using namespace std;
const int N=114514;
const int inf=0x3f3f3f3f;
int n,m,s,l,v[N<<1],first[N],nxt[N<<1],fa[N],tpedge,op[N],f[N][2][2];
vector<int>son[N];
void add(int a,int b)
{
	tpedge++;
	v[tpedge]=b;
	nxt[tpedge]=first[a];
	first[a]=tpedge;
}
void pre(int x)
{
	int i;
	for(i=first[x];i;i=nxt[i])
	{
		int y=v[i];
		if(y==fa[x])
			continue;
		fa[y]=x;
		son[x].push_back(y);
		pre(y);
	}
}
/*
i   id
0/1 not do / do
0/1 val= 0 / 1
*/
inline void solve(int x)
{
	int i;
	if(son[x].empty())
	{
		f[x][0][op[x]]=0;
		f[x][1][op[x]^1]=1;
		f[x][0][op[x]^1]=inf;
		f[x][1][op[x]]=inf;
		return ;
	}
	for(auto y:son[x])
		solve(y);
	int mi[2];
//	for(i=0;i<=1;i++)
//	{
//		mi[op[x]^i]=0;
//		mi[op[x]^i^1]=inf;
		mi[0]=0;
		mi[1]=inf;
		for(auto y:son[x])
		{
			int a=f[y][0][0],b=f[y][1][0];
			int u=mi[0],v=mi[1];
			mi[0]=min(u+a,v+b);
			mi[1]=min(v+a,u+b);
			//f[0/1][0];
		}
		f[x][0][0]=mi[op[x]];
		f[x][0][1]=mi[op[x]^1];
//	}

//	for(i=0;i<=1;i++)
//	{
		mi[0]=0;
		mi[1]=inf;
		for(auto y:son[x])
		{
			int a=f[y][0][1],b=f[y][1][1];
			int u=mi[0],v=mi[1];
			mi[0]=min(u+a,v+b);
			mi[1]=min(v+a,u+b);
		}
		f[x][1][0]=mi[op[x]^1]+1;
		f[x][1][1]=mi[op[x]]+1;
//	}
//	cout<<x<<" "<<f[x][0][0]<<" "<<f[x][0][1]<<" "<<f[x][1][0]<<" "<<f[x][1][1]<<endl;
}
signed main()
{
//	freopen("qwq.in","r",stdin);
//	freopen("ans.out","w",stdout);
	scanf("%lld",&n);
	for(int i=1;i<n;i++)
	{
		int x,y;
		scanf("%lld%lld",&x,&y);
		add(x,y);
		add(y,x);
	}
	for(int i=1;i<=n;i++)
	{
		scanf("%lld",&op[i]);
	}
	pre(1);
	solve(1);
	int ans=min(f[1][0][0],f[1][1][0]);
	if(ans>=inf)
		puts("impossible");
	else
		printf("%lld",min(f[1][0][0],f[1][1][0]));
}

Compilation message (stderr)

xanadu.cpp: In function 'void solve(long long int)':
xanadu.cpp:39:6: warning: unused variable 'i' [-Wunused-variable]
   39 |  int i;
      |      ^
xanadu.cpp: In function 'int main()':
xanadu.cpp:89:7: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   89 |  scanf("%lld",&n);
      |  ~~~~~^~~~~~~~~~~
xanadu.cpp:93:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   93 |   scanf("%lld%lld",&x,&y);
      |   ~~~~~^~~~~~~~~~~~~~~~~~
xanadu.cpp:99:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   99 |   scanf("%lld",&op[i]);
      |   ~~~~~^~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...