首页 > 其他分享 >CF1864B Swap and Reverse 题解

CF1864B Swap and Reverse 题解

时间:2023-08-29 23:47:25浏览次数:41  
标签:CF1864B 奇数 int 题解 奇偶性 偶数 Swap include

注意到交换操作,无法改变下标的奇偶性,因此只能通过考虑翻转操作改变。注意到如果 \(i\) 是奇数,那么要令 \(i+k-1\) 为偶数的话 \(k\) 必须为偶数,若 \(i\) 是偶数,要令 \(i+k-1\) 是奇数的话,\(k\) 也应为偶数,而 \(k\) 为奇数的情况翻转了也无法改变奇偶性。

因此通过 \(k\) 的奇偶性进行分类,分完类 \(k\) 就没用了。

\(k\) 为偶数的时候,将整个字符串进行排序就好,反之按照下标的奇偶性进行分类排序。

#include <cstdio>
#include <algorithm>

int t;
int n,k;
int s1[100005],s2[100005];
int cnt1,cnt2;

void solve() {
	cnt1=cnt2=0;
	scanf("%d%d",&n,&k);
	char c;
	for(int i=1;i<=n;i++) {
		scanf(" %c",&c);
		if(i&1) s1[++cnt1]=c-'a';//按照下标奇偶性分类 
		else s2[++cnt2]=c-'a';
	}
	std::sort(s1+1,s1+cnt1+1);//排序 
	std::sort(s2+1,s2+cnt2+1);
	s1[cnt1+1]=s2[cnt2+1]=90;
	if(k&1) {//按照k的奇偶性分类 
		int tot1=0,tot2=0;
		for(int i=1;i<=n;i++) {
			if(i&1) printf("%c",s1[++tot1]+'a');
			else printf("%c",s2[++tot2]+'a');
		}
	} else {
		int tot1=1,tot2=1;
		for(int i=1;i<=n;i++) {
			if(s1[tot1]<s2[tot2]) {
				printf("%c",s1[tot1]+'a');
				++tot1;
			} else {
				printf("%c",s2[tot2]+'a');
				++tot2;
			}
		}
	}
	printf("\n");
}

int main() {
	scanf("%d",&t);
	while(t--) solve();
	return 0;
}

标签:CF1864B,奇数,int,题解,奇偶性,偶数,Swap,include
From: https://www.cnblogs.com/Scorilon/p/17666132.html

相关文章

  • CF1839C Insert Zero and Invert Prefix 题解
    首先考虑无解的情况,很明显\(a_n\)必须为\(0\),否则没有解,因为如果最后一位为\(1\)那么必须有\(n\)这个数存在于\(b\)序列中,而这种情况时不符合题意的。然后考虑如何求解,先考虑一种比较特殊的情况,就是若干个\(1\)后面接着一个\(0\),这里假设\(1\)的数量有\(k\)个,这......
  • P9437 『XYGOI round1』一棵树 题解
    首先这是一道很明显的换根dp。首先注意到要拼接数,所以我们可以先处理出\(num_i=10^{x}\),使得\(10^x>a_i>10^{x-1}\),这样方便我们后面算贡献。我们以这棵树为例子来推状态转移方程。先假设\(dp_u\)表示以\(1\)为根时,从\(u\)的子树的点到\(u\)的权值和。那么\[......
  • CF1862E Kolya and Movie Theatre 题解
    先注意到我们娱乐值损耗的多少只与最后一场电影有关系,所以假设最后一场电影看的下标为\(k\),那么最后就要减去\(d\timesk\)。得出这个性质之后开个小根堆反悔贪心即可,首先\(a_i<0\)的没必要考虑,对于\(a_i>0\)的,如果还没到\(m\)场电影,我们就直接往里塞就可以,如果到了,我们......
  • P8675 [蓝桥杯 2018 国 B] 搭积木 题解
    总述此题用区间dp解决,二维前缀和优化。朴素做法阶段:自上而下数每一层。状态:\(dp_{i,l,r}\)表示自上而下数第\(i\)行中在\([l,r]\)摆积木的方案数。状态转移方程:根据题意可知,若要在\([l,r]\)中摆积木,那么\([l,r]\)中不允许有\(\tt{X}\),而第\(i\)层的\([l,r]\)......
  • P7809 [JRKSJ R2] 01 序列 题解
    对于第二种操作,很容易想到只有\(1\)或\(2\)两种答案,若该区间内存在\(01\)这个子序列,那么答案为\(2\)反之为\(1\).可以通过对该\(01\)串做一个前缀和,若出现\(01\)这个子序列就累加,最后判断左右端点是否相等即可,时间复杂度\(O(n)\).对于第一种操作,\(\text{Subtest1}......
  • CF1833D Flipper 题解
    赛场上思路出来了但是代码没调出来。首先考虑右端点,很明显,要让操作后的序列字典序尽量地大,那么就要使操作后的序列第一个数尽量地大,考虑\(n\)或\(n-1\),如果\(n\)在原序列的第一个位置,那么此时无论怎么调整都无法使得它在新序列的第一个位置,此时就要考虑让\(n-1\)在新序列......
  • UVA10054 The Necklace题解
    题意给定一个无向图,其中至多有\(50\)个结点,求是否有欧拉回路。题解很明显就是一个无向图求欧拉回路的板子,我们用\(\tt{Hierholzer}\),先说存图,要明确的一个点是这个无向图里是有可能有重边的,所以我们要注意记录的时候不应是单独地记录某一条边是否存在,而是要记录某一条边的数......
  • UVA967的题解
    设\(check_i\)为\(1\simn\)中满足题意的数的数量。显然答案为\(check_j-check_{i-1}\)。注意到\(check\)能直接暴力求出来。那么就可以先把\(10^6\)范围内的所有质数求出来,然后所有数跑一遍,每个数都去旋转得出所有数后判断是否均为质数,记录下来。代码很好写。#incl......
  • 一些奇怪的题的题解
    给定\(n\),求:\[\sum_{i=1}^n\sum_{j=1}^n\frac{i+j}{\gcd(i,j)}\]思路分析:先化式子:\[\begin{aligned}\sum_{i=1}^n\sum_{j=1}^n\frac{i+j}{\gcd(i,j)}&=\sum_{d=1}^n\sum_{i=1}^n\sum_{j=1}^n\frac{i+j}{d}[\gcd(i,j)=d]\\&=\sum_{d=1}^n\s......
  • CF1774 题解
    A考虑在所有\(0\)前添加正号,在\(1\)前轮流添加正负号即可。B首先根据抽屉原理,我们可以取出最多的颜色,个数记为\(mx\),然后其余颜色可以填在\(mx\)的两两中间,最少要有\((mx-1)(k-1)\)个空位。但是只是必要的,而不是充分的。考虑有多个最大值的情况,发现这些不是作为分界......