先看题目:

Description

小X 看到堆成山的数列作业十分头疼,希望聪明的你来帮帮他。考虑数列A=[A1,A2,...,An],定义变换f(A,k)=[A2,A3,,,,.Ak,A1,Ak+2,Ak+3,,,,A2k,Ak+1,...],也就是把a 分段,每段k 个(最后如果不足k 个,全部分到新的一段里,见样例),然后将每段的第一个移动到该段的最后一个。

现在,小 X想知道 f (f (f (f ([1,2,3,⋯,n],2),3),⋯),n)的结果。

 

Input

输入一行包含一个整数n 。

Output

输出一行包含n 个整数,表示最终的数列。
 

Sample Input

4

Sample Output

4 2 3 1

【样例说明】
f ([1,2,3,4],2) = [2,1,4,3]
f ([2,1,4,3],3) = [1,4,2,3](3单独被分在一组,移动到组的最后一位,仍然是3)
f ([1,4,2,3],4) = [4,2,3,1]
 

Data Constraint

对于60%的数据,1≤ n ≤10^3。

对于100%的数据,1≤ n ≤10^6。


【思路详解】:

  首先,我们看到这一题时的第一反应一定是打一个朴素算法(懒人暴力),这一题的正解碰巧就是模拟+剪枝

  我们先按照题意来写出一个模拟,分为每个阶段now,now的初始值为2(阶段指的是要把这个序列分成几组),每一个阶段都将这个序列分为now组,然后将每一组的第一个元素放到这一组的尾部。时间复杂度大概为O(n^2),非常好打,这样打60分肯定是没问题的,但是100分是怎么拿的呢,如果这一题想要AC就一定要做出一些剪枝才行,我们看这一题的空间:524288 KB,非常的大,所以我们本着以空间换取时间的想法进行优化。

  我们发现,纯暴力慢的原因主要是在把每一组的开头元素移到组尾后这个组的其他元素会往前移,这时我们用的是for循环一个一个换位置,这当然很慢,所以我们着手在这方面进行优化。可以发现每一个组的元素都要放到队尾,那我们把这一组的第一个元素放到下一组的第一个位置,然后下一组第一个元素放到下下一组的第一位,这样我们就可以不用在移动元素了,只需要在最后一组时多开一个空间将最后一组第一个元素放进去就好了,这样我们一次分组多开一个空间,我们一共需要分组n-1次,我们就开两倍空间不就好了,这样就可以将时间复杂度降到O(nlogn)就可以AC了。

下面上代码:

#include<iostream>
#include<cstdio>
using namespace std;
int n,now,lo,hi,a[]={},bot; //2倍空间
void change(){ //进行分组
bot=a[lo]; //暂时存放
for(int i=lo;i<=hi;i+=now){
if(i+now>hi){
a[++hi]=bot;
lo++;
break;
}
swap(bot,a[i+now]); //交换
}
}
int main(){
cin>>n;
now=;
lo=,hi=n;//用lo,hi标记现在的开头和结尾元素位置
for(int i=;i<=n;i++) a[i]=i;
while(now<=n){
change();
now++;
}
for(int i=lo;i<=hi;i++) cout<<a[i]<<" ";
}

总结:这是一道大水题,细心就能AC(当然还得有脑子,所以我WA了40分)。

