定义以$i$为中心(交换$p_{i-1}$和$p_{i+1}$)的操作为操作$i$

结论1:若执行过操作$i$,则之后任意时刻都无法执行操作$i-1$或操作$i+1$

当执行操作$i$后,必然有$p_{i-1}<p_{i}$,然后不妨假设下一次与$i$相邻的操作为$i-1$($i+1$类似)

操作$i-1$的条件为$p_{i-2}>p_{i-1}>p_{i}$,即要增大$p_{i-1}$或减小$p_{i}$,可以执行操作$i-2$或操作$i+1$,后者根据假设不成立

对于操作$i-2$,其执行完后必然有$p_{i-2}<p_{i-1}$,类似的我们又要求执行操作$i-3$来增大$p_{i-2}$……以此类推,当需要执行操作1来增大$p_{2}$即不合法

推论1:执行操作$i$必须有$p_{i}=i$

根据结论1,执行操作$i$后无法再执行操作$i-1$或$i+1$,即无法再修改$p_{i}$,而最终要求$p_{i}=i$

推论2:若初始$p_{i}\ne i$,则一定不会执行操作$i$;若$p_{i}=i$,则一定不会执行操作$i-1$或操作$i+1$

根据推论1,执行操作$i$需要$p_{i}=i$,而修改$p_{i}$必然执行了操作$i-1$或$i+1$,则不能执行操作$i$

根据推论1,执行操作$i-1$($i+1$类似)要求$p_{i-1}=i-1<p_{i}$,不成立

考虑将整个序列划分为独立的若干段,即要求每一段的端点都不能操作,这等价于将其在$i$和$i+1$之间断开则要求$i$和$i+1$都无法操作,不妨将所有这些位置都断开,考虑每一段的形式:

1.那么每一段必然不会出现相邻两数$i$和$i+1$使得$[p_{i}=i]=[p_{i+1}=i+1]$,否则必然可以断开

2.如果端点满足$p_{i}=i$(以下假设为左端点),则$i$无法操作,同时$i+1$也无法操作,可以断开(除非$i+1$不在该段中,即仅一个$p_{i}=i$)

更形象的,记$s_{i}=[p_{i}=i]$(一个01串),那么最终每一段的$s$分为两种:1.仅一个'1';2.以'0'为开头结尾的'01010...10'

对于第1种段直接删去即可,对于第2种继续分析

可以看作对$p_{l},p_{l+2},...,p_{r}$这一段排序,而要交换$p_{i}$和$p_{i+2}$,则要求$p_{i}>i+1>p_{i+2}$

由于$p_{i}\equiv i(mod\ 2)$,因此$p_{i}>i+1$也即$p_{i}>i$,类似的后者也即$i+2>p_{i+2}$

对于初始$p_{i}>i$的位置,其一定只能向后交换,且若交换至$p_{i}=i$,根据推论2,一定不会再改变($p_{i}<i$的位置类似)

其限制且仅限制(若两点都满足交换方向一定可行)了每一个数的交换方向,那么合法即要求:

1.如果是区间$[l,r]$,$\forall l\le i\le r,l\le p_{i}\le r$

2.对于$p_{i}>i$的位置,其之前不存在比其大的数;对于$p_{i}<i$的位置,其之后不存在比其小的数

 1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 300005
4 int n,a[N],p[N];
5 int main(){
6 scanf("%d",&n);
7 for(int i=1;i<=n;i++)scanf("%d",&a[i]);
8 for(int i=1;i<=n;i++)p[i]=1;
9 for(int i=1;i<=n;i++)
10 if (a[i]!=i)p[i]=0;
11 else p[i-1]=p[i+1]=0;
12 for(int i=1,j=1;i<=n;i=++j){
13 for(;j<n;j++)
14 if ((!p[j])&&(!p[j+1]))break;
15 if ((i==j)&&(p[i]==i))continue;
16 for(int k=i;k<=j;k++)
17 if ((a[k]<i)||(j<a[k])){
18 printf("No");
19 return 0;
20 }
21 int mx=0,mn=n;
22 for(int k=i;k<=j;k++){
23 if ((a[k]>k)&&(a[k]<mx)){
24 printf("No");
25 return 0;
26 }
27 mx=max(mx,a[k]);
28 }
29 for(int k=j;k>=i;k--){
30 if ((a[k]<k)&&(a[k]>mn)){
31 printf("No");
32 return 0;
33 }
34 mn=min(mn,a[k]);
35 }
36 }
37 printf("Yes");
38 }

