codeforces D 287 Shifting

来源:互联网 发布:silverlight调用js 编辑:程序博客网 时间:2024/05/22 05:29

题意:

看示例吧。


解题思路:

一开始打了个表,找了找也没规律。

后来一想,这题在动的只有每块的第一个数,其它的都是往前移,如果用stl模拟下岂不是美滋滋,然而我想vector和set去了,然后时间也不多,就gg了。

感觉还是太蠢,用队列不是就完美实现坐标前移了。

然后这个题还需要发现一个一个特性就是,每次移动就相当于所有的每块的一个数形成的序列循环右移,然后整个序列左移,就相当于一个f(p,k)了,那么n次枚举,然后用双端队列模拟就好了。


代码:

#include <bits/stdc++.h>using namespace std;const int maxn=1e6+6;deque<int>dq;int a[maxn];int main(){    int n, i, j;    cin>>n;    {    for(i=1; i<=n; i++)dq.push_back(i);    for(i=2; i<=n; i++)    {        int x, k;        for(k=(n-1)/i; k>0; k--)        {            swap(dq[(k-1)*i], dq[k*i]);        }        dq.push_back(dq.front());        dq.pop_front();    }    for(i=1; i<=n; i++){printf(i==n?"%d":"%d ", dq.front());dq.pop_front();}printf("\n");    }    }


原创粉丝点击