博弈论+递推+调和级数枚举,CF 1033C - Permutation Game

一、题目

1、题目描述

2、输入输出

2.1输入
2.2输出

3、原题链接

1033C - Permutation Game


二、解题报告

1、思路分析

我们考虑一个位置符合什么条件可以必胜?

如果可以跳到一个必败的位置

考虑最大的格子一定是必败

而每个格子只能跳到比自己大的格子

于是我们就可以倒序处理状态

对于每个格子枚举比自己大的整数倍距离的格子中是否有必败态

似乎是O(N^2),但是由于枚举的是自己的倍数距离的下标, 是O(NlnN)的

2、复杂度

时间复杂度: O(NlnN)空间复杂度:O(N)

3、代码详解

复制代码
 ​
cpp 复制代码
#include <bits/stdc++.h>
using i64 = long long;
using i128 = __int128;
using PII = std::pair<int, int>;
const int inf = 1e8 + 7, P = 1e9 + 7;

void solve() {
    int n;
    std::cin >> n;
    std::vector<int> a(n), pos(n);
    std::vector<bool> f(n);
    std::string res(n, 'B');
    for (int i = 0; i < n; i ++ ) std::cin >> a[i], pos[a[i] - 1] = i;
    for (int i = n; i; i -- ) {
        int j = pos[i - 1];
        while (j >= i) j -= i;
        for (; j < n; j += i) {
            if (a[j] <= i) continue;
            if (!f[j]) {
                f[pos[i - 1]] = true;
                break;
            }
        }
        if (f[pos[i - 1]]) res[pos[i - 1]] = 'A';
    }
    std::cout << res;
}

int main(int argc, char** argv) {
    std::ios::sync_with_stdio(false), std::cin.tie(0), std::cout.tie(0);
    int _ = 1;
    // std::cin >> _;
    while (_ --)
        solve();
    return 0;
}
相关推荐
讳疾忌医丶1 分钟前
深度拆解 RocksDB 内核:基于 C++17 的 FIFO 调度状态机与温度阶梯自愈设计
java·c++·算法·架构
高亦真27 分钟前
今天是学习嵌入式的第37天
linux·学习·算法
罗西的思考2 小时前
[Agent Memory / 强化学习] MemPO源码学习笔记 --- (2)--- 训练
人工智能·算法·机器学习
深圳市方中禾科技3 小时前
FZH1625 LCD 驱动芯片深度评测与实战指南
算法·led
我不会起名字3224 小时前
一天一道算法题(34):回溯法的经典例题(子集)
java·数据结构·python·算法·golang·深度优先·力扣
huang5791476 小时前
哈希算法的抗碰撞机制与安全性增强策略4
算法
林浩杨_6 小时前
SIGIR 2026|南京大学:Video-GAR:“通过生成 Query 来验证视频语义理解”的生成增强范式
论文阅读·人工智能·算法
Elsa️7467 小时前
算法一周刷题总结
c++·算法
小小程序猴17 小时前
深圳乘路资讯AI培训怎么样?课程靠谱吗?——一套课程可信度评估模型与实证分析
人工智能·算法
云上先途7 小时前
标签化服务适合哪些人?常见适用场景一次讲清
大数据·人工智能·算法·音视频