Diverse Permutation(构造)

本文探讨了一种求解特定长度的排列,使得相邻元素之间的差值绝对值形成的集合中包含恰好k个不同的数值。通过构建特定序列,实现复杂度优化并提供了解题策略。
C. Diverse Permutation
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output

Permutation p is an ordered set of integers p1,   p2,   ...,   pn, consisting of n distinct positive integers not larger than n. We'll denote as n the length of permutation p1,   p2,   ...,   pn.

Your task is to find such permutation p of length n, that the group of numbers |p1 - p2|, |p2 - p3|, ..., |pn - 1 - pn| has exactly k distinct elements.

Input

The single line of the input contains two space-separated positive integers nk (1 ≤ k < n ≤ 105).

Output

Print n integers forming the permutation. If there are multiple answers, print any of them.

Sample test(s)
input
3 2
output
1 3 2
input
3 1
output
1 2 3
input
5 2
output
1 3 2 4 5
Note

By |x| we denote the absolute value of number x.

 

     题意:

     给出 N 和 K,代表有一个 1 ~ N 的数列,问如何排序,能使两者之间差值的绝对值相差数的种数有 K 个。任意输出一个满足的序列即可。

 

     思路:

     构造数列。把数列写出来会发现,一个数列最多两两之间相差值也就只是 n - 1 个,这个数列可以通过 第一项 +(n-1) = 第二项,第二项 -(n-2) = 第三项,……这样子构成下去。

     既然知道这样的话,就很容易构造出数列了,按题意要出现多少个 K,那么就出现这个数列的前 K 项,剩下的递增或者递减下去就行了。

 

      AC:

#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

int num[100005];

int main() {

    int n, k;
    scanf("%d%d", &n, &k);

    int temp = 1, from = n - 1;
    num[1] = 1;
    for (int i = 2; i <= n; ++i) {
        int res = temp * from;
        num[i] = num[i - 1] + res;
        --from;
        temp *= -1;
    }

    for (int i = 1; i <= k; ++i) {
        printf("%d ", num[i]);
    }

    int ans = num[k];
    if (k % 2) {
        for (int i = k + 1; i <= n; ++i)
            printf("%d ", ++ans);
    } else {
        for (int i = k + 1; i <= n; ++i)
            printf("%d ", --ans);
    }

    printf("\n");

    return 0;
}

 

 

