A题

简单的贪心问题,首先把V从前向后每位都分配一个,剩下的V都是无用的了,然后考虑用I将剩下的没有V的位置填充,剩下的从前向后尽可能的分配给前面的位。

#include<bits/stdc++.h>
using namespace std;

typedef long long ll;
int t;
int n,h,x,y;
int a[100010],b[100010];
ll ans,xi;
map<ll,int>q;

void solve()
{
    scanf("%d%d",&n,&h);
    ans = 0;
    q.clear();
    for(int i = 1;i <= n; ++i)
    {
        scanf("%lld",&xi);
        ans ^= xi;
        q[ans]++;
    }
    for(int i = 1;i < n; ++i) scanf("%d%d",&x,&y);
    if(ans && q[ans] == 1) printf("NO\n");
    else printf("YES\n");
}

int main()
{
    scanf("%d",&t);
    while(t--) solve();
    return 0;
}

B题

万能hash解法嘿嘿嘿