3403. 题解【NOIP2013模拟】数列变换 (Standard IO)的更多相关文章

  1. JZOJ 5307. 【NOIP2017提高A组模拟8.18】偷窃 (Standard IO)

    5307. [NOIP2017提高A组模拟8.18]偷窃 (Standard IO) Time Limits: 1000 ms Memory Limits: 262144 KB Description ...

  2. JZOJ 5286. 【NOIP2017提高A组模拟8.16】花花的森林 (Standard IO)

    5286. [NOIP2017提高A组模拟8.16]花花的森林 (Standard IO) Time Limits: 1000 ms Memory Limits: 131072 KB Descript ...

  3. JZOJ 5305. 【NOIP2017提高A组模拟8.18】C (Standard IO)

    5305. [NOIP2017提高A组模拟8.18]C (Standard IO) Time Limits: 1000 ms Memory Limits: 131072 KB Description ...

  4. JZOJ 3462. 【NOIP2013模拟联考5】休息(rest)

    3462. [NOIP2013模拟联考5]休息(rest) (Standard IO) Time Limits: 1000 ms  Memory Limits: 262144 KB  Detailed ...

  5. JZOJ 3461. 【NOIP2013模拟联考5】小麦亩产一千八(kela)

    3461. [NOIP2013模拟联考5]小麦亩产一千八(kela) (Standard IO) Time Limits: 1000 ms  Memory Limits: 262144 KB  Det ...

  6. JZOJ 3487. 【NOIP2013模拟联考11】剑与魔法(dragons)

    3487. [NOIP2013模拟联考11]剑与魔法(dragons) (Standard IO) Time Limits: 1000 ms  Memory Limits: 131072 KB  De ...

  7. JZOJ 3470. 【NOIP2013模拟联考8】最短路(path)

    470. [NOIP2013模拟联考8]最短路(path) (Standard IO) Time Limits: 1000 ms  Memory Limits: 262144 KB  Detailed ...

  8. JZOJ 3388. 【NOIP2013模拟】绿豆蛙的归宿

    3388. [NOIP2013模拟]绿豆蛙的归宿 (Standard IO) Time Limits: 1000 ms  Memory Limits: 131072 KB  Detailed Limi ...

  9. JZOJ 3463. 【NOIP2013模拟联考5】军训

    3463. [NOIP2013模拟联考5]军训(training) (Standard IO) Time Limits: 2000 ms  Memory Limits: 262144 KB  Deta ...

随机推荐

  1. quartz CronExpression

    一.Quartz Cron 表达式支持到七个域 名称 是否必须 允许值 特殊字符 秒 是 0-59 , - * / 分 是 0-59 , - * / 时 是 0-23 , - * / 日 是 1-31 ...

  2. [CF960G]Bandit Blues(第一类斯特林数+分治卷积)

    Solution: ​ 先考虑前缀,设 \(f(i, j)\) 为长度为 \(i\) 的排列中满足前缀最大值为自己的数有 \(j\) 个的排列数. 假设新加一个数 \(i+1\) 那么会有: \[ f ...

  3. java_第一年_JavaWeb(9)

    JavaBean是一个遵循某种特定写法的Java类,有以下特点: 必需具有一个无参的构造函数 属性必需私有化 私有化的属性必需通过public类型的方法暴露给其它程序,其方法命名也有一定的规范 范例: ...

  4. [BZOJ 1503]郁闷的出纳员(fhq treap)

    [BZOJ 1503]郁闷的出纳员 题面 第一行有两个非负整数n和min.n表示下面有多少条命令,min表示工资下界. 接下来的n行,每行表示一条命令.命令可以是以下四种之一: 名称 格式 作用 I命 ...

  5. Blocks题解(区间dp)

    Blocks题解 区间dp 阅读体验...https://zybuluo.com/Junlier/note/1289712 很好的一道区间dp的题目(别问我怎么想到的) dp状态 其实这个题最难的地方 ...

  6. owaspbwa tickets

    owaspbwa tickets 来源  https://sourceforge.net/p/owaspbwa/tickets/ 192 SQL Injection in pic_id paramet ...

  7. JVM(9)之 年轻代收集器

    开发十年,就只剩下这套架构体系了! >>>   继续上一篇博文所讲的,STW即GC时候的停顿时间,他会暂停我们程序中的所有线程.如果STW所用的时间长而且次数多的话,那么我们整个系统 ...

  8. 前端对base64编码的理解,原生js实现字符base64编码

    目录 常见对base64的认知(不完全正确) 多问一个为什么,base64到底是个啥? 按照我们的思路实现一下 到这里基本就实现了,结果跟原生的方法打印的是一样的 下一次 @( 对于前端工程师来说ba ...

  9. 使用wkhtmltopdf工具生成pdf

    背景:将前台页面转换成pdf文档保存到服务器 最开始计划使用canvas2pdf在前端进行生成.但是canva2pdf转换的pdf有严重的失真问题,然后决定使用wkhtmltopdf工具进行生成. 思 ...

  10. update all line start with -- to space

    update all line start with -- to space ^--.*$