请使用c++解决以下问题: ## 题目描述 给定长度为 $n$ 的正整数序列 $a$,求 $g(a)$ 的值: $$ g(a)=\max_{a'}\{f(a')\}\\ f(a)=\sum_{i=2}^{n} |a_{i}-a_{i-1}| $$ 其中,$a'$ 是序列 $a$ 经过任意重排后得到的任意一个序列。 但是这实在是一个三岁小宝宝都会的简单题,因此你想对 $m$ 个序列都求出上述式子的最大值,这 $m$ 个序列满足以下条件。 - 第 $i$ 个序列 $p_i$ 长度为 $i$。 - 第一个序列 $p_1$ 为 $[b'_1=b_1]$。 - 第 $i$($2\leq i\leq m$)个序列 $p_i$ 满足:对于任意满足 $1\leq j<i$ 的正整数 $j$ 满足 $p_{i,j}=p_{i-1,j}$,且 $p_{i,i} = b'_i=b_i\oplus (T\cdot f(p_{i-1}))$。 其中,$\oplus$ 表示二进制按位异或。 ## 输入格式 第一行两个非负整数 $m$ 和 $T$,分别表示你需要求出重排后 $f$ 最大值的序列个数以及生成序列参数。 第二行 $n$ 个非负整数表示 $b_1,\dots,b_m$。 **注意:【数据范围】一节仅对 $b'_i$ 的范围做出了保证,没有对 $b_i$ 的范围做出保证。** ## 输出格式 共一行一个非负整数,为 $\oplus_{i=1}^{m} g(p_i)$。 ## 输入输出样例 #1 ### 输入 #1 ``` 5 0 1 2 3 4 5 ``` ### 输出 #1 ``` 14 ``` ## 输入输出样例 #2 ### 输入 #2 ``` 8 0 5 2 7 1 4 3 8 6 ``` ### 输出 #2 ``` 2 ``` ## 说明/提示 **【样例解释 #1】** $g(p_1),g(p_2),\dots,g(p_m)$ 分别为 $0,1,3,7,11$。 令 $p'_i$ 为 $p_i$ 重排后**任意**满足 $f(p'_i)$ 最大的序列。 $p_1=[1]$,$p'_1=[1]$,$f(p'_1)=0$。 $p_2=[1,2]$,$p'_2=[1,2]$,$f(p'_2)=|1-2|=1$。 $p_3=[1,2,3]$,$p'_3=[1,3,2]$,$f(p'_3)=|1-3|+|3-2|=3$。 $p_4=[1,2,3,4]$,$p'_4=[3,1,4,2]$,$f(p'_4)=|3-1|+|1-4|+|4-2|=7$。 $p_5=[1,2,3,4,5]$,$p'_5=[4,2,5,1,3]$,$f(p'_5)=|4-2|+|2-5|+|5-1|+|1-3|=11$。 该样例满足测试点 $1$ 的限制。 **【样例解释 #2】** $g(p_1),g(p_2),\dots,g(p_m)$ 分别为 $0,3,8,15,17,19,27,31$。 该样例满足测试点 $3$ 的限制。 **【数据范围】** 对于全部测试点:$1\leq m\leq 3\times 10^6$,$1\leq b'_i\leq 10^9$,$T\in \{0,1\}$。 | 测试点编号 | $m\leq$ | $T=$ | 特殊性质 | | :---------: | :------------: | :--: | :------: | | $1$ | $8$ | $0$ | AB | | $2$ | $100$ | $0$ | AB | | $3$ | $10^3$ | $0$ | AB | | $4$ | $2\times 10^5$ | $0$ | AB | | $5$ | $2\times 10^5$ | $0$ | A | | $6$ | $2\times 10^5$ | $1$ | AB | | $7$ | $2\times 10^5$ | $1$ | A | | $8$ | $2\times 10^5$ | $1$ | 无 | | $9$ | $10^6$ | $1$ | 无 | | $10$ | $3\times 10^6$ | $1$ | 无 | 特殊性质 A:$b'_i\leq m$($1\leq i\leq m$)。 特殊性质 B:$b'_i\neq b'_j$($1\leq i<j\leq m$)。
最新发布
10-30
在深度学习模型中,"diverse branch block"(DBB)是一种用于提升模型性能的模块设计,其核心思想是通过多分支结构提升模型的表达能力。DBB模块通常包含多个不同类型的分支(如不同大小的卷积核、恒等映射分支等),这些分支在训练过程中共同优化,最终通过结构重参数化(structural re-parameterization)将多分支结构合并为一个等效的单分支结构,以提升推理效率[^1]。 ### 原理 DBB 的主要原理可以分为两个阶段: 1. **训练阶段**:使用多个不同类型的分支并行处理输入特征,从而增强模型对多尺度特征的感知能力。典型的 DBB 结构包括: - 1×1 卷积分支 - 3×3 卷积分支 - 恒等映射(identity)分支 2. **推理阶段**:通过数学变换将多分支结构合并为一个等效的 3×3 卷积层,从而减少计算资源消耗并提升推理速度。该等效卷积核的计算方式基于各分支的权重矩阵和偏置项进行融合。 ### 计算公式 假设 DBB 模块包含三个分支:1×1 卷积、3×3 卷积和恒等映射分支,其输出分别为 $ Y_1 $、$ Y_2 $ 和 $ Y_3 $,则最终输出为: $$ Y = Y_1 + Y_2 + Y_3 $$ 其中: - $ Y_1 = W_1 \ast X $,$ W_1 $ 为 1×1 卷积核权重 - $ Y_2 = W_2 \ast X $,$ W_2 $ 为 3×3 卷积核权重 - $ Y_3 = X $,恒等映射分支 在推理阶段,上述多分支结构可被重参数化为一个等效的 3×3 卷积核 $ W_{eq} $ 和偏置 $ b_{eq} $,其计算方式如下: $$ W_{eq} = W_2 + \text{Pad}(W_1) + \text{Identity\_to\_3×3}(I) $$ $$ b_{eq} = b_2 + b_1 + b_I $$ 其中,$ \text{Pad}(W_1) $ 表示将 1×1 卷积核扩展为 3×3 形式,$ \text{Identity\_to\_3×3}(I) $ 表示将恒等映射转换为等效的 3×3 卷积核形式[^1]。 ### 示例代码 以下是一个简化版本的 DBB 模块实现,使用 PyTorch 框架: ```python import torch import torch.nn as nn class DiverseBranchBlock(nn.Module): def __init__(self, in_channels, out_channels): super(DiverseBranchBlock, self).__init__() self.branch1 = nn.Conv2d(in_channels, out_channels, kernel_size=1) self.branch2 = nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1) self.branch3 = nn.Identity() def forward(self, x): return self.branch1(x) + self.branch2(x) + self.branch3(x) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值