Submission #772884

#TimeUsernameProblemLanguageResultExecution timeMemory
772884Ahmed57Tug of War (BOI15_tug)C++17
100 / 100
1061 ms10960 KiB
#include <bits/stdc++.h>
using namespace std;
const int mxN=6e4;
int n, k, l[mxN], r[mxN], s[mxN], dp0;
set<int> pc[mxN];
bitset<20*mxN+1> dp;
queue<int> qu;
vector<int> vc;
void fk(){
	cout << "NO";
	exit(0);
}
int main() {
	ios_base::sync_with_stdio(0);
	cin.tie(0);

	cin >> n >> k;
	n*=2;
	for(int i=0; i<n; ++i) {
		cin>>l[i]>>r[i]>>s[i], --l[i], r[i]+=n/2-1;
		pc[l[i]].insert(i);
		pc[r[i]].insert(i);
	}
	for(int i=0; i<n; ++i) {
		if(!pc[i].size())fk();
		else if(pc[i].size()==1)qu.push(i);
	}
	dp0=10*n;
	while(qu.size()){
		int u=qu.front();
		if(!pc[u].size())fk();
		qu.pop();
		int a=*pc[u].begin(),v=u^l[a]^r[a];
		dp0+=u<n/2?s[a]:-s[a];
		pc[v].erase(a);
		if(pc[v].size()==1)qu.push(v);
	}
	for(int i=0;i<n;++i) {
		if(pc[i].size()<2)
			continue;
		int c=0;
		for(int j=i; pc[j].size(); ) {
			int a=*pc[j].begin();
			c+=j<n/2?s[a]:-s[a];
			pc[l[a]].erase(a);
			pc[r[a]].erase(a);
			j^=l[a]^r[a];
		}
		c=abs(c);
		dp0-=c;
		vc.push_back(2*c);
	}
	dp[dp0]=1;
	for(int c:vc)dp|=dp<<c;
	bool ok=0;
	for(int i=10*n-k;i<=10*n+k&&!ok;++i)
		ok=dp[i];
	if(!ok)fk();
	cout << "YES";
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...