제출 #406378

#제출 시각아이디문제언어결과실행 시간메모리
406378EncryptingWolfToy Train (IOI17_train)C++14
49 / 100
2079 ms3148 KiB
#include <iostream>
#include <algorithm>
#include <vector>
#include <map>
#include <unordered_set>
#include <tuple>
//typedef long long int;
#define FOR(i,x,y) for(int i = x; i < y; i++)
using namespace std;

vector<int> players;
vector<unordered_set<int>> adj;
vector<int> inCounts;

unordered_set<int> badNodesF;
unordered_set<int> batteries;
unordered_set<int> nodesLeft;
#include <stack>

void dfs(bool playerWants, unordered_set<int>& badNodes, vector<int>& visited, vector<int>& starts)
{
	vector<pair<int,int>> s;
	s.reserve(starts.size());
	for (auto i : starts)
		s.push_back({ i,true });
	while (s.size())
	{
		int node = s[s.size() - 1].first;
		bool losing = s[s.size() - 1].second;
		s.pop_back();
		/*if (badNodesF.count(node))
			continue;*/

		visited[node]++;
		if (players[node] == playerWants)
		{
			if (visited[node] != 1)
				continue;
			else
			{
				badNodes.emplace(node);
			}
		}
		else
		{
			if (losing&&visited[node] <= inCounts[node])
			{
				visited[node] = inCounts[node] + 2; badNodes.emplace(node);
			}
			else {
				if (visited[node] != inCounts[node])
				{
					continue;
				}
				else
				{

					badNodes.emplace(node);
				}
			}
		}

		for (auto i : adj[node])
		{
			//dfs(i, playerWants, badNodes, visited, false);
			s.push_back({ i,false });
		}
	}
}


vector<int> who_wins(vector<int> a, vector<int> r, vector<int> u, vector<int> v)
{
	int n = a.size();
	players = a;
	inCounts.resize(n);

	adj.resize(n);
	FOR(i, 0, u.size())
	{
		adj[v[i]].emplace(u[i]);
		inCounts[u[i]] += 1;

	}
	FOR(i, 0, n)
	{
		if (r[i])
			batteries.emplace(i);
		nodesLeft.emplace(i);
	}
	vector<int> visited2(n);
	vector<int> visited(n);

	while (true)
	{
		for (auto i : nodesLeft)
		{
			visited[i] = 0;
			visited2[i] = 0;
		}
		unordered_set<int> badNodes;

		vector<int> s;
		for (auto i : batteries)
		{

			badNodes.emplace(i);
			s.push_back(i);
		}
		dfs(true, badNodes, visited, s);

		unordered_set<int> badNodes2;

		vector<int> k;
		for (auto i : nodesLeft)
		{
			if (badNodes.count(i) == 0 && badNodesF.count(i) == 0)
			{
				badNodes2.emplace(i);
				k.push_back(i);
			}
		}

		dfs(false, badNodes2, visited2, k);
		for (auto i : badNodes2)
		{
			//			if (badNodes2.count(i))
				//		{
			r[i] = 0;
			batteries.erase(i);
			//	}
		}
		if (badNodes2.size() == 0)
			break;


		/*for (auto i : badNodes2)
			cout << i;*/
			//cout << endl;
			//badNodesF = badNodes2;

		for (auto j : nodesLeft)
		{
			auto& i = adj[j];
			for (auto j : badNodes2)
			{
				i.erase(j);
			}

		}
		for (auto i : badNodes2)
		{
			nodesLeft.erase(i);
			badNodesF.emplace(i);
			for (auto j : adj[i])
				inCounts[j]--;
		}

	}

	// !badNodes is B
	// Badnodes2 are B
	// Neither is B
	vector<int> re;
	FOR(i, 0, n)
	{
		if (badNodesF.count(i))
			re.push_back(0);
		else
			re.push_back(1);
	}
	return re;
}

컴파일 시 표준 에러 (stderr) 메시지

train.cpp: In function 'std::vector<int> who_wins(std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>)':
train.cpp:8:37: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
    8 | #define FOR(i,x,y) for(int i = x; i < y; i++)
......
   79 |  FOR(i, 0, u.size())
      |      ~~~~~~~~~~~~~~                  
train.cpp:79:2: note: in expansion of macro 'FOR'
   79 |  FOR(i, 0, u.size())
      |  ^~~
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...