Submission #70570

#TimeUsernameProblemLanguageResultExecution timeMemory
70570KLPPCats or Dogs (JOI18_catdog)C++14
38 / 100
3007 ms31664 KiB
#include "catdog.h"
#include<vector>
#include<iostream>
#include<queue>
using namespace std;
typedef long long int lld;
int x;
vector<int> tree[1000000];
int animal[1000000];
int n;
void initialize(int N, std::vector<int> A, std::vector<int> B) {
	n=N;
	vector<int>nei[N];
	for(int i=0;i<N-1;i++){A[i]--;B[i]--;
		nei[A[i]].push_back(B[i]);
		nei[B[i]].push_back(A[i]);
	}
	queue<int>q;
	int dist[n];
	for(int i=0;i<n;i++){
		dist[i]=-1;
	}
	dist[0]=0;	
	q.push(0);
	dist[0]=0;
	while(!q.empty()){
		int u=q.front();q.pop();
		for(int i=0;i<nei[u].size();i++){
			int v=nei[u][i];
			if(dist[v]==-1){
				dist[v]=dist[u]+1;
				q.push(v);
			}
		}
	}
	for(int i=0;i<n-1;i++){
		if(dist[A[i]]>dist[B[i]]){//cout<<B[i]<<" "<<A[i]<<endl;
			tree[B[i]].push_back(A[i]);
		}else{//cout<<A[i]<<" "<<B[i]<<endl;
			tree[A[i]].push_back(B[i]);
		}
	}
	for(int i=0;i<n;i++)animal[i]=0;
}

lld DP[1000000][3];

lld trabalha(int node,int territory){
	if(DP[node][territory]!=-1)return DP[node][territory];
	if(animal[node]>0 && territory!=animal[node])return 1000000000;
	if(tree[node].size()==0){
		DP[node][territory]=0;
		return 0;
	}
	DP[node][territory]=0;
	if(territory==1){
		for(int i=0;i<tree[node].size();i++){int v=tree[node][i];
			DP[node][territory]+=min(1+trabalha(v,0),min(trabalha(v,1),1+trabalha(v,2)));
		}
	}
	if(territory==2){
		for(int i=0;i<tree[node].size();i++){int v=tree[node][i];
			DP[node][territory]+=min(1+trabalha(v,0),min(trabalha(v,2),1+trabalha(v,1)));
		}
	}
	if(territory==0){
		for(int i=0;i<tree[node].size();i++){int v=tree[node][i];
			DP[node][territory]+=min(trabalha(v,0),min(1+trabalha(v,1),1+trabalha(v,2)));
		}
	}
	return DP[node][territory];
}
int cat(int v) {v--;
	animal[v]=1;
	for(int i=0;i<n;i++){
		DP[i][0]=-1;
		DP[i][1]=-1;
		DP[i][2]=-1;
	}
	//cout<<trabalha(0,1)<<endl;
	return min(trabalha(0,0),min(trabalha(0,1),trabalha(0,2)));
}

int dog(int v) {v--;
	animal[v]=2;
	for(int i=0;i<n;i++){
		DP[i][0]=-1;
		DP[i][1]=-1;
		DP[i][2]=-1;
	}
	return min(trabalha(0,0),min(trabalha(0,1),trabalha(0,2)));
}

int neighbor(int v){v--;
	animal[v]=0;
	for(int i=0;i<n;i++){
		DP[i][0]=-1;
		DP[i][1]=-1;
		DP[i][2]=-1;
	}
	return min(trabalha(0,0),min(trabalha(0,1),trabalha(0,2)));
}

Compilation message (stderr)

catdog.cpp: In function 'void initialize(int, std::vector<int>, std::vector<int>)':
catdog.cpp:28:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int i=0;i<nei[u].size();i++){
               ~^~~~~~~~~~~~~~
catdog.cpp: In function 'lld trabalha(int, int)':
catdog.cpp:57:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int i=0;i<tree[node].size();i++){int v=tree[node][i];
               ~^~~~~~~~~~~~~~~~~~
catdog.cpp:62:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int i=0;i<tree[node].size();i++){int v=tree[node][i];
               ~^~~~~~~~~~~~~~~~~~
catdog.cpp:67:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int i=0;i<tree[node].size();i++){int v=tree[node][i];
               ~^~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...