• CF R 209 div 2 CF359B Permutation 构造


    LINK:Permutation

    休闲一下 开了一道构造题。

    看起来毫无头绪 其实仔细观察第二个条件 0<=2k<=n.

    容易想到当n是奇数的时候 k的范围更小 再手玩一下第一个条件 容易发现 想要价值 必须使得 后面的式子 正值和负值抵消掉。

    这样每次差是偶数倍 所以只需要凑出来k就行了 而后面的式子想刚好抵消掉k如果直接使用两个数字的话构造会略显繁杂。

    考虑多个数字抵消 那么容易想到 两个相邻的数字带来的贡献为1 这样使用两个相邻的数字不断构造正数和负数抵消k即可。

    刚好这样做 k还是在合理的范围内的 对于奇数 让两边的式子自己抵消即可 可以对于右边限定负数也可以限定正数.

    const int MAXN=50010<<1;
    int n,k,top;
    int a[MAXN];
    inline void calc(int w,int x)//w个数字构成答案x.
    {
    	rep(1,w,i)
    	{
    		a[i*2]=i*2,a[i*2-1]=i*2-1;
    		if(x)swap(a[i<<1],a[i*2-1]),--x;
    	}
    }
    int main()
    {
    	//freopen("1.in","r",stdin);
    	get(n);get(k);
    	int cc=(n>>1)<<1;
    	calc(cc,k);
    	rep(1,cc*2,i)printf("%d ",a[i]);
    	if(n&1)printf("%d ",n*2-1),printf("%d ",n*2);
    	return 0;
    }
    
  • 相关阅读:
    Part 1R 函数、极限和连续
    Part 1 函数、极限与连续
    C++继承与派生
    VUE笔记
    VUE错误记录
    VUE笔记
    VUE笔记
    VUE笔记
    JS学习笔记
    Node.js笔记 请求方式 GET
  • 原文地址:https://www.cnblogs.com/chdy/p/12781696.html
Copyright © 2020-2023  润新知