BZOJ4975 区间翻转

这篇具有很好参考价值的文章主要介绍了BZOJ4975 区间翻转。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

题目大意

有一个长度为 n n n的序列 a 1 , a 2 , … , a n a_1,a_2,\dots,a_n a1,a2,,an。小 Q Q Q和小 T T T在玩游戏。两人轮流操作,小 Q Q Q先手。对于每次操作,玩家需要选择一个长度为 4 x + 2 4x+2 4x+2 4 x + 3 4x+3 4x+3的区间 [ l , r ] [l,r] [l,r],其中 x x x是玩家自行选择的非负整数。然后将 a l , a l + 1 , … , a r − 1 , a r a_l,a_{l+1},\dots,a_{r-1},a_r al,al+1,,ar1,ar翻转。每次操作之后得到的新序列的字典序必须比操作前的序列大。第一个不能继续操作的玩家输。假设小 Q Q Q和小 T T T都采取最优策略,问谁会获胜。如果小 Q Q Q获胜,则输出 Q Q Q;如果小 T T T获胜,则输出 T T T

数据范围

q ≤ 50 ≤ n , 1 ≤ a i ≤ n q\leq 50\leq n,1\leq a_i\leq n q50n,1ain a i a_i ai互不相同。


题解

首先,我们知道在区间翻转后,该区间的顺序对和逆序对的数量互换。

观察题目所给的选择范围 4 x + 2 4x+2 4x+2 4 x + 3 4x+3 4x+3

  • 4 x + 2 4x+2 4x+2的区间内的顺序对和逆序对的和为 ( 4 x + 2 ) ( 4 x + 1 ) 2 = ( 2 x + 1 ) ( 4 x + 1 ) \dfrac{(4x+2)(4x+1)}{2}=(2x+1)(4x+1) 2(4x+2)(4x+1)=(2x+1)(4x+1)
  • 4 x + 3 4x+3 4x+3的区间内的顺序对和逆序对的和为 ( 4 x + 3 ) ( 4 x + 2 ) 2 = ( 4 x + 3 ) ( 2 x + 1 ) \dfrac{(4x+3)(4x+2)}{2}=(4x+3)(2x+1) 2(4x+3)(4x+2)=(4x+3)(2x+1)

我们发现,区间内的顺序对和逆序对的和一定为奇数。那么一次翻转之后,整个序列的顺序对和逆序对的奇偶性都取反。

在游戏结束时, a a a序列是递减序列,顺序对的个数为 0 0 0。那么如果当前的顺序对的个数是偶数,则不管你怎么旋转,接下来的顺序对的个数一定是奇数,对手在翻回偶数,当到 0 0 0时你就输了。如果当前的顺序对的个数是奇数,则你一定会胜利。

所以,我们可以先算出顺序对的个数。如果为奇数,则先手必胜;如果为偶数,则后手必胜。

时间复杂度为 O ( n 2 ) O(n^2) O(n2)文章来源地址https://www.toymoban.com/news/detail-411108.html

code

#include<bits/stdc++.h>
using namespace std;
int n,fl=0,a[55];
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<i;j++){
			if(a[i]>a[j]) ++fl;
		}
	}
	if(fl%2==1) printf("Q");
	else printf("T");
	return 0;
}

到了这里,关于BZOJ4975 区间翻转的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【LeetCode题目详解】第八章 贪心算法 part05 435. 无重叠区间 763.划分字母区间 56. 合并区间 (day36补)

    给定一个区间的集合  intervals  ,其中 intervals[i] = [starti, endi]  。返回 需要移除区间的最小数量,使剩余区间互不重叠  。 示例 1: 示例 2: 示例 3: 提示: 1 = intervals.length = 105 intervals[i].length == 2 -5 * 104 = starti  endi = 5 * 104 相信很多同学看到这道题目都冥冥之中感觉要排序,但

    2024年02月11日
    浏览(53)
  • C语言的三个经典题目:三步翻转法、杨氏矩阵、辗转相除法

    三步翻转法是C语言中用来求旋转字符串的一种进阶方法,我们以具体例题对其进行介绍。 例:求一个字符串左旋n个字符后得到的新字符串 普通方法实现 我们知道,左旋一个字符一共分为三步: 将字符串的第一个字符存放到临时变量中; 将字符串中除’\\0’外的所有字符整

    2024年02月02日
    浏览(51)
  • 【LeetCode题目详解】 977.有序数组的平方 209.长度最小的子数组59.螺旋矩阵II day2

    看完这个题目第一想法就是直接暴力解决,直接将全部平方然后进行排序。比如快排。 代码如下: 时间复杂度是 O(nlogn)或者说【O(n + nlogn)】,括号里面这个是为了比较接下来的方法。 然后看了代码随想录的视频学习了用双指针来写这道题的方法(说实话不看视频真没想到可

    2024年02月13日
    浏览(43)
  • 刚入职因为粗心大意,把事情办砸了,十分后悔

    刚入职,就踩大坑,相信有很多朋友有我类似的经历。 5年前,我入职一家在线教育公司,新的公司福利非常好,各种零食随便吃,据说还能正点下班,一切都超出我的期望,“可算让我找着神仙公司了”,我的心里一阵窃喜。 在熟悉环境之后,我趁着上厕所的时候,顺便去

    2024年02月05日
    浏览(50)
  • Java判断一个时间是否在当前时间区间!

            前言:我现有个定时任务 每天上午10下午4点查一次表有没有录入新数据进来 有时候录半天就没录入了 所以还得知道他是不是新数据 得知道 这条数据的时间在没在当前时间左右范围内  在的话就还在正常录入 。 目录 1.所需条件 2.将这三个进行转换类型  3.做条

    2023年04月26日
    浏览(69)
  • 创建一个具有背景轮播和3D卡片翻转效果的个人名片网页

    目录 项目展示 图片展示 前言 项目目标 项目目标 步骤 3:CSS 样式 步骤 4:JavaScript 动画 项目源码 知识点介绍 (大佬请绕道) HTML 结构的构建 2. CSS 样式的设计 3. JavaScript 动画的实现 4. 背景图轮播的逻辑 5. CSS 3D变换的使用 结语 项目展示 点击下面链接(第一次打开可能会有

    2024年02月08日
    浏览(42)
  • 最后一个单词的长度

    58. 最后一个单词的长度 给你一个字符串  s ,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中  最后一个  单词的长度。 单词  是指仅由字母组成、不包含任何空格字符的最大子字符串。 示例 1: 示例 2: 示例 3: 提示: 1 = s.length = 104 s  仅有英文字母和空

    2024年02月20日
    浏览(45)
  • BZOJ2982 combination(lucas定理)

    题目大意 LMZ有 n n n 个不同的基友,他每天晚上要选 m m m 个一起玩,而且要求每天晚上的选择都不一样。那么LMZ能够持续多少个这样的夜晚呢?当然,LMZ的一年有10007天,所以他想知道答案   m o d   10007 bmod 10007 mod 10007 的值。 有 t t t 组数据。 1 ≤ t ≤ 200 , 1 ≤ m , n ≤ 20

    2024年02月06日
    浏览(36)
  • Leetcode 最后一个单词的长度

    给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。 单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。 示例 1: 输入:s = “Hello World” 输出:5 解释:最后一个单词是“World”,长度为5。 示例 2: JavaScr

    2024年02月10日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包