답안 #677067

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
677067 2023-01-02T08:25:29 Z Melika0gh Tug of War (BOI15_tug) C++17
23 / 100
34 ms 13444 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);
		//	cout << v << " - " << u << " : " << path.size() << endl;
			Dfs(u, id);
			path.pop_back();
		}
		else if(vis[u] == 1)
		{
			//cout << id << endl;
			mark[l[id]] = mark[r[id]] = 1;
			int pnt = path.size();
			//cout << v << " - " << u << " : " << pnt << endl;
			if(pnt % 2)
				tmp_res += s[id];
			else
				tmp_res -= s[id];
			
			pnt--;
			while(pnt > 0 && l[path[pnt]] != u && r[path[pnt]] != u)
			{
				mark[l[path[pnt]]] = mark[r[path[pnt]]] = 1;
				if(pnt % 2)
					tmp_res += s[path[pnt]];
				else
					tmp_res -= s[path[pnt]];
					
			//	cout << path[pnt] << " , " ;
				cycle[lst].pb(path[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 9 ms 5208 KB Output is correct
2 Correct 8 ms 4820 KB Output is correct
3 Correct 10 ms 5200 KB Output is correct
4 Correct 7 ms 4692 KB Output is correct
5 Correct 11 ms 5112 KB Output is correct
6 Correct 8 ms 4752 KB Output is correct
7 Correct 9 ms 5204 KB Output is correct
8 Correct 8 ms 4692 KB Output is correct
9 Correct 9 ms 5204 KB Output is correct
10 Correct 10 ms 4780 KB Output is correct
11 Correct 11 ms 5204 KB Output is correct
12 Correct 9 ms 4692 KB Output is correct
13 Correct 10 ms 5100 KB Output is correct
14 Correct 11 ms 5192 KB Output is correct
15 Correct 8 ms 4788 KB Output is correct
16 Correct 12 ms 5220 KB Output is correct
17 Correct 8 ms 4820 KB Output is correct
18 Correct 9 ms 5204 KB Output is correct
19 Correct 8 ms 4820 KB Output is correct
20 Correct 9 ms 5192 KB Output is correct
21 Correct 34 ms 13444 KB Output is correct
22 Correct 9 ms 4948 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 -