답안 #677066

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
677066 2023-01-02T08:23:57 Z Melika0gh Tug of War (BOI15_tug) C++17
23 / 100
69 ms 21816 KB
#include<bits/stdc++.h>
using namespace std;

typedef long long int ll;
typedef long double   ld;
#define sync	ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define pb		push_back
#define pii		pair<int, int>
#define mp		make_pair
#define fi		first
#define se		second


const int maxn = 3e4 + 10;
int n, k, lst;
vector<int> adj[maxn * 2], tmp[maxn * 2];
vector<int> cycle[maxn];
int s[maxn * 2], l[maxn * 2], r[maxn * 2], vis[maxn * 2], comp[maxn * 2], ans, N, E;
bool mark[maxn * 2];
vector<int> res, path;

void Dfs(int v, int p)
{
	vis[v] = 1;
	comp[v] = lst;
	int tmp_res = 0;
	N++;
	for(int id : adj[v])
	{
		E++;
		if(id == p)
			continue;
		
		int u = l[id] + r[id] - v;
		if(!vis[u])
		{
			path.pb(id);
			Dfs(u, id);
			path.pop_back();
		}
		else if(vis[u] == 1)
		{
			//cout << v << " - " << u << endl;
			path.pb(id);
			int pnt = path.size() - 1;
			while(pnt >= 0)
			{
				mark[l[path[pnt]]] = mark[r[path[pnt]]] = 1;
				if(pnt % 2)
					tmp_res += s[path[pnt]];
				else
					tmp_res -= s[path[pnt]];
					
			//	cout << l[path[pnt]] << " - " << r[path[pnt]] << " : " << s[path[pnt]] << endl;
				cycle[lst].pb(path[pnt]);
				if((l[path[pnt]] == u || r[path[pnt]] == u) && path[pnt] != id)
					break;
				
				pnt--;
			}
			/*mark[l[path[pnt]]] = mark[r[path[pnt]]] = 1;
			cycle[lst].pb(path[pnt]);*/
			/*if(pnt % 2)
				tmp_res += s[path[pnt]];
			else
				tmp_res -= s[path[pnt]];*/
		}
		//cout << endl;
	}
	if(tmp_res)
	{
		//cout << lst << " : " << tmp_res << endl;
		res.pb(tmp_res);
	}
	vis[v] = 2;
}


void Dfs2(int v, int p)
{
	for(int id : adj[v])
	{
		int u = l[id] + r[id] - v;
		if(mark[u] || u == p)
			continue;
		
		Dfs2(u, v);
		if(u > n)
			ans -= s[id];
		else
			ans += s[id];
	}
	
	return;
}

int main()
{
	sync;
	cin >> n >> k;
	for(int i = 1; i <= 2 * n; i++)
	{
		cin >> l[i] >> r[i] >> s[i];
		r[i] += n;
		adj[l[i]].pb(i);
		adj[r[i]].pb(i);
		
	}
	for(int i = 1; i <= 2 * n; i++)
	{
		if(!vis[i])
		{
			lst++;
			N = 0;
			E = 0;
			Dfs(i, 0);
			E /= 2;
			if(N != E)
			{
				cout << "NO" << '\n';
				return 0;
			}
		}
	}
//	cout << lst << endl;
	for(int i = 1; i <= 2 * n; i++)
	{
		if(mark[i])
		{
			Dfs2(i, 0);
		}
	}
	sort(res.begin(), res.end());
//	reverse(res.begin(), res.end());
//	cout << ans << endl;
	for(int x : res)
	{
		if(ans < 0)
			ans += abs(x);
		else
			ans += 0 - abs(x);
		
	//	cout << x << " : " << ans << endl;
	}
	
	if(abs(ans) > k)
		cout << "NO" << '\n';
	else
		cout << "YES" << '\n';
	
	return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 3796 KB Output is correct
2 Incorrect 2 ms 3796 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 3796 KB Output is correct
2 Incorrect 2 ms 3796 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 10 ms 5204 KB Output is correct
2 Correct 8 ms 4820 KB Output is correct
3 Correct 12 ms 5296 KB Output is correct
4 Correct 10 ms 4732 KB Output is correct
5 Correct 12 ms 5332 KB Output is correct
6 Correct 11 ms 4820 KB Output is correct
7 Correct 11 ms 5312 KB Output is correct
8 Correct 12 ms 4924 KB Output is correct
9 Correct 10 ms 5332 KB Output is correct
10 Correct 9 ms 4852 KB Output is correct
11 Correct 10 ms 5332 KB Output is correct
12 Correct 8 ms 4820 KB Output is correct
13 Correct 11 ms 5400 KB Output is correct
14 Correct 12 ms 5348 KB Output is correct
15 Correct 9 ms 4800 KB Output is correct
16 Correct 10 ms 5332 KB Output is correct
17 Correct 9 ms 4948 KB Output is correct
18 Correct 11 ms 5332 KB Output is correct
19 Correct 9 ms 4948 KB Output is correct
20 Correct 11 ms 5268 KB Output is correct
21 Correct 69 ms 21816 KB Output is correct
22 Correct 11 ms 5204 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 3796 KB Output is correct
2 Incorrect 2 ms 3796 KB Output isn't correct
3 Halted 0 ms 0 KB -