首页 > 其他分享 >【五一省选集训day4】Permutation

【五一省选集训day4】Permutation

时间:2024-09-10 20:14:59浏览次数:9  
标签:ch 省选 day4 int 基数排序 pf Permutation rep cmp

【五一省选集训day4】Permutation

每次操作把数分成两组,每组内的顺序不变,把第 \(0\) 组放到第 \(1\) 组前面。

发现这很像基于二进制的基数排序。

假设我们进行 \(k\) 次这样的操作,就相当于给每个数赋一个值 \((x,y)\),其中 \(0\le x\le 2^k-1,y=\texttt{数的下标}\)。然后对第一维进行基数排序。

因此我们要求我们需要多少个 \(x\)。

发现,设 \(a<b\),若 \(p_a<p_b\),则好像 \(p_a\) 和 \(p_b\) 可以共用一个 \(x\)。但实际上这是错误的。如果存在 \(c>b,p_a<p_c<p_b\),可以发现它们并不能共用一个 \(x\)。

我们发现一个结论,设 \(a<b\),若 \(p_a+1=p_b\),则 \(a,b\) 可以共用一个 \(x\)。即值域连续的极长上升子序列可以共用一个 \(x\)。设 \(q_i\) 表示值 \(i\) 的下标,即 \(q=p^{-1}\)。我们需要的 \(x\) 的个数 \(= q_i<q_{i-1}\) 的个数。

这个感觉很贪心,可以拍个暴力证明其正确性:)

构造方案的话,就模拟基数排序。对 \(x\) 进行基数排序。

代码很好写。如下:

函数 stable_partition(a+1,a+n+1,cmp) 表示稳定分组,满足 cmp 的在前,不满足的在后。

#include<bits/stdc++.h>
//#define LOCAL
#define sf scanf
#define pf printf
#define rep(x,y,z) for(int x=y;x<=z;x++)
#define per(x,y,z) for(int x=y;x>=z;x--)
using namespace std;
typedef long long ll;
const int N=50005;
template <typename T>
inline void read(T &x){
	x=0;
	char ch=getchar();
	for(;!isdigit(ch);ch=getchar());
	for(;isdigit(ch);ch=getchar()) x=(x<<3)+(x<<1)+ch-'0';
}
template <typename T>
inline void write(T x){
	static int st[20];
	int cnt=0;
	do{
		st[cnt++]=x%10;
		x/=10;
	}while(x);
	while(cnt) putchar(st[--cnt]+'0');
}
template <typename T>
inline void write (T x,char ch){
	write(x);
	putchar(ch);
}
int n,T;
int a[N],b[N];
int ans,id[N];
int s;
int k;
bool cmp(int x) {return (id[x]>>k&1)==0; }
int main(){
	#ifdef LOCAL
	freopen("in.txt","r",stdin);
	freopen("my.out","w",stdout);
	#endif
	sf("%d%d",&n,&T);
	rep(i,1,n) sf("%d",&a[i]),b[a[i]]=i;
	rep(i,1,n) {
		if(b[i]<b[i-1]) ans++;
		id[i]=ans;
	}
	while(ans) s++,ans>>=1;
	pf("%d\n",s);
	if(!T) return 0;
	rep(i,1,n) pf("%d ",a[i]);pf("\n");
	rep(i,0,s-1){
		k=i;
		stable_partition(a+1,a+n+1,cmp);
		rep(j,1,n) pf("%d ",a[j]);pf("\n");
	} 
}

标签:ch,省选,day4,int,基数排序,pf,Permutation,rep,cmp
From: https://www.cnblogs.com/liyixin0514/p/18407081

