Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- #define lli long long int
- #define yy cout << "YES" << endl
- #define nn cout << "NO" << endl
- #define pb push_back
- #define ff first
- #define ss second
- #define pll pair<lli, lli>
- #define ll 1ll*
- void oj() {
- #ifndef ONLINE_JUDGE
- freopen("input.txt", "r", stdin);
- freopen("output.txt", "w", stdout);
- #endif
- }
- long long int inf = 1000000007;
- #define all(x) x.begin(), x.end()
- const char nl = '\n';
- void ipv(vector<lli>&v, lli n) {
- for (lli i = 0; i < n; i++)cin >> v[i];
- }
- void opv(vector<lli>&v) {
- for (lli i = 0; i < v.size(); i++)cout << v[i] << " ";
- }
- void ipvm(vector<lli>&v, lli n, map<lli, lli>&mp) {
- for (lli i = 0; i < n; i++)mp[v[i]]++;
- }
- void opvm(map<lli, lli>mp) {
- for (auto it : mp)cout << it.first << " " << it.second << " ";
- cout << nl;
- }
- void ips(string s) {
- cin >> s;
- }
- lli gcd(lli a, lli b)
- {
- if (a == 0)
- return b;
- return gcd(b % a, a);
- }
- lli lcm(lli a, lli b)
- {
- return (a / gcd(a, b)) * b;
- }
- bool ispow2(lli x) {
- return (x & (x - 1)) == 0;
- }
- bool iskthset(lli n, lli k) {
- return ((n >> (k)) & 1) > 0;
- }
- void setK(lli &n, lli k) {
- lli t = n;
- t = t | (1 << k);
- n = t;
- }
- void unsetK(lli &n, lli k) {
- lli t = n;
- t = t & ~(1 << k);
- n = t;
- }
- void toggleKbit(lli &n, lli k) {
- lli t = n;
- t = (t) ^ (1 << (k));
- n = t;
- }
- // n^x
- lli binexpo(lli n, lli x) {
- lli res = 1;
- while (x > 0) {
- if (x & 1)
- res = res * n;
- n = n * n;
- x >>= 1;
- }
- return res;
- }
- // (n^x) % m
- lli binexpomod(lli n, lli x, long long m) {
- n %= m;
- lli res = 1;
- while (x > 0) {
- if (x & 1)
- res = res * n % m;
- n = n * n % m;
- x >>= 1;
- }
- return res;
- }
- bool isPrm(lli n)
- {
- if (n <= 1)
- return false;
- for (lli i = 2; i <= sqrt(n); i++)
- if (n % i == 0)
- return false;
- return true;
- }
- bool func() {
- }
- lli bs(/*...*/ lli hi, lli lo, lli n) {
- lli ans = -1;
- while (lo <= hi ) {
- lli mid = lo + (hi - lo + 1) / 2;
- bool ss = func();
- if (ss) {
- ans = mid, hi = mid - 1;
- }
- else lo = mid + 1;
- }
- return ans;
- }
- int numberofset(int n) {
- return
- __builtin_popcount(n);
- //if X is an integer
- }
- lli numberofsetll(lli n) {
- return
- __builtin_popcountll(n);
- //if X is a long long
- }
- //
- //
- //
- //
- //
- lli ldfs(lli v, std::vector<std::vector<lli>>&g, std::vector<lli>&vis, std::vector<lli> &Xor, std::vector<lli> &vec) {
- //action for vertex after entering
- vis[v] = 1;
- Xor[v] = vec[v];
- for (lli c : g[v]) {
- // cout << v << " -> " << c << nl;
- //action for child before exploring
- if (!vis[c]) {
- lli childXor = ldfs(c, g, vis, Xor, vec);
- Xor[v] = (Xor[v] ^ childXor);
- }
- ////action for child after exploring
- }
- return Xor[v];
- //action for vertex before exiting;
- }
- lli c = 0;
- lli ldfs2(lli v, std::vector<std::vector<lli>>&g, std::vector<lli>&vis, std::vector<lli> &Xor, std::vector<lli> &vec, lli xr) {
- //action for vertex after entering
- vis[v] = 1;
- lli tp = vec[v];
- for (lli c : g[v]) {
- // cout << v << " -> " << c << nl;
- //action for child before exploring
- if (!vis[c])
- tp = (tp ^ ldfs2(c, g, vis, Xor, vec, xr));
- ////action for child after exploring
- }
- if (tp == xr) {
- tp = 0;
- c++;
- }
- return tp;
- //action for vertex before exiting;
- }
- void cf()
- {
- lli f = 0, e = 2, o = 0;
- lli n, k;
- cin >> n >> k;
- std::vector<std::vector<lli>> g(n, std::vector<lli>(n));
- std::vector<lli> vis(n, 0);
- std::vector<lli>Xor(n, 0);
- std::vector<lli> vec(n);
- ipv(vec, n);
- lli res = 0;
- for (int i = 0; i < n; ++i)
- {
- res ^= vec[i];
- }
- for (int i = 0; i < n - 1; ++i)
- {
- lli u, v;
- cin >> u >> v;
- u--, v--;
- g[u].pb(v);
- g[v].pb(u);
- }
- ldfs(0, g, vis, Xor, vec);
- // cout << res << " " << Xor[0] << nl;
- if (Xor[0] == 0) {
- yy;
- return;
- }
- else {
- for (int i = 0; i < n; ++i)
- {
- vis[i] = 0;
- }
- c = 0;
- ldfs2(0, g, vis, Xor, vec, Xor[0]);
- // cout << c << nl;
- if (c > 2 && k > 2) {
- yy;
- } else
- nn;
- }
- //vector<lli>vec(n);
- //ipv(vec,n);
- }
- int main()
- {
- ios_base::sync_with_stdio(0);
- cin.tie(0);
- cout.tie(0);
- oj();
- lli t = 1;
- cin >> t;
- while (t--)
- {
- cf();
- }
- }
- //-----------------------------------comments----------------------------------------------------------------------------
- //lb(x)= ele eq or greater then x (first occ)
- //ub(x)= ele greater then x
- // A + B = (A xor B) + 2 * (A & B)
- // A + B = (A | B) + (A & B)
- // X << k) gives X multiplied by (2^k)
- // (X >> k) gives X divided by (2^k)
Add Comment
Please, Sign In to add comment