草庐IT

BZOJ4975 区间翻转

tanjunming2020 2023-04-27 原文

题目大意

有一个长度为 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)

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 区间翻转的更多相关文章

  1. ruby - 需要为 Proc 实现 Haskell 的翻转 - 2

    Haskell的Prelude有一个有用的函数,可以交换函数的参数:http://zvon.org/other/haskell/Outputprelude/flip_f.html我需要在Ruby中做同样的事情。我不想仅仅定义一个自定义方法,而是想猴子修补Proc类,以便我可以将flip与Proc#curry一起使用。有点像f=lambda{|x,y|[x,y]}g=f.flip.curry.(2)为y提供一个值。我不知道如何重新打开Proc类来做到这一点。 最佳答案 classProcdeffliplambda{|x,y|self.

  2. javascript - 水平翻转 .​​getUserMedia 的网络摄像头图像流 - 2

    所以我一直在搞乱这个页面:https://tutorialzine.github.io/pwa-photobooth/基本上它的作用是激活您的网络摄像头并让您直接从流中拍摄快照,我为我的网络借用了它,但视频流被翻转了,我想镜像视频流以便感觉更好。注意:我是一个js新手,所以欢迎详细解释。这是代码,您可能必须使用Firefox而不是Chrome:$('.closecam').click(function(){$('.webcam__overlay').hide();}); $('.camera').click(function(){$('.webcam__overlay').show()

  3. javascript - jquery怎么做翻转效果? - 2

    我正在尝试模仿通常在具有面板的移动设备上发现的效果,当您单击一个按钮时它会旋转,而在另一侧它会显示一些其他信息。我发现了一些使用css转换和hereisanexample的代码js$('#signup').on('click',function(e){e.preventDefault();document.getElementById('side-2').className='flipflip-side-1';document.getElementById('side-1').className='flipflip-side-2';});$('#create').on('click',

  4. javascript - 为什么我不能使用带有多重选择器的 prop() 翻转检查属性? - 2

    我知道通常当需要多个类来选择不同的类时,我们使用,并且我也四处搜索以确保我没有记错但不知何故如果我使用,没有错误,但它不会检测到第二个选择,只检测到第一个。如果我分别调用这些类,那么代码就可以工作了。谁能告诉我我在jQuery上做错了什么?这有效。if(($('.use-remaining').prop("checked"))||(($('.use-briquettes').prop("checked")))){}但如果我这样做,它就不会工作if(($('.use-remaining,.use-briquettes').prop("checked"))){}我有三个复选框。在表单提交之

  5. javascript - 进行图像翻转的最佳方法? - 2

    我希望将鼠标悬停时更改主徽标。我知道有几种方法可以实现此目的,并且想知道哪种方法最稳定,浏览器兼容,效率更高,易于设置的最佳方法。我发现的一些方法是:用Javascript(jQuery)替换“src”属性。CSS使用背景和“悬停”还有吗什么才好 最佳答案 底线对于内容丰富的图像,您希望在HTML标记中包含src。您要使用Javascript解决方案,并将过渡图像放在属性中。对于无内容的图像UI元素,尤其是在站点中常见或重复的图像UI元素,最好使用直接的CSS解决方案(因此您不必在每次调用时都重新声明图像位置)。在CSS解决方案中,

  6. javascript - 如何翻转 Twitter Bootstrap 的工具提示 - 2

    我正在使用Twitter的Bootstrap来实现工具提示。目前,工具提示显示在链接上方。我希望工具提示出现在链接下方。我该怎么做呢?我正在触发工具提示,它清楚地指出“底部”,但它不想为我工作...$('#home').tooltip('hidebottom') 最佳答案 $('#tooltip').tooltip({placement:'left',title:'firsttooltip'});在内部使用标签,或在单独的JavaScript文件中。 关于javascript-如何翻转T

  7. javascript - 编写 jQuery rolodex 样式的时钟翻转动画? - 2

    我正在努力根据那些带有翻转数字的旧时钟制作一个简单的动画。我在下面添加了一张从PremiumPixels上找到的免费赠品PSD复制的图片:我遇到的最大问题是使用jQuery在HTML/CSS/JavaScript中构建“翻转”动画。我找到的唯一教程是fromthisnettuts+article实际上使用图像。它将时钟的上半部分和下半部分分成两个不同的图像集,并为经过的每一秒替换它们......这种方法在网站中是不现实的,因为它没有为读者提供实际的上下文。我更愿意将数字硬编码到HTML中并仅通过jQuery执行翻转动画-最好没有图像,除了背景自动收报机框。或者换句话说,数字被编码成HT

  8. javascript - jQuery 翻转插件开关功能在开关上失败 - 2

    我有一段代码,其中有两个按钮,当我按下一个按钮时,我希望一个div在y轴上翻转,当我按下另一个按钮时,我希望同一个div在x轴上翻转.当我使用按钮作为y轴时,即使之前的翻转位于x轴上,这也能正常工作。但是当我想从y轴切换到x轴时,我需要按两次x按钮,因为第一次没有任何反应。所以期望的行为是:单击y按钮在y轴上翻转div。单击x按钮在x轴上翻转div。当前行为是:单击y按钮div在y轴上翻转。点击x按钮没有任何反应再次单击x按钮div在x轴上翻转。我不知道问题出在哪里,这是迄今为止我得到的最好的。感谢所有帮助。varax='x';$(document).ready(function(){

  9. javascript - 如果手动切换翻转开关,如何仅触发事件 - 2

    我创建了一个像这样的jQueryMobile翻转开关LionRose我听着这个翻转开关的变化$(document).on('change','#flip',function(e){console.log('changed');}但我不希望如果我将翻转开关的值更改为$('#flip').val('flower').flipswitch('refresh');如何通过直接与翻转开关交互或设置值并刷新翻转开关来检查翻转开关是否已更改?我在thisJSFiddle下创建了一个不良行为示例. 最佳答案 您需要使用.on()附加change事件

  10. javascript - 使用 css 和 javascript 将 div 翻转 180 度 - 2

    我想使用触发css动画的javascript函数将div翻转180度。我的div有以下声明:.start-photo-thumb{position:relative;float:left;background:#444444;height:192px;width:192px;margin-right:10px;margin-bottom:10px;perspective:1000px;animation:rotating0.6slinearinfinite;animation-play-state:paused;}@keyframesrotating{from{transform:ro

随机推荐