首页 > 其他分享 >Codeforces Round 832 (Div. 2) B. BAN BAN

Codeforces Round 832 (Div. 2) B. BAN BAN

时间:2023-09-09 18:56:08浏览次数:35  
标签:832 最大树 交换 Codeforces 序列 BAN Div 观察

给一个正整数 \(n\) ,定义 \(S{n}\) 为字符串 \(BAN\) 复制 \(n\) 次。比如 \(S(3) = BANBANBAN\) 。可以对 \(S(n)\) 执行任意次以下操作:

  • 选择 \(i, j (1 \leq i, j \leq 3n, i \neq j)\) 。\(swap(s_i, s_j)\) 。

希望 \(BAN\) 不作为一个子序列出现在 \(S(n)\) 中,输出最小交换数,和每次的交换位置。

观察一:\(S(n) = BANBAN \cdots BAN\) 中,建立所有 \(B-A-N\) 的连接,则得到一个森林

观察二: \(B\) 可以作为森林中一颗树的根。越靠左的 \(B\) 可以得到的树越大。需要打破这些根,也就是 \(B\) 需要执行交换。

观察三:最优方案是反复让最大树和最小树互相打破。

  • 证明:这可以严格保证每次的最大树和最小树永远有位置可以互相交换。而其他情况可能不能。

以上的观察为森林角度。

本题在序列角度的 trick:从一个序列的角度考虑,就是从两边删除,且被删除部分。不会对未删除部分造成影响。

于是每次让第一个 \(BAN\) 的 \(B\) 和最后一个 \(BAN\) 的 \(A\) 或 \(N\) 交换即可。

若 \(n\) 为奇数,最后剩下一个 \(BAN\) ,多执行一次任意交换即可。

前 \(x\) 个 \(BAN\) 的有 \(3x\) 个字符;第 \(x\) 个 \(BAN\) 的第 \(k\) 个字符为 \(3(x-1) + k\) 。

view
#include <bits/stdc++.h>
void solve() {
	int n; std::cin >> n;
	std::vector<std::pair<int,int>> segs;
	for (int i = 1; i <= n / 2; i++) segs.push_back({(i - 1) * 3 + 1, (n - i) * 3 + 2});
	if (n & 1) { // n/2 * 3 + k
		segs.push_back({n/2*3+1,n/2*3+2});
	}
	int m = segs.size();
	std::cout << m << '\n';
	for (int i = 0; i < m; i++) {
		std::cout << segs[i].first << ' ' << segs[i].second << '\n';
	}
}
signed main() {
	int _ = 1; std::cin >> _;
	while (_--) solve();
	return 0;
} 

标签:832,最大树,交换,Codeforces,序列,BAN,Div,观察
From: https://www.cnblogs.com/zsxuan/p/17689952.html

相关文章

  • [题解] Codeforces Round 895 (Div. 3) F~G
    CodeforcesRound895(Div.3)F~GF.SellingaMenageri考虑如何让卖出的价格翻倍,那么自然是从\(i\toa_i\)。通过这样连边,我们可以发现,边集构成了基环树森林。显而易见的是,如果不考虑环,那么图就是拓扑图,按照拓扑关系跑一遍,就可以使得所有点价值最多。现在考虑环上的问题......
  • SMU Autumn 2023 Round 1(Div.1)
    SMUAutumn2023Round1(Div.1)A.SetorDecrease(枚举)题意就是你可以进行两种操作,将\(a_i-1\)或者令\(a_i\)等于\(a_j\),然后使得\(\sum\limits_{i=1}^{n}a_i\leqk\),求最少的操作步数首先我们让一个大数变成一个最小数的贡献肯定是要比让大数减一产生的贡献更多,所以我......
  • Codeforces Round 895 (Div. 3)
    CodeforcesRound895(Div.3)比赛链接A.TwoVessels题目链接给你三个数a,b,c每次把a,b中较大的数中拿去最多等于c的数给较小的数字,问多少次使得a,b两个数字相等。A思路:可恶,在写的过程中出现了精度丢失的情况,导致出现了好多问题,问多少次使得a和b相等,就是\[abs(a-b)/2/c向上取......
  • CodeForces 960G Bandit Blues
    洛谷传送门CF传送门发现设排列最大值位置为\(i\),那么\([1,i]\)只可能存在前缀最大值,\([i,n]\)只可能存在后缀最大值。由此设\(f_{i,j}\)为长度为\(i\)的排列,前缀最大值有\(j\)个的方案数,有转移:\[f_{i,j}=f_{i-1,j-1}+(i-1)f_{i-1,j}\]意思是每......
  • Codeforces Round 406 (Div. 2) D. Legacy 线段树优化建图
    传送门题目大意:给定n个点,m个操作,和起点s。其中n和q大于等于1小于等于1e5,s大于等于1小于等于n其中m个操作有三种情况:  1.输入1uvval表示从u号点向v号点连一个权值为val的有向边,其中1<=u<=n,1<=v<=n,1<=val<=1e9  2.输入2ulrval表示从u号点......
  • Educational Codeforces Round 154 (Rated for Div. 2)
    EducationalCodeforcesRound154(RatedforDiv.2)比赛链接我都快忘了还有这一场比赛,今天打开cf看见这场比赛正好有时间就补了!!!2023.9.3也许是出去玩了一下午脑子不够用了??怎么现在读题都有一点读不懂了!!!2023.9.4我靠这场我怎么感觉没什么思路呢????A题PrimeDeletion题目链接......
  • Bandicam下载 最新版下载安装 中文版介绍
    高清视频录制工具(Bandicam)是一款由韩国开发的高清录制视频的工具,别看高清视频录制工具(Bandicam)体积小巧,但是功能确实相当不错,其不但操作十分简单,而且录制出来的效果非常高清,让我们可以观看到高质量的视频。软件地址:看置顶贴解决在【录制设置】->【音频】的关于麦克风音量调整的......
  • Bandicam下载-高清视频录制工具(Bandicam) 中文版介绍
    Bandicam是一款广受欢迎的屏幕录制软件,该软件使用硬件加速技术实现游戏录屏功能,通过英特尔处理器快速的扫描并录制,从而录制出来的视频很高清,并且没有任何录制时长限制。软件还可以在录制过程中将游戏声音及麦克风同步,从而让你获取完全高品质音质内容。软件地址:看置顶贴bandicam功能......
  • Pinely Round 2 (Div. 1 + Div. 2)
    Channel简单分类讨论情况即可 算下最多有多少人在线即可voidsolve(){intn,a,q;cin>>n>>a>>q;intadd=0,minn=0,maxx=0;cin>>in+1;for(inti=1;i<=q;i++){if(in[i]=='+')......
  • Educational Codeforces Round 154 (Rated for Div. 2)
    Preface太FW了现在,纯纯给队伍拖后腿,马上要成为我们队CFRating最低的了但换句话说徐神和祁神都这么猛,我直接躺着被嘎嘎带飞好像也很爽啊不管怎么样还是要多练,不过接下来可能要按专题重点突破了,明天队里开个会确定下大家的主攻方向再说A.PrimeDeletion因为\(13\)和\(31\)都......