标签:ch return sum long CF1552D dfs Differentiation Array define
感觉很妙的题。
首先对于题目中 \(a_i=b_j-b_k\) 这个条件,可以理解为 \(j\) 向 \(k\) 连一条有向边来表示 \(a_i\),同样的可以用 \(k\) 向 \(j\) 连一条有向边来表示 \(-a_i\)。
那么可以建出一个 \(n\) 个点 \(n\) 条边的有向图,图中一定至少存在一个环,如果没有环一定不能满足。
那么顺着环不难得到我们要求是否存在一个边的集合 \(A\),使得 \(\displaystyle \sum_{i \in A} s_i a_i\),其中 \(s_i \in \{1,-1\}\)。
那么枚举每一个 \(a_i\) 选正,负,不选,dfs 一遍即可。
#include <bits/stdc++.h>
#define reg register
#define fi first
#define se second
#define mp std::make_pair
#define pb push_back
typedef long long ll;
typedef unsigned long long ull;
int rd()
{
reg int x=0,f=0;
reg char ch=getchar();
while(!isdigit(ch)) (ch=='-')&&(f=1),ch=getchar();
while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
return f?-x:x;
}
const int MAXN=25;
int n,a[MAXN];
bool dfs(reg int x,reg int sta,reg int sum)
{
if(sta&&!sum) return 1;
if(x>n) return 0;
if(dfs(x+1,sta,sum)) return 1;
if(dfs(x+1,sta+1,sum+a[x])) return 1;
if(dfs(x+1,sta+1,sum-a[x])) return 1;
return 0;
}
void work()
{
n=rd();
for(reg int i=1;i<=n;++i) a[i]=rd();
puts(dfs(1,0,0)?"YES":"NO");
}
int main()
{
int _=1;
_=rd();
while(_--) work();
return 0;
}
标签:ch,return,sum,long,CF1552D,dfs,Differentiation,Array,define 来源: https://www.cnblogs.com/Lonely-233/p/15100236.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。