P7362 [eJOI 2020 Day2] XOR Sort

题意

给你一个长度为 \(n\) 的序列,每次操作可以将一个数异或上相邻的一个数,求将序列改为严格单调递增序列或严格单调不降序列的操作次数的操作序列。

注意,改为严格单调递增序列的数据 \(n\leq 200\) 且每个数不相同,改为严格单调不降序列的数据 \(n\leq 1000\)。

不要求操作次数最小,次数需不大于 \(40000\),元素大小小于 \(2^{20}\)。

思路

严格单调递增序列的数据实测如果改了数列很容易造成数字相同然后挂掉的情况出现。反而严格单调不降的条件用异或容易满足且数据范围大。我们考虑对数据分治。

  • 严格单调递增序列

我们考虑冒泡排序的思想,每次用异或交换相邻两项,可以过第一档部分分。

考虑优化这个过程。考虑每次将一个最大的数换到序列最后的方法。设

\[A=\{a,b,c,d,e,f,g\}
\]

若此时 \(d\) 是最大的数,我们想把它换到最后面,设 $\oplus $ 表示二进制异或操作,我们可以先将序列变为

\[\{a\oplus b,b\oplus c,c\oplus d,d\oplus e,e\oplus f,f\oplus g,g\}
\]

对于 \(d\oplus e\) 后面的元素,我们将它们按顺序与前一项异或,容易发现序列变为

\[\{a\oplus b,b\oplus c,c\oplus d,d\oplus e,d\oplus f,d\oplus g,d\}
\]

那么我们就将 \(d\) 换到队尾去了。为了消除 \(d\) 的影响,我们将前面的元素也进行类似的操作

\[\{a\oplus d,b\oplus d,c\oplus d,d\oplus e,d\oplus f,d\oplus g,d\}
\]

此时对于缩小了一个长度的序列重复进行求解即可。注意每次寻找的是原数列上的最大值而非每次更新完后的值。

操作次数为 \(\frac 12\times 2n^2=n^2\)。

  • 严格单调不降序列

从高位向低位考虑,每次我们仅考虑序列这一位的数,若非全 \(0\) 则一定能通过异或将其变为只剩一个 \(1\) 。从左往右考虑清零,若 \(a_i\) 该位为 \(1\),那么我们让 \(a_{i+1}\oplus a_i\) 使该位为 \(1\)(若本为 \(1\) 则不操作)。操作完后使最后一位为 \(1\),并将序列长度减 \(1\)(结尾位置前移)。

注意当有一位为全 \(0\) 的时候我们不能将序列长度缩短,因为我们保证序列单调不降的方法是后面的最高位二进制位数比前面的大,全 \(0\) 的话会导致不满足并被卡。虽然实际上该题数据没有卡这个。

实现

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cctype>
#include<cstring>
#include<cmath>
#include<utility>
using namespace std;
inline int read(){
int w=0,x=0;char c=getchar();
while(!isdigit(c))w|=c=='-',c=getchar();
while(isdigit(c))x=x*10+(c^48),c=getchar();
return w?-x:x;
}
namespace star
{
const int maxn=1005;
int n,a[maxn];
int Ans;
pair<int,int> ans[1000005];
inline void work1(){
static int b[maxn];
for(int i=1;i<=n;i++) a[i]=b[i]=read();
for(int len=n-1;~len;len--){
int x=0;
for(int i=1;i<=len+1;i++) if(b[i]>b[x]) x=i;
for(int i=1;i<=len+1 and i<n;i++) a[i]^=a[i+1],ans[++Ans]=make_pair(i,i+1);
for(int i=x;i<=len;i++) a[i+1]^=a[i],ans[++Ans]=make_pair(i+1,i),swap(b[i],b[i+1]);
for(int i=x-1;i>1;i--) a[i-1]^=a[i],ans[++Ans]=make_pair(i-1,i);
}
}
inline void work2(){
for(int i=1;i<=n;i++) a[i]=read();
for(int cnt=0,k=19;~k;k--){
bool ok=false;
for(int i=1;i<=n-cnt;i++) ok|=(a[i]>>k)&1;
if(!ok) continue;
for(int i=1;i<n-cnt;i++) if((a[i]>>k)&1){
if((a[i+1]>>k)&1^1) a[i+1]^=a[i],ans[++Ans]=make_pair(i+1,i);
a[i]^=a[i+1],ans[++Ans]=make_pair(i,i+1);
}
++cnt;
}
}
}
signed main(){
star::n=read();
if(read()==1) star::work1();
else star::work2();
printf("%d\n",star::Ans);
for(int i=1;i<=star::Ans;i++) printf("%d %d\n",star::ans[i].first,star::ans[i].second);
return 0;
}