[atARC102F]Revenge of BBuBBBlesort的更多相关文章

  1. atcoder题目合集(持续更新中)

    Choosing Points 数学 Integers on a Tree 构造 Leftmost Ball 计数dp+组合数学 Painting Graphs with AtCoDeer tarja ...

  2. 【Atcoder】ARC102 题解

    C - Triangular Relationship 题解 枚举一个数%K的值然后统计另两个 代码 #include <bits/stdc++.h> #define enter putc ...

  3. 2018.09.02 Atcoder Regular Contest 102简要题解

    比赛传送门 T1 Triangular Relationship 分析之后发现有两种情况: 1. n为奇数,那么所有数都是k的倍数. 2. n为偶数,那么所有数都是k/2的倍数. 然后就可以愉快A题了 ...

  4. AtCoder Regular Contest 102

    AtCoder Regular Contest 102 C - Triangular Relationship 题意: 给出n,k求有多少个不大于n的三元组,使其中两两数字的和都是k的倍数,数字可以重 ...

  5. HDU 3341 Lost's revenge(AC自动机+DP)

    Lost's revenge Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)T ...

  6. HDU 5019 Revenge of GCD(数学)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5019 Problem Description In mathematics, the greatest ...

  7. L - Abbott's Revenge(比较复杂的bfs)

    Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Status Practice UV ...

  8. hdu 4099 Revenge of Fibonacci 大数+压位+trie

    最近手感有点差,所以做点水题来锻炼一下信心. 下周的南京区域赛估计就是我的退役赛了,bless all. Revenge of Fibonacci Time Limit: 10000/5000 MS ...

  9. HDU5088——Revenge of Nim II(高斯消元&矩阵的秩)(BestCoder Round #16)

    Revenge of Nim II Problem DescriptionNim is a mathematical game of strategy in which two players tak ...

随机推荐

  1. sarama的消费者组分析、使用

    以前老的sarama版本不支持消费者组的消费方式,所以大多数人都用sarama-cluster. 后来sarama支持了消费者组的消费方式,sarama-cluster也停止维护了,但网上关于sara ...

  2. 题解 CF468C Hack it!

    题目传送门 Description 设 \(f(i)\) 表示 \(i\) 的数码只和,给出 \(a\),求出 \(l,r\) 使得 \(\sum_{i=l}^{r} f(i)\equiv 0\pmo ...

  3. bzoj1503 郁闷的出纳员(平衡树,思维)

    题目大意: 现在有n个操作和一个最低限度m \(I\)命令\(I\ k\)新建一个工资档案,初始工资为k. \(A\)命令$A\ k $把每位员工的工资加上k \(S\)命令$S\ k $把每位员工的 ...

  4. FastAPI 学习之路(八)路径参数和数值的校验

    系列文章: FastAPI 学习之路(一)fastapi--高性能web开发框架 FastAPI 学习之路(二) FastAPI 学习之路(三) FastAPI 学习之路(四) FastAPI 学习之 ...

  5. NX屏蔽窗口的按钮

    有时候在激活一个命令按钮的时候,需要同时禁止掉另外一个或多个命令按钮 ''' <summary> ''' 取按钮是否敏感 ''' </summary> ''' <para ...

  6. Framework - 性能统计

    摘要 近期对接客户时,客户方希望提供 SDK 的性能.内存.隐私支持等一些数据,所以就对 SDK 进行了一些性能测试. 在用表格统计整理这些数据时,突然发现,经常用统计的方式看 SDK 的相关数据,似 ...

  7. Qt字符编码小知识

    1.VS2010默认编码是GBK,Qt5的内置编码是utf-8,想要在VS2010及其以上版本,优雅的使用utf-8的字符编码需要 // Coding: UTF-8(BOM) #if defined( ...

  8. 【行人惯性导航】关于行人导航中IMU位姿推导的知识点及相关代码

    IMU姿态惯性推导 最近从事行人惯性导航的研究,本人也是一个小白,其中看了很多文献,有很多个人思考很费时间的地方,撰写此随笔的目的不仅是给自己做一个笔记,也是给各位有需要的仁兄一点个人理解. 本文只关 ...

  9. hdu 1848 Fibonacci again and again (SG)

    题意: 3堆石头,个数分别是m,n,p. 两个轮流走,每走一步可以选择任意一堆石子,然后取走f个.f只能是菲波那契中的数(即1,2,3,5,8.....) 取光所有石子的人胜. 判断先手胜还是后手胜. ...

  10. 『学了就忘』Linux基础 — 16、Linux系统与Windows系统的不同

    目录 1.Linux严格区分大小写 2.Linux一切皆文件 3.Linux不靠扩展名区分文件类型 4.Linux中所有的存储设备都必须在挂载之后才能使用 5.Windows下的程序不能直接在Linu ...