博弈论+递推+调和级数枚举,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;
}
相关推荐
AndrewHZ1 小时前
【LLM技术全景】阶段总结:技术原理篇核心知识回顾
人工智能·深度学习·算法·语言模型·大模型·llm·芯片开发
小星星闪亮登场2 小时前
2026萌新联赛第三场-- (郑州轻工业大学)
数据结构·c++·经验分享·算法·贪心算法·排序算法·深度优先
冻柠檬飞冰走茶2 小时前
PTA基础编程题目集 7-8超速判断(C++语言实现)
开发语言·数据结构·c++·算法
玖玥拾3 小时前
LeetCode 88 合并两个有序数组
算法·leetcode
数据皮皮侠AI3 小时前
上市公司数字供应链金融指数(2010-2024)
大数据·人工智能·算法
2501_942389553 小时前
Epoch AI旗下FrontierMath的负责人Elliot Glazer
数据结构·决策树·动态规划·散列表
小程故事多_804 小时前
用GRPO算法重塑多智能体系统,从原理落地到复杂任务规划实战
人工智能·算法
Hi李耶4 小时前
【LeetCode】541.反转字符串 II
算法·leetcode·职场和发展
shylyly_4 小时前
104.二叉树的最大深度
数据结构·算法·104.二叉树的最大深度
AI科技星4 小时前
曲率‑挠率与 $\boldsymbol{\omega/c}$ 的关系、精算验证及其物理意义
c语言·开发语言·线性代数·算法·决策树·机器学习·ai科技星