Codeforces Round 949题解(A、B、C、D)
A. Turtle and Piggy Are Playing a Game
首先
因为
int l, r;
void solve() {
cin >> l >> r;
cout << lg(r) << '\n';
}
B. Turtle and an Infinite Sequence
写下几组数据发现第
令
l: 01011 0 11011
r: 01011 1 00110
设从左到右第一个不相等的位为01011 0 11111
在
int n, m;
void solve() {
cin >> n >> m;
int l = max(0, n - m);
int r = n + m;
int ans = 0;
for (int i = 31; i >= 0; i --) {
if ((l >> i & 1) != (r >> i & 1)) {
ans += (1 << (i + 1)) - 1;
break;
}
else {
ans |= (l >> i & 1) << i;
}
}
cout << ans << '\n';
}
C. Turtle and an Incomplete Sequence
考虑所有非
比如
既然如此,我们可以考虑最少需要多少步,可以将
3: 0011
9: 1001
首先我们可以把
3: 1 1
9: 1 0 01
然后,这些操作可以抽象为二进制序列右移一位、左移一位补
因为操作都是从尾部进行的,所以
因为从
因此我们只要判断每两个非
对于第一个非
int n;
int a[M];
int b[M];
int get_times_l(int x, int y) {
int l = lg(x), r = lg(y);
int i, j;
for (i = l, j = r; i >= 0 && j >= 0; i --, j --) {
if ((x >> i & 1) != (y >> j & 1)) {
return i + 1;
}
}
return i + 1;
}
int get_times_r(int x, int y) {
int l = lg(x), r = lg(y);
int i, j;
for (i = l, j = r; i >= 0 && j >= 0; i --, j --) {
if ((x >> i & 1) != (y >> j & 1)) {
return j + 1;
}
}
return j + 1;
}
void solve() {
cin >> n;
for (int i = 1; i <= n; i ++) {
b[i] = 1;
}
for (int i = 1; i <= n; i ++) {
cin >> a[i];
}
for (int i = 1; i <= n; i ++) {
if (a[i] != -1) {
b[i] = a[i];
int j;
for (j = i + 1; j <= n; j ++) {
if (a[j] != -1) {
break;
}
}
if (j > n) {
break;
}
int l = get_times_l(a[i], a[j]);
int r = get_times_r(a[i], a[j]);
// cout << l << ' ' << r << '\n';
// cout << i << ' ' << j << '\n';
if (j - i >= l + r && (j - i - l - r) % 2 == 0) {
for (int k = i + 1; k <= i + l; k ++) {
b[k] = b[k - 1] / 2;
}
int rr = r;
for (int k = i + l + 1; k <= i + l + r; k ++) {
b[k] = b[k - 1] * 2 + ((a[j] >> (rr-- - 1)) & 1);
}
int cnt = 0;
for (int k = i + l + r + 1; k < j; k ++) {
if (cnt++ & 1) b[k] = b[k - 1] / 2;
else b[k] = b[k - 1] * 2;
}
}
else {
cout << "-1\n";
return;
}
i = j - 1;
}
}
int pos_l = -1, pos_r = -1;
for (int i = 1; i <= n; i ++) {
if (a[i] != -1) {
pos_l = i;
break;
}
}
for (int i = n; i >= 1; i --) {
if (a[i] != -1) {
pos_r = i;
break;
}
}
int cnt = 0;
if (pos_l != -1) {
for (int i = pos_l - 1; i >= 1; i --) {
if (cnt++ & 1) b[i] = b[i + 1] / 2;
else b[i] = b[i + 1] * 2;
}
}
cnt = 0;
if (pos_r != -1) {
for (int i = pos_r + 1; i <= n; i ++) {
if (cnt++ & 1) b[i] = b[i - 1] / 2;
else b[i] = b[i - 1] * 2;
}
}
if (pos_l == -1 && pos_r == -1) {
b[1] = 1;
cnt = 0;
for (int i = 2; i <= n; i ++) {
if (cnt++ & 1) b[i] = b[i - 1] / 2;
else b[i] = b[i - 1] * 2;
}
}
for (int i = 1; i <= n; i ++) {
cout << b[i] << ' ';
}
cout << '\n';
}
D. Turtle and Multiplication
我们可以把
考虑若完全图点数确定,我们如何计算这个完全图的最长不经过重复边的路径长度。
设完全图点数为
若
当
我们可以二分求出最小的
时间复杂度:每个测试样例
注意,我们在添加欧拉回路的路径时,只把当前边的
int n;
int h[N], e[N * 3], ne[N * 3], idx;
int st[N], primes[N], cnt;
int used[N * 3], tot;
int ans[N * 3];
void getPrimes(int n) {
for (int i = 2; i <= n; i ++) {
if (!st[i]) primes[cnt ++] = i;
for (int j = 0; primes[j] <= n / i; j ++) {
st[primes[j] * i] = 1;
if (i % primes[j] == 0) break;
}
}
}
void addEdge(int a, int b) {
e[idx] = b, ne[idx] = h[a], h[a] = idx ++;
}
bool check(int x) {
if (x & 1) return x * (x + 1) / 2 >= n - 1;
else return x * x / 2 + 1 >= n - 1;
}
void dfs(int u) {
for (int i = h[u]; ~i; i = h[u]) {
if (used[i]) {
h[u] = ne[i];
continue;
}
used[i] = 1;
used[i ^ 1] = 1;
h[u] = ne[i];
dfs(e[i]);
ans[++tot] = e[i];
}
}
void solve() {
cin >> n;
memset(h, -1, (n + 2) * 4);
idx = 0;
tot = 0;
int l = 1, r = 10000;
while (l < r) {
int mid = l + r >> 1;
if (check(mid)) r = mid;
else l = mid + 1;
}
int m = l;
for (int i = 1; i <= m; i ++) {
for (int j = i; j <= m; j ++) {
if (!(m & 1) && j == i + 1 && !(i & 1))
continue;
addEdge(i, j);
addEdge(j, i);
}
}
for (int i = 0; i < idx; i ++) {
used[i] = 0;
}
dfs(1);
ans[++tot] = 1;
reverse(ans + 1, ans + 1 + tot);
// for (int i = 1; i <= tot; i ++) {
// cout << ans[i] << " \n"[i == tot];
// }
for (int i = 1; i <= n; i ++) {
cout << primes[ans[i] - 1] << " \n"[i == n];
}
}
bool Med;
int main() {
fprintf(stderr, "%.3lf MB\n", (&Med - &Mbe) / 1048576.0);
// setIO();
int T = 1;
cin >> T;
getPrimes(1e6);
// for (int i = 0; i < 100; i ++) {
// cout << primes[i] << " \n"[i == 99];
// }
while (T --) solve();
cerr << 1e3 * clock() / CLOCKS_PER_SEC << " ms\n";
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】