XXII Open Cup named after E.V. Pankratiev, Grand Prix of IMO A
题目大意:
给你一个大小为
n
n
n的集合
s
s
s,要求你构造序列a,使得任何
x
=
a
i
A
N
D
a
i
+
1
A
N
D
…
A
N
D
a
j
(
1
≤
i
≤
j
≤
l
e
n
g
t
h
(
a
)
)
x=a_{i} AND a_{i+1} AND\dots AND a_{j} (1 \leq i \leq j \leq length(a))
x=aiANDai+1AND…ANDaj(1≤i≤j≤length(a)) 都在给定的集合中,或报告不可能存在合法序列。
基本思路:
求出所有集合中元素的
A
N
D
AND
AND值
k
k
k,如果
k
k
k不出现在集合中,则不存在合法序列,反之,在每个元素之间都插入
k
k
k,这样能够保证每种区间的
A
N
D
AND
AND值为集合中的元素或者
k
k
k
代码:
#include <bits/stdc++.h>
using namespace std;
#define Paddi ios::sync_with_stdio(0),cin.tie(0)
signed main()
{
Paddi;
int T;
cin >> T;
while (T--)
{
int n;
cin >> n;
set<int> s;
int ans = (1ll << 60) - 1ll;
for (int i = 1; i <= n; i++)
{
int x;
cin >> x;
ans &= x;
s.insert(x);
}
if (s.find(ans) != s.end())
{
cout << 2 * s.size() << endl;
for (auto i : s)
cout << i << " " << ans << " ";
}
else
cout << -1;
cout << endl;
}
return 0;
}