제출 #480985

#제출 시각아이디문제언어결과실행 시간메모리
480985pure_memTug of War (BOI15_tug)C++17
100 / 100
641 ms8448 KiB
#include <bits/stdc++.h>

#define ll long long
#define X first
#define Y second
#define MP make_pair

using namespace std;

const int N = 6e4 + 1, M = 10 * N;
const int mod = 1e9 + 7;

int n, k, deg[N], vis[N], w[N];
vector< pair<int, int> > g[N];
bitset<M> dp;

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0), cout.tie(0);
	
	cin >> n >> k;
	int sum = 0;
	for(int i = 1, x, y;i <= n + n;i++) {
		cin >> x >> y >> w[i], y += n;
		g[x].push_back(MP(y, i)), deg[x]++;
		g[y].push_back(MP(x, i)), deg[y]++;
	}
	{
		set< pair<int, int> > st;
		for(int i = 1;i <= n + n;i++)
			st.insert(MP(deg[i], i));
		while(!st.empty()) {
			int pos = st.begin()->Y;
			st.erase(st.begin());
			if(deg[pos] == 0) return cout << "NO", 0;
			else if(deg[pos] != 1) break;

			for(auto [to, id]: g[pos]) {
				if(vis[id]) continue;

				vis[id] = 1;
				st.erase(MP(deg[to], to));
				if(pos > n) sum -= w[id];
				else sum += w[id];
				deg[to]--, deg[pos]--;
				st.insert(MP(deg[to], to));
				
				break;
			}
		}
	}
	dp[0] = 1;
	for(int i = 1;i <= n + n;i++) {
		int bl = 0;
		function<void(int)> dfs;
		dfs = [&](int v){
			int cnt = 0;
			for(auto [to, id]: g[v]) {
				if(vis[id]) continue;
				
				vis[id] = 1;
				if(v <= n) bl += w[id];
				else bl -= w[id];
				dfs(to);

				cnt++;
			}
			assert(cnt <= 1);
		};
		dfs(i);
		if(bl == 0) continue;
		bl = abs(bl), sum += bl, dp |= dp << bl;
	}
	string ans = "NO";
	for(int i = 0;i < M;i++) {
		if(dp[i] && abs(sum - 2 * i) <= k) {
			ans = "YES";
		}
	}
	cout << ans;

	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...