博弈论+递推+调和级数枚举,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;
}
相关推荐
奋发向前wcx5 小时前
CSP-J复赛模拟赛4 王晨旭补题 2026.10.5
算法
念何架构之路7 小时前
zap采样器与性能优化内幕
算法·性能优化·哈希算法
晒太羊的猫8 小时前
hot100动态规划刷题
算法·动态规划
weixin_531094698 小时前
heap_4内存管理
java·开发语言·算法
余额瞒着我当琳9 小时前
红黑树的实现--红黑树的概念、规则、效率、结构、旋转、查找、验证
数据结构·c++·算法
程序员南飞9 小时前
win系统安装minio
java·数据结构·算法
青少儿编程课堂9 小时前
AC自动机多模式串匹配精讲:校园关键词巡检实战解析
c++·python·算法·bfs·信息学竞赛
longlongzihan9 小时前
LeetCode 5. 最长回文子串:从暴力匹配到中心扩展的思维演进
c++·算法·leetcode
waoooqwe9 小时前
问卷样本真实吗
大数据·数据库·算法·数据分析
苦瓜打怪兽9 小时前
leetcode 热题100(11. 盛最多水的容器)
python·算法·leetcode