相关文章

  • 代码随想录训练营day41|121. 买卖股票的最佳时机,122.买卖股票的最佳时机II,123.买卖股
    121.买卖股票的最佳时机这题和贪心中的买股票很想,但这里不用考虑局部问题,因为只用买一张卖一张。我想可以用一个数组dp来记录买入价格和卖出价格。然后遍历数组草我感觉我写的想贪心。动态规划dp[i][0]表示第i天不持股的最大收益,dp[i][1]表示第i天持股的最大收益。dp......
  • 【五一省选集训day4】Mansion
    【五一省选集训day4】Mansion注意,本题要求输出最大值,不要把最大值看成编号……srds好像只有我看错了。这个东西一看就很能用莫队做。用莫队按\(l\)分块,再按\(r\)排序。维护一棵线段树,每次移动对线段树进行单点修改和区间求\(\max\),一共\(n\sqrt{n}\)次移动,总时间复杂度......
  • 24暑假算法刷题 | Day41 | 动态规划 IX | LeetCode 188. 买卖股票的最佳时机 IV,309.
    目录188.买卖股票的最佳时机IV题目描述题解309.买卖股票的最佳时机含冷冻期题目描述题解714.买卖股票的最佳时机含手续费题目描述题解188.买卖股票的最佳时机IV点此跳转题目链接题目描述给你一个整数数组prices和一个整数k,其中prices[i]是某支给定......
  • Baby Ehab Plays with Permutations 题解
    前言题目链接:Codeforces;洛谷。题意简述你有一个长度为\(n\)的序列\(p\)满足\(p_i=i\),你可以进行\(x\)次操作,每次操作找到两个不同的\(i,j\)并且交换\(p_i,p_j\),问最终有几个可能的序列。分别求出\(x=1,\ldots,k\)时的答案。\(1\len\le10^9\),\(1\lek\le......
  • 实训day43(9.4)
    一、前期准备1、配置主机映射[root@k8s-master~]#vim/etc/hosts192.168.8.168 k8s-master192.168.8.176 k8s-node1192.168.8.177 k8s-node2[root@k8s-master~]#pingk8s-master2、配置yum源[[email protected]]#vimkubernetes.repo[kuberne......
  • 实训day42(9.3)
    ⼀、编排分类单机容器编排:docker-compose容器集群编排:dockerswarm、mesos+marathon、kubernetes应⽤编排:ansible(模块,剧本,⻆⾊)⼆、系统管理进化史1.传统部署时代早期,各个组织是在物理服务器上运⾏应⽤程序。由于⽆法限制在物理服务器中运⾏的应⽤程序资源使⽤,......
  • 代码随想录day49 || 42、接雨水 84、柱状图中最大的矩形
    42、接雨水functrap(height[]int)int{ //双指针思路,按照列计算雨水高度,分别计算每一列左右高于当前高度的最高柱子高度,然后通过min(left,right)-height[i]得出当前列的雨水体积 varresint varleft,rightint fori:=1;i<len(height)-1;i++{ left,right=......
  • 代码随想录day48 || 739, 每日温度 496, 下一个更大元素 I 503, 下一个更大元素II
    739每日温度funcdailyTemperatures(temperatures[]int)[]int{ //双指针 varres=make([]int,len(temperatures)) fori:=0;i<len(temperatures);i++{ forj:=i+1;j<len(temperatures);j++{ iftemperatures[j]>temperatures[i]{ res[i]=j......
  • 代码随想录算法day4 - 哈希表2
    题目1454.四数相加II给你四个整数数组nums1、nums2、nums3和nums4,数组长度都是n,请你计算有多少个元组(i,j,k,l)能满足:0<=i,j,k,l<nnums1[i]+nums2[j]+nums3[k]+nums4[l]==0示例1:输入:nums1=[1,2],nums2=[-2,-1],nums3=[-1,2],nums4......
  • leetcode刷题day4|链表部分(24. 两两交换链表中的节点 、19.删除链表的倒数第N个节点、
    前言:链表练习的第二天,对链表的理解加深了24.两两交换链表中的节点这个题一开始的思路是用cur和next两个指针来做,但是绕来绕去绕迷糊了,最后超时了。把错误的代码放在下面警醒大家:主要问题出现在这两行代码,next.next发生了更改。next.next=next.next.next;next.next.nex......