题目 | Beautiful Sequence
2023牛客暑期多校训练营7
C - Beautiful Sequence
https://ac.nowcoder.com/acm/contest/57361/C
题意
给定长度为
题解
问题转化
首先,将
由于
为了方便,令
根据限制
综上,本题的问题就是要求解出满足上面这个式子的第
问题求解
首先考虑一个子问题:
如果
,那么 必须取 . ( ) ,那么 必须取 .( ) ,那么 可以任取 (相当于待定)
由于考虑的是二进制最高位,那么这一位满足了
接下来考虑整个问题:
可以从左到右链式求解,仍然是用上面的求解方式确定
不过此时就可能出现冲突,比如
如果有解的话,就会解出一个
如果
代码
#include <bits/stdc++.h>
#define endl '\n'
// #define int long long
using namespace std;
void solve()
{
int n, k;
cin >> n >> k;
vector<int> b(n + 10), pxor(n + 10);
for (int i = 1; i < n; i++)
{
cin >> b[i];
pxor[i] = pxor[i - 1] ^ b[i];
}
vector<int> a1_digit(30, -1);
for (int i = 1; i < n; i++)
{
for (int j = 29; j >= 0; j--)
{
int digit_1 = pxor[i - 1] >> j & 1;
int digit_2 = pxor[i] >> j & 1;
if (digit_1 != digit_2)
{
if (a1_digit[j] == -1)
{
a1_digit[j] = digit_1;
}
else if (a1_digit[j] != digit_1)
{
cout << -1 << endl;
return;
}
break;
}
}
}
k--;
for (int i = 0; i <= 29; i++)
{
if (a1_digit[i] == -1)
{
a1_digit[i] = k & 1;
k >>= 1;
}
}
if (k)
{
cout << -1 << endl;
return;
}
int a1 = 0;
for (int i = 29; i >= 0; i--)
{
a1 = (a1 << 1) + a1_digit[i];
}
cout << a1 << ' ';
for (int i = 1; i < n; i++)
{
a1 ^= b[i];
cout << a1 << ' ';
}
cout << endl;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t = 1;
cin >> t;
while (t--)
solve();
return 0;
}
本文采用 CC BY-SA 4.0 许可,本文 Markdown 源码:Haotian-BiJi