P7362 [eJOI 2020 Day2] XOR Sort的更多相关文章

  1. 「JOISC 2020 Day2」变态龙之色 题解

    题目传送门 注意 同性必定不同色 必有一个同色异性,且不相互不喜欢 Solution 我们发现,我们问题比较大的就是如何确定性别问题.我们可以一个一个加进去,在原来已经确定了的二分图上增加新的性别关系 ...

  2. 洛谷P7167 [eJOI 2020 Day1] Fountain (单调栈+ST)

    开两个数组:to[i][j]表示从i这个位置向下的第2j个圆盘是哪个,f[i][j]表示流满从i这个位置向下的 2j 个圆盘需要多少体积的水. 详情见代码: 1 #include<bits/st ...

  3. JavaScript:sort() 方法

    ylbtech-JavaScript:sort() 方法 JavaScript sort() 方法 1. 定义和用法返回顶部 sort() 方法用于对数组的元素进行排序. 语法 arrayObject ...

  4. hihoCoder挑战赛28 题目1 : 异或排序

    题目1 : 异或排序 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个长度为 n 的非负整数序列 a[1..n] 你需要求有多少个非负整数 S 满足以下两个条件: ...

  5. Js 数组对象排序

    1.定义函数 /** * 数组对象排序函数 * @param {any} name 排序字段 * @param {any} order 升.降(这里事true.false记得处理下) */ var b ...

  6. 2020 CCPC-Wannafly Winter Camp Day2

    2020 CCPC-Wannafly Winter Camp Day2 A 托米的字符串 虽然每个子串出现的概率是相同的,但是同一长度的子串个数是不同的,所以要分别处理.计算出某一长度的情况下,元音字 ...

  7. Wannafly Winter Camp 2020 Day 5J Xor on Figures - 线性基,bitset

    有一个\(2^k\cdot 2^k\) 的全零矩阵 \(M\),给出 \(2^k\cdot 2^k\) 的 \(01\) 矩阵 \(F\),现在可以将 \(F\) 的左上角置于 \(M\) 的任一位置 ...

  8. 清北学堂 2020 国庆J2考前综合强化 Day2

    目录 1. 题目 T1 一 题目描述 Sol T2 二 题目描述 Sol T3 三 题目描述 Sol T4 四 题目描述 Sol 2. 算法 -- 数据结构 1. 题目 T1 一 题目描述 问题描述 ...

  9. 训练计划Day2

    Day2:线段树(可持久化),平衡树(splay,treap),并查集,树链剖分,动态树,树状数组,点分治(可持久). 线段树模板 //区间最大,and,or #include <cstdio& ...

随机推荐

  1. 源码简析Spring-Integration执行过程

    一,前言 Spring-Integration基于Spring,在应用程序中启用了轻量级消息传递,并支持通过声明式适配器与外部系统集成.这一段官网的介绍,概况了整个Integration的用途.个人感 ...

  2. SpringBoot+SpringDataJpa快速上手(基本CRUD)

    以及表结构和数据 依赖 <!-- 如果有SpringBoot启动器,就不加--> <parent> <groupId>org.springframework.boo ...

  3. 【NX二次开发】NX对象类型及基本操作

    说明:NX中的所有对象都是通过唯一的tag_t值进行标识的,这些对象大致可以分为部件对象.UF对象.表达式.链表对象和属性对象等. 部件对象的操作: 基本操作函数: 1. UF_PART_new()  ...

  4. 既然有 HTTP 请求,为什么还要用 RPC 调用?

    首先,实名赞扬题主的问题.这个问题非常好. 其次,实名反对各个上来就讲RPC好而HTTP不好的答案.因为,题主的观点非常对. HTTP协议,以其中的Restful规范为代表,其优势很大.它可读性好,且 ...

  5. Docker减小镜像体积

    导航: 这里分为几个部分. 相关转载云原生:米开朗基杨 1.Docker减小镜像体积 2.Docker镜像针对不同语言的精简策略 对于刚接触容器的人来说,他们很容易被自己制作的 Docker 镜像体积 ...

  6. 关于asp.net中Repeater控件的一些应用

    在Asp.net中,我是比较喜欢用Repeater这个控件,刚刚遇到的一个问题,怎么实现单击 <asp:LinkButton>,通过后台的单击事件获取同一行数据中的其他数据(对象). 1, ...

  7. keycloak文章汇总

    keycloak文章汇总 Keycloak是一个致力于解决应用和服务身份验证与访问管理的开源工具.可以通过简单的配置达到保护应用和服务的目的. 用户管理 你的应用不需要开发登录模块,验证用户和保存用户 ...

  8. 使用Vue-Cli搭建Ant Design Vue前端开发环境

    如果文章有帮助到你,还请点个赞或留下评论 搭建脚手架 环境准备 nodeJS vue-cli 如果没有安装点击此处查看安装方法 进入 vue ui 1.打开终端,输入命令 vue ui 2.选择项目存 ...

  9. Docker学不会?不妨看看这篇文章

    大家好,我是辰哥! 上一篇文章(2300+字!在不同系统上安装Docker!)教大家如何在系统上安装docker,今天咱们来学习docker的基本使用. 辰哥将在本文里详细介绍docker的各种使用命 ...

  10. .NET Core授权失败如何自定义响应信息?

    前言 在.NET 5之前,当授权失败即403时无法很友好的自定义错误信息,以致于比如利用Vue获取到的是空响应,不能很好的处理实际业务,同时涉及到权限粒度控制到控制器.Action,也不能很好的获取对 ...