QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#752260 | #9249. Elimination Series Once More | wkr | WA | 0ms | 3720kb | C++20 | 3.3kb | 2024-11-15 23:34:21 | 2024-11-15 23:34:22 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define wkr ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
const int N = 2e6 + 10;
const int M = N * 50;
int n, m, k;
int rt[N], ls[M], rs[M], sum[M], tot, a[N];
void up(int id)
{
sum[id] = sum[ls[id]] + sum[rs[id]];
}
void build(int &id, int l, int r, int idx)
{
if (!id)
{
id = ++tot;
}
if (l == r)
{
++sum[id];
return;
}
int mid = (l + r) >> 1;
if (idx <= mid)
{
build(ls[id], l, mid, idx);
}
else
{
build(rs[id], mid + 1, r, idx);
}
up(id);
}
void update(int prev, int &cur, int l, int r, int idx)
{
cur = ++tot;
ls[cur] = ls[prev];
rs[cur] = rs[prev];
sum[cur] = sum[prev];
if (l == r)
{
++sum[cur];
return;
}
int mid = (l + r) >> 1;
if (idx <= mid)
update(ls[prev], ls[cur], l, mid, idx);
else
update(rs[prev], rs[cur], mid + 1, r, idx);
up(cur);
}
int query(int id, int l, int r, int ql, int qr)
{
if (l >= ql && r <= qr)
{
return sum[id];
}
int mid = (l + r) >> 1;
if (qr <= mid)
{
return query(ls[id], l, mid, ql, qr);
}
else if (ql > mid)
{
return query(rs[id], mid + 1, r, ql, qr);
}
else
{
return query(ls[id], l, mid, ql, qr) + query(rs[id], mid + 1, r, ql, qr);
}
}
int qpow(int a, int b)
{
int ans = 1;
while (b)
{
if (b & 1)
ans = (a * ans);
b >>= 1;
a = (a * a);
}
return ans;
}
void solved()
{
cin >> n >> m;
int k = m;
int total = qpow(2, n);
for (int i = 0; i < total; i++)
{
cin >> a[i];
if (i == 0)
{
build(rt[0], 1, total, a[i]);
continue;
}
update(rt[i - 1], rt[i], 1, total, a[i]);
}
int maxNum = qpow(2, n);
for (int i = 0; i < total; i++)
{
int v = a[i];
int ok = v - 1;
if (ok == 0)
{
cout << 0 << " ";
continue;
}
if (v == maxNum)
{
cout << n << " ";
continue;
}
if(k>=ok)
{
int len = v;
int ans = 0;
int need = 1;
while(len > need)
{
++ans;
need *= 2;
}
cout<<ans<<" ";
continue;
}
for (int j = 1; j <= n + 1; j++)
{
int len = qpow(2, j);
int left = i - i % len;
int right = left + len - 1;
int num1;
int num2;
if (left == 0)
{
num1 = 0;
}
else
{
num1 = query(rt[left - 1], 1, total, 1, v - 1);
}
num2 = query(rt[right], 1, total, 1, v - 1);
int less = num2 - num1;
int big = len - less - 1;
int canMove = ok - less;
// cerr << i << " " << left << " " << right << " " << big << " " << k << " " << canMove << endl;
if (big > k || (big <= k && canMove < min(big, k)))
{
cout << j - 1 << " ";
break;
}
}
}
}
signed main()
{
wkr;
solved();
return 0;
}
详细
Test #1:
score: 100
Accepted
time: 0ms
memory: 3680kb
input:
2 1 1 2 3 4
output:
0 1 1 2
result:
ok 4 number(s): "0 1 1 2"
Test #2:
score: -100
Wrong Answer
time: 0ms
memory: 3720kb
input:
3 5 2 4 7 5 3 8 6 1
output:
1 2 2 3 2 3 3 0
result:
wrong answer 4th numbers differ - expected: '2', found: '3'