• [洛谷U72177]火星人plus


    题目大意:给你一个$1sim n(nleqslant 10^5)$的排列,设$a$为它在$1sim n$的全排列中的排名,求在$1sim n$的全排列中第$a+m$个排列。

    题解:康托展开以及逆康托展开。将原排列转为变进制数,加上$m$,再用转回排列。转回去可以用在树状数组上二分来解决。这里使用了$skip2004$教的两种方法。

    卡点:变进制数加法时写错

    C++ Code:

    #include <cstdio>
    #include <iostream>
    #include <algorithm>
    const int maxn = 1 << 17;
    
    int n, L = 1, nn;
    
    namespace BIT {
    	int V[maxn], res;
    	inline void inc(int p) { for (; p <= L; p += p & -p) ++V[p]; }
    	inline void dec(int p) { for (; p <= L; p += p & -p) --V[p]; }
    	inline int sum(int p) { for (res = 0; p; p &= p - 1) res += V[p]; return res; }
    	inline void fill(int p, int L) { for (int i = 0; i < L; ++i) V[i] = p * (i & -i); }
    	inline int query(int k) { // 树状数组上二分
    		// 区间法
    		static int l, r, mid;
    		l = 1, r = L;
    		while (l != r) {
    			mid = l + r >> 1;
    			if (V[mid] < k) k -= V[mid], l = mid + 1;
    			else r = mid;
    		}
    		dec(l);
    		return l;
    		// 跳点法
    		static int rt; rt = L;
    		for (int i = rt; i >>= 1; ) {
    			if (V[rt - i] < k) k -= V[rt - i];
    			else rt -= i;
    		}
    		dec(rt);
    		return rt;
    	}
    }
    
    long long a[maxn], m;
    int main() {
    	std::ios::sync_with_stdio(false), std::cin.tie(0), std::cout.tie(0);
    	std::cin >> n >> m;
    	while (L < n) L <<= 1;
    	for (int i = 1, t; i <= n; ++i) {
    		std::cin >> a[i];
    		t = BIT::sum(a[i]);
    		BIT::inc(a[i]);
    		a[i] = a[i] - t - 1;
    	}
    	a[n] += m;
    	for (int i = n; i; --i) {
    		a[i - 1] += a[i] / (n - i + 1);
    		a[i] %= n - i + 1;
    	}
    	BIT::fill(1, L + 1);
    	for (int i = 1; i <= n; ++i) std::cout << BIT::query(a[i] + 1) << ' ';
    	std::cout << '
    ';
    	return 0;
    }
    

      

  • 相关阅读:
    如何简单实现一个react组件
    css实现弹框
    flex实现流式布局
    classnames的简单使用
    css处理内容溢出
    webpack学习
    github+hexo搭建,运行hexo g报错
    (附代码和截图)spring基于注解的java定时任务功能实现
    关于Cookie、session和localStorage、以及sessionStorage之间的区别和联系,超详细
    今天向大家推荐一个很强的编辑器——notepad++,没有插件plugin Manager的解决办法
  • 原文地址:https://www.cnblogs.com/Memory-of-winter/p/11164672.html
Copyright © 2020-2023  润新知