【ICPC】2022 昆明站 D题 题解

题目大意

定义一种序列的合法划分:从左往右依次选择,可以把该数归到 S A SA SA中,或者 S B SB SB中,假如随意划分,有 2 n 2^n 2n中划分方法,但需要满足:

  • S A SA SA 是不严格递增序列
  • S B SB SB 是不严格递减序列

一个序列有很多种合法的划分,现在给定 k k k,请构造一种序列,它的合法划分数刚好是 k k k

题目链接

思路

我们需要找到一种方便计算其结果的构造
考虑一个不严格递增序列 1 , 1 , 1 , 2 , 2 , 2 , 2 , 2 , 3 , 3... x , x , x 1,1,1,2,2,2,2,2,3,3...x,x,x 1,1,1,2,2,2,2,2,3,3...x,x,x

上述序列的合法构造就是,任选一个数,任选一些和它相同的数放到 S B SB SB中,剩下的放 S A SA SA中。

那么对于每一个中数 i i i, 合法情况就是 i ∗ c n t [ i ] i * cnt[i] icnt[i], c n t [ i ] cnt[i] cnt[i] i i i的数。但是需要注意的是,所有情况中,有一种是所有数都不放入 S B SB SB中,那么这些情况会重复。除了第一次计算不用减去,剩余的 i i i的情况都需要减去 1 1 1

所有总的方案数就是 1 + ∑ 2 c n t [ i ] − 1 , i ∈ [ 1 , n ] 1 + \sum 2^{cnt[i]}-1,i \in [1,n] 1+2cnt[i]1,i[1,n]
而这种构造方式,是可以构造出所有的自然数的。

我们直接从最高位枚举 c n t [ i ] cnt[i] cnt[i],如果 k > ( 1 < < c n t [ i ) ] k > (1 << cnt[i)] k>(1<<cnt[i)],那就减去它,同时 i + + i++ i++
(剩下 1 1 1时就可以结束了)

代码

#include <cstdio>
#include <iostream>
#include <vector>
using namespace std;

int k, t = 1;
vector<int> ans;

int main()
{
    scanf("%d", &k);
    if(k == 0)
        printf("12\n1 1 4 5 1 4 1 1 4 5 1 4\n");
    else if(k == 1)
        printf("6\n1 1 4 5 1 4\n");
    else {
        for(int i = 29; i >= 0; --i) {
            while(k > (1 << i) - 1) {
                k -= (1 << i) - 1;
                for(int j = 1; j <= i; ++j)
                    ans.push_back(t);
                ++t;
            }
            if(k == 1)
                break;
        }
        printf("%d\n", ans.size());
        for(int i = 0; i < ans.size(); ++i)
            printf("%d ", ans[i]);
    }
    return 0;
}
<think>嗯,用户想要找2024年ICPC昆明邀请赛的目解析,但根据提供的引用内容,现有的资料只覆盖到2022年昆明的目,比如引用[1]提到2020、2021年的ICPC和CCPC目,以及引用[4]详细解析了2022昆明站的G。不过用户询问的是2024年的,这可能还没有公开的解析,或者可能还没有举办。需要先确认是否存在2024年的比赛信息,或者是否用户可能记错了年份?比如,2024年的比赛可能尚未举行,或者相关信息还未被整理发布。 首先,检查提供的引用内容,发现最新的昆明站信息是2022年的,引用[4]讨论的是2022昆明G。用户提到的2024年可能是个错误,或者他们希望提前获取信息。但通常比赛结束后才会有解析,所以需要告知用户目前没有相关资料,并建议他们关注官方渠道或后续的社区分享。同时,可以推荐现有的2022年昆明题解作为参考,帮助用户了解型和考点,比如动态规划、期望计算等常见问。 另外,用户可能对如何准备比赛感兴趣,可以建议他们分析历年目类型,比如引用[1]提到的区域赛常考型,或者引用[3]中提到的训练经验。需要确保回答准确,避免提供不存在的资源,同时提供有用的替代信息,帮助用户找到最近的可用资料。</think>关于2024年ICPC昆明邀请赛目解析,目前尚未有官方或主流平台发布完整的目解析报告。根据历史信息推测,ICPC区域赛的目解析通常会在赛后由参赛队伍、算法社区或教练团队逐步整理发布。以下是可参考的备赛建议和现有资源: --- ### 一、近期ICPC型趋势参考 1. **动态规划与组合数学** 如2022昆明站G考察了**概率期望与递推关系**,需掌握马尔可夫链、状态转移方程的建立[^4] $$E = \sum_{i=1}^n \left( \frac{p_i}{1-p_i} \cdot \sum_{j \neq i} \frac{p_j}{1-p_i} \right)$$ 此类问常需分析极限状态下的数学期望。 2. **数据结构优化** 近年区域赛常出现需要**线段树/树状数组维护区间性质**的目,例如区间最值、历史版本查询等。 3. **图论与网络流** 包括最小割建模、分层图最短路等高级技巧,如2021年沈阳站曾出现网络流与二分答案结合的目[^2]。 --- ### 二、获取解析的途径建议 1. **官方渠道** 关注ICPC官网及昆明站承办院校的赛事公告,解析可能通过**赛后题解报告会**发布。 2. **算法社区** - **Codeforces**:搜索标签`[ICPC Kunming 2024]` - **知乎/掘金**:技术博主常撰写详细题解(例:2022年G推导过程) 3. **训练平台** 尝试在**Codeforces Gym**或**牛客竞赛**库中查找昆明站模拟赛。 --- ### 三、历届昆明站参考 若需练习类似型,可参考2022昆明站目: - **G(豆子操作期望)**:结合概率论与递推,需推导稳定状态下的位置关系 - **B(几何构造)**:通过坐标系变换简化多边形切割问 ```python # 示例:概率期望计算的代码框架 def calculate_expected_value(probabilities): n = len(probabilities) expected = 0.0 for i in range(n): pi = probabilities[i] term = pi / (1 - pi) if pi != 1 else 0 sum_other = sum(pj / (1 - pi) for j, pj in enumerate(probabilities) if j != i) expected += term * sum_other return expected ``` ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值