zoukankan      html  css  js  c++  java
  • [Codeforces1148C]Crazy Diamond——构造

    题目链接:

    [Codeforces1148C]Crazy Diamond

    题目大意:

    给出一个$1sim n$的排列要求将其排序,每次能交换两个位置的数当且仅当这两个位置下标差的绝对值大于等于$frac{n}{2}$。要求输出一组操作数不大于$5n$的方案并保证一定有解。

    先不考虑操作需要的限制条件,那么要将排列排好序只需要第$i$次将$i$与下标为$i$的那个数调换一下即可。

    现在有了限制条件显然不能直接调换,我们考虑借助别的数来完成这两个数的交换。

    假设需要交换的两个位置的下标分别为$x$和$y$且$y>x$。

    当$frac{n}{2}le y-x$时,直接交换即可。

    当$x>frac{n}{2}$时,显然$x,y$都能和$1$位置交换:

    $1,x,y$

    $x,1,y$

    $y,1,x$

    $1,y,x$

    当$yle frac{n}{2}$时,$x,y$都能和$n$位置交换,方法同上。

    当$xle frac{n}{2},y>frac{n}{2}且y-x<frac{n}{2}$时,显然只依靠$1$或$n$无法完成,但$1$和$y$能交换,$x$和$n$也能交换:

    $1,x,y,n$

    $y,x,1,n$

    $y,n,1,x$

    $x,n,1,y$

    $1,n,x,y$

    $1,y,x,n$

    可以发现这样操作对于每个点最多需要$5$次操作就能使它归位,所以$5n$次操作内一定能完成。

    #include<set>
    #include<map>
    #include<queue>
    #include<stack>
    #include<cmath>
    #include<vector>
    #include<cstdio>
    #include<bitset>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #define ll long long
    using namespace std;
    int n,m;
    int a[300010];
    int b[300010];
    int ans[1500010][2];
    int cnt;
    void get(int x,int y)
    {
    	ans[++cnt][0]=x,ans[cnt][1]=y;
    	b[a[x]]=y;
    	b[a[y]]=x;
    	swap(a[x],a[y]);
    }
    void solve(int x,int y)
    {
    	if(x==y)return ;
    	if(x>y)swap(x,y);
    	if(y-x>=m)get(x,y);
    	else if(x>m)
    	{
    		get(1,x);
    		get(1,y);
    		get(1,x);
    	}
    	else if(y<=m)
    	{
    		get(y,n);
    		get(x,n);
    		get(y,n);
    	}
    	else
    	{
    		get(1,y);
    		get(x,n);
    		get(1,n);
    		get(1,y);
    		get(x,n);
    	}
    }
    int main()
    {
    	scanf("%d",&n);m=n/2;
    	for(int i=1;i<=n;i++)
    	{
    		scanf("%d",&a[i]);
    		b[a[i]]=i;
    	}
    	for(int i=1;i<=n;i++)
    	{
    		solve(i,b[i]);
    	}
    	printf("%d
    ",cnt);
    	for(int i=1;i<=cnt;i++)
    	{
    		printf("%d %d
    ",ans[i][0],ans[i][1]);
    	}
    }
  • 相关阅读:
    vue 同页面不同参数
    vue的data用到this问题
    vue轮播,不是只有左右切换的,还有只切换src的
    vue页面高度填充,不出现滚动条
    WdatePicker做出onchange效果
    总结最近移动端遇到的坑(auto-size + zepto)
    react
    ES6-set && 数组剔重
    [置顶] Jquery easyui+Jsonp+asp.net+翻页 事件版
    扩展Jquery easyui的validator插件
  • 原文地址:https://www.cnblogs.com/Khada-Jhin/p/10962181.html
Copyright © 2011-2022 走看看