D. Array Differentiation
题意:
给定一个序列
a
a
a,长度为
n
n
n,判断是否存在这样一个序列
b
b
b,满足
i
,
j
,
k
∈
[
1
,
n
]
i,j,k\in[1,n]
i,j,k∈[1,n],
a
i
=
b
j
−
b
k
a_i=b_j-b_k
ai=bj−bk
思路:
给定的关系可以转化为图论的问题
把
b
i
b_i
bi 看作点权,
a
i
a_i
ai 看作边权,
因为图中有
n
n
n 个点,
n
n
n 条边
因此存在解时,当且仅当,存在一个环,从权值和为
0
0
0
大概长这样
数据非常小,
n
<
=
10
n<=10
n<=10
三进制枚举边权判断是否存在这样的环
code:
#include<bits/stdc++.h>
#define endl '\n'
#define ll long long
#define ull unsigned long long
#define ld long double
#define all(x) x.begin(), x.end()
#define eps 1e-6
using namespace std;
const int maxn = 2e6 + 9;
const int mod = 1e9 + 7;
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3f;
ll n, m;
int a[11];
void work()
{
cin >> n;
int sum = 1;
for(int i = 1; i <= n; ++i) cin >> a[i], sum *= 3;
for(int i = 1; i < sum; ++i){
int d = i, ans = 0;
for(int j = 1; j <= n; ++j){
if(d % 3 == 1) ans += a[j];
else if(d % 3 == 2) ans -= a[j];
d /= 3;
}
if(!ans){
cout << "YES\n";return;
}
}
cout << "NO\n";
}
int main()
{
ios::sync_with_stdio(0);
int TT;cin>>TT;while(TT--)
work();
return 0;
}