博弈论+递推+调和级数枚举,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;
}
相关推荐
林辞忧7 分钟前
算法修炼之路之滑动窗口
算法
￴ㅤ￴￴ㅤ9527超级帅18 分钟前
LeetCode hot100---二叉树专题(C++语言)
c++·算法·leetcode
liuyang-neu19 分钟前
力扣 简单 110.平衡二叉树
java·算法·leetcode·深度优先
penguin_bark26 分钟前
LCR 068. 搜索插入位置
算法·leetcode·职场和发展
_GR1 小时前
每日OJ题_牛客_牛牛冲钻五_模拟_C++_Java
java·数据结构·c++·算法·动态规划
ROBIN__dyc1 小时前
表达式
算法
无限大.1 小时前
c语言实例
c语言·数据结构·算法
六点半8881 小时前
【C++】速通涉及 “vector” 的经典OJ编程题
开发语言·c++·算法·青少年编程·推荐算法
@haihi1 小时前
冒泡排序,插入排序,快速排序,选择排序
数据结构·算法·排序算法
quaer1 小时前
Open-Sora全面开源?
开发语言·算法·机器学习·matlab·矩阵