Pagini recente » Cod sursa (job #3240314) | Cod sursa (job #2583791) | Cod sursa (job #2495003) | Cod sursa (job #1291780) | Cod sursa (job #1442398)
#include <bits/stdc++.h>
using namespace std;
#define inf 0x0f0f0f
const int MAXN = 25010;
int n, L, val[MAXN];
//priority_queue<int, vector<int>, [](auto l, auto r) -> int { return val[l] < val[r]; }> H;
int H[2 * MAXN + 100], POZ[MAXN], V[MAXN], vec[MAXN];
inline int minim(int a, int b) { return (a < b) ? a : b; }
void insertAPM(int i) {
for(int nod = 1; nod <= n; ++nod)
if(i != nod) {
V[nod] = minim(V[nod], val[nod] ^ val[i]);
if(V[nod] == val[nod] ^ val[i])
vec[nod] = i;
}
}
void pushHeap(int poz)
{
while((poz * 2 <= L && V[H[poz]] > V[H[poz * 2]]) || (poz * 2 + 1 <= L && V[H[poz]] > V[H[poz * 2 + 1]]))
{
if (V[H[poz * 2]] < V[H[poz * 2 + 1]] || poz * 2 + 1 > L)
{
swap(H[poz],H[poz * 2]);
swap(POZ[H[poz]],POZ[H[poz * 2]]);
poz *= 2;
}
else
{
swap(H[poz],H[poz * 2 + 1]);
swap(POZ[H[poz]],POZ[H[poz * 2 + 1]]);
poz = poz * 2 + 1;
}
}
}
void popHeap(int poz)
{
while(poz > 1 && V[H[poz]] < V[H[poz / 2]])
{
swap(H[poz],H[poz / 2]);
swap(POZ[H[poz]],POZ[H[poz / 2]]);
poz = poz / 2;
}
}
void insertHeap(int nod)
{
H[++L] = nod;
POZ[nod] = L;
popHeap(L);
}
int topHeap()
{
int x = H[1];
swap(H[1],H[L]);
swap(POZ[H[1]],POZ[H[L]]);
L--;
pushHeap(1);
POZ[x] = 0;
return x;
}
void solve() {
scanf("%d", &n);
for(int i = 1; i <= n; ++i)
scanf("%d", &val[i]);
L = 0;
for(int i = 1; i <= n; ++i)
V[i] = inf;
V[1] = 0;
insertAPM(1);
for(int i = 2; i <= n; ++i)
insertHeap(i);
int ans = 0;
for(int i = 1; i < n; ++i) {
int x = topHeap();
insertAPM(x);
ans += V[x];
for(int j = 1; j <= n; ++j)
if(j != x)
if(POZ[j])
popHeap(POZ[j]);
}
printf("%d\n", ans);
}
int main() {
//freopen("yamstp.in", "r", stdin);
//freopen("yamstp.out", "w", stdout);
freopen("adunare.in", "r", stdin);
freopen("adunare.out", "w", stdout);
int t;
scanf("%d", &t);
int aa;
scanf("%d", &aa);
printf("%d", aa + t);
return 0;
while(t--) {
solve();
}
}