제출 #1324280

#제출 시각아이디문제언어결과실행 시간메모리
1324280boclobanchatTug of War (BOI15_tug)C++20
100 / 100
949 ms13292 KiB
#include<bits/stdc++.h>
using namespace std;
struct team { int l,r,v; };
struct edge { int pe,nex,val; };
const int MAXN=6e4+36;
bitset<MAXN*10> bt;
team A[MAXN];
vector<edge> ds[MAXN];
set<int> st[MAXN],stt;
bool ck[MAXN],dis[MAXN];
int fx=0,fy=0;
void dfs(int i,int pre,int n)
{
	ck[i]=true;
	for(auto v:ds[i]) if(v.pe!=pre)
	{
		if(i<=n) fx+=v.val;
		else fy+=v.val;
		if(!ck[v.nex]) dfs(v.nex,v.pe,n);
		break;
	}
}
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int n,k,sum=0,cc=0,cd=0;
    cin>>n>>k;
    for(int i=1;i<=n*2;i++)
    {
    	int x,y,v;
    	cin>>x>>y>>v;
//    	ds[x].push_back({i,y+n,v}),ds[y+n].push_back({i,x,v}),sum+=v;
    	st[x].insert(i),st[y+n].insert(i),A[i]={x,y+n,v},sum+=v;
	}
	for(int i=1;i<=n*2;i++) if(st[i].size()==1) stt.insert(i);
	while(!stt.empty())
	{
		int a=*stt.begin(),p=*st[a].begin();
		dis[p]=true;
		if(st[A[p].l].size()==1&&st[A[p].r].size()==1) return cout<<"NO",0;
		stt.erase(A[p].l),stt.erase(A[p].r);
		st[A[p].l].erase(p),st[A[p].r].erase(p);
		if(st[A[p].l].size()==1) stt.insert(A[p].l);
		if(st[A[p].r].size()==1) stt.insert(A[p].r);
		if(a<=n) cc+=A[p].v;
		else cd+=A[p].v;
	}
	bt[cc]=bt[cd]=1;
	for(int i=1;i<=n*2;i++) if(!dis[i])
	{
		int x=A[i].l,y=A[i].r,v=A[i].v;
		ds[x].push_back({i,y,v}),ds[y].push_back({i,x,v});
	}
	for(int i=1;i<=n*2;i++) if(ds[i].size()>2) return cout<<"NO",0;
	int cnt=0;
	for(int i=1;i<=n*2;i++) if(!ck[i])
	{
		fx=fy=0;
		dfs(i,0,n);
		bt=(bt<<fx)|(bt<<fy);
	}
	bool ck=false;
	for(int i=0;i<=sum/2;i++) if(abs(sum-i*2)<=k) ck|=bt[i];
	if(ck) cout<<"YES";
	else cout<<"NO";
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...