定义以$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. 题解 「THUPC 2017」小 L 的计算题 / Sum

    题目传送门 题目大意 给出 \(a_{1,2,...,n}\),对于 \(\forall k\in [1,n]\) ,求出: \[\sum_{i=1}^{n}a_i^k \] \(n\le 2\tim ...

  2. SpringBoot-自动装配2

    配置文件到底能写什么?怎么写? SpringBoot官方文档中有大量的配置,直接去记忆的话,好像不是我们程序员的行事风格! 分析自动配置原理 能自动配置的组件一般都有命名为下面规则的两个类: xxxx ...

  3. EMC测试国家标准GB/T 17626

    转载: 详解EMC测试国家标准GB/T 17626 - whik - 博客园 (cnblogs.com)

  4. Java:Object对象小记

    Java:Object对象小记 对 Java 中的 Object 对象,做一个微不足道的小小小小记 Object 的常用方法有哪些 clone() 方法:用于创建并返回当前对象的一份拷贝: 在Java ...

  5. BUAA_2019_OO_第一单元总结

    一.基于度量来分析自己的程序结构 1.第一次作业 1.1类图: 第一次作业由于比较简单,我采用了面向过程的编程方式.在Polynomail类的构造函数中将项直接求导输出.这样的弊端显而易见,不能进行优 ...

  6. seata整合nacos完成分布式的部署

    seata整合nacos完成分布式的部署 一.背景 二.部署机器 三.部署步骤 1.在seata上创建命名空间 2.下载对应版本的seata 3.单机启动 1.修改seata配置文件 1.修改注册中心 ...

  7. 嵌入式物联网之SPI接口原理与配置

    本实验采用W25Q64芯片 W25Q64是华邦公司推出的大容量SPI FLASH产品,其容量为64Mb.该25Q系列的器件在灵活性和性能方面远远超过普通的串行闪存器件.W25Q64将8M字节的容量分为 ...

  8. Asp.Net 熟悉 Spring

    注:(为加强记忆,所以记录下来,对于有些地方为什么那样写,我也不太理解) 一.我们先创建个窗体应用程序Demos,事先熟悉它是这么实现的 第一步,先在项目的根目录下建一个library文件夹,目的是放 ...

  9. 『动善时』JMeter基础 — 56、JMeter使用命令行模式生成HTML测试报告

    目录 1.自动生成HTML图形化报告 2.使用已有的测试结果文件生成HTML报告 3.HTML图形化报告内容详解 (1)Dashboard页面:(重点查看) (2)Charts页面:(辅助分析) 4. ...

  10. AndroidStudio中debug.keystore文件不存在解决办法

    Android项目丢失了debug.keystore,直接重新生存一个key. 在cmd下,进入C:\Users\Administrator\.android目录执行命令如下:  keytool -g ...