[loj3528]位移寄存器
当$s=0$时(求最小值):
若$x_{0},x_{1},...,x_{n-1}$和$y_{0},y_{1},...,y_{n-1}$像题中所给的方式存储在$r[0][0..nk-1]$和$r[1][0..nk-1]$,那么执行
not(2,1),add(2,0,2),xor(2,0,2),xor(2,1,2),right(2,2,k)
store(3,[1,0,0,...,0,1,0,0,...,0,......]),and(2,2,3)
left(3,2,1),or(2,2,3)
left(3,2,2),or(2,2,3)
……
left(3,2,2^{L-2}),or(2,2,3)
left(3,2,k-2^{L-1}),or(2,2,3)
not(3,2),and(2,0,2),and(3,1,3),or(0,2,3)
(其中第2行$store$中1的位置为所有$k$的倍数,第7行$L=\lceil\log_{2}k\rceil$)
即可将$\min(x_{i},y_{i})$像题中所给的方式存储在$r[0][0..nk-1]$
操作次数为$2L+11$,预处理第二步$store$,当$k=10$时为$18+1$(后者的1指全局)
由此进行分治,即每一次将前$\lceil\frac{n}{2}\rceil$个和后$\lceil\frac{n}{2}\rceil$个取$\min$使得$n'=\lceil\frac{n}{2}\rceil$,直至$n=1$即为答案
操作次数为$19\lceil\log_{2}n\rceil+1$,当$n=100$时为134,可以通过
当$s=1$时(排序):
类似前面取$\min$,我们可以构造"检查-交换"操作,只需要将最后一行修改为
not(3,2),and(4,0,2),and(5,1,3),and(6,0,3),and(7,1,2),or(0,4,5),or(1,6,7)
即可将$\min(x_{i},y_{i})$存储在$r[0][0...nk-1]$,将$\max(x_{i},y_{i})$存储在$r[1][0..nk-1]$
操作次数为$2L+14$,预处理第二步$store$,当$k=10$时为21+1
由于要先确定交换的位置(而不是根据数值交换),那么通常的排序算法中只有冒泡和选择可以支持,但两者的交换次数都为$o(n^{2})$,无法通过
注意到上述过程支持同时交换多个不同的数,此时有一个更为优秀的奇偶移项排序,伪代码如下:
i=1..(n+1)/2
j=1..n/2 swap(a[2j-1],a[2j])
j=1..(n-1)/2 swap(a[2j],a[2j+1])
(其中$a_{i}$下标从1到$n$,/2都指下取整,swap指"检查-交换"操作)
两次$j$的循环,实际上都可以用一次交换代替,那么交换次数即降为$o(n)$
具体实现,只需要将奇数位和偶数位分别取出,并且高位要补0避免0被交换到较小处
操作次数为$48\lceil\frac{n+1}{2}\rceil+5$,当$n=100$时为2405,可以通过


1 #include<bits/stdc++.h>
2 #include"registers.h"
3 using namespace std;
4 #define B 2000
5 int n,k,L;
6 void get_min(){
7 append_not(2,1);
8 append_add(2,0,2);
9 append_xor(2,0,2);
10 append_xor(2,1,2);
11 append_right(2,2,k);
12 append_and(2,2,99);
13 for(int i=0;i<L-1;i++){
14 append_left(3,2,(1<<i));
15 append_or(2,2,3);
16 }
17 if (L)append_left(3,2,k-(1<<L-1));
18 append_or(2,2,3);
19 append_not(3,2);
20 append_and(2,0,2);
21 append_and(3,1,3);
22 append_or(0,2,3);
23 }
24 void swap(int x,int y){
25 append_not(2,1);
26 append_add(2,0,2);
27 append_xor(2,0,2);
28 append_xor(2,1,2);
29 append_right(2,2,k);
30 append_and(2,2,99);
31 for(int i=0;i<L-1;i++){
32 append_left(3,2,(1<<i));
33 append_or(2,2,3);
34 }
35 if (L)append_left(3,2,k-(1<<L-1));
36 append_or(2,2,3);
37 append_not(3,2);
38 append_and(4,0,2);
39 append_and(5,1,3);
40 append_and(6,0,3);
41 append_and(7,1,2);
42 append_or(x,4,5);
43 append_or(y,6,7);
44 }
45 void calc0(){
46 for(;n>1;n=((n+1)>>1)){
47 append_right(1,0,(n>>1)*k);
48 get_min();
49 }
50 }
51 void calc1(){
52 vector<bool>v,v0,v1;
53 for(int i=0;i<B;i++)v.push_back((n*k<=i));
54 append_store(98,v);
55 append_or(0,0,98);
56 for(int i=0;i<B;i++)v0.push_back(((i/k)&1)^1);
57 for(int i=0;i<B;i++)v1.push_back(((i/k)&1));
58 append_store(96,v0);
59 append_store(97,v1);
60 for(int i=1;i<=((n+1)>>1);i++){
61 append_and(1,0,97);
62 append_right(1,1,k);
63 append_and(0,0,96);
64 swap(0,1);
65 append_left(1,1,(k<<1));
66 swap(1,0);
67 append_right(1,1,k);
68 append_or(0,0,1);
69 }
70 }
71 void construct_instructions(int p,int nn,int kk,int q){
72 n=nn,k=kk,L=0;
73 while ((1<<L)<k)L++;
74 vector<bool>v;
75 for(int i=0;i<B;i++)v.push_back(i%k==0);
76 append_store(99,v);
77 if (!p)calc0();
78 else calc1();
79 }
[loj3528]位移寄存器的更多相关文章
- 【C51】单片机芯片之——图解74HC595
第一部部分用于快速查阅使用,详细的使用见文章第二部分 引脚图
- DES加解密算法Qt实现
算法解密qt加密table64bit [声明] (1) 本文源码 大部分源码来自:DES算法代码.在此基础上,利用Qt编程进行了改写,实现了DES加解密算法,并添加了文件加解密功能.在此对署名为b ...
- DES加密模式详解
DES加密模式详解 http://www.cnblogs.com/Lawson/archive/2012/05/20/2510781.html http://www.blogjava.net/wayn ...
- 1.3 CPU简介
目录 CPU的功能模块 cpu总线 CPU寄存器 16位cpu的寄存器组 32位cpu的寄存器组 64位cpu的寄存器组 CPU的功能模块 CPU从逻辑上可以划分成3个模块,分别是控制单元.运算单元和 ...
- N76E003之SPI
串行外围总线 (SPI)N76E003系列提供支持高速串行通信的SPI模块.SPI 为微控制与外设 EEPROM, LCD 驱动, D/A 转换之间提供全双工.高速.同步传输的总线.可提供主机从机模式 ...
- stm32 SPI介绍和配置
SPI是一种高速的,全双工同步的通信总线,在芯片管脚上占用了四根线,节约了芯片的管脚,同时为PCB的布局节省了空间,提供了方便,因此越来越多的芯片集成了这种通信协议,STM32也就有了SPI接口. 有 ...
- 如何用 JavaScript 控制 Arduino?
Arduino 运行 C 语言,而主控端运行 JavaScript,一次要编写和维护两种程序.既然浏览器和服务器都用 JavaScript,若 Arduino 也能用 JavaScript 控制,那岂 ...
- Java 加解密技术系列之 DES
序 前几篇文章讲的都是单向加密算法.当中涉及到了 BASE64.MD5.SHA.HMAC 等几个比較常见的加解密算法. 这篇文章,以及后面几篇.打算介绍几个对称加密算法.比方:DES.3DES(Tri ...
- TLC5615
#include <reg51.h> #include "TLC5615.c" code uchar seven_seg[] = {0xc0, 0xf9, 0xa4, ...
随机推荐
- SpringBoot-MVC自动配置原理
SpringBoot对SpringMVC做了哪些配置,如何扩展,如何定制? 文档地址 :https://docs.spring.io/spring-boot/docs/2.2.5.RELEASE/re ...
- [JUC-5]ConcurrentHashMap源码分析JDK8
在学习之前,最好先了解下如下知识: 1.ReentrantLock的实现和原理. 2.Synchronized的实现和原理. 3.硬件对并发支持的CAS操作及JVM中Unsafe对CAS的实现. 4. ...
- Less-(26~28) preg_replace3
Less-26: 核心语句: 各种回显均存在. 本题相比Less-25,多屏蔽了很多符号: 首先是各种注释符 --+,#,/**/ . /[]/表示字符集合:任何出现在里面的字符均会被替换. 屏蔽 ...
- Codeforces1573B
### 问题描述 - 给你两个数组,a数组里面是1 - 2n中的奇数任意顺序排列组成,b数组里面是1 - 2n中的奇数任意顺序排列组成. - 问你最少需要多少次操作能让a的字典序小于b. ### 思路 ...
- 第五次Alpha Scrum Meeting
本次会议为Alpha阶段第五次Scrum Meeting会议 会议概要 会议时间:2021年4月30日 会议地点:线上会议 会议时长:15min 会议内容简介:本次会议以主要围绕卡牌对接的诸多问题与对 ...
- [软工顶级理解组] 团队任务拆解(Alpha)
一.任务概述 在alpha阶段,我们需要完成功能规格说明书中所提到的所有功能,在一个阶段的开发周期内,交付最小可行的可用版本. 二.任务分配及时长 分组&成员 具体任务 预计时长(小时) 前端 ...
- Ubuntu鼠标变十字 不能点击
出现这种情况,应该是bash 直接运行了python文件 系统中出现了一个import 进程. python文件中除了注释应该是import在最前边 ps -ef|grep import 可以查看系统 ...
- Luogu P2149 [SDOI2009]Elaxia的路线 | 图论
题目链接 题解: 题面中给了最简洁清晰的题目描述:"求无向图中,两对点间最短路的最长公共路径". 对于这个问题我们可以先考虑图中的哪些边对这两对点的最短路产生了贡献. 比如说下面这 ...
- 用STM32定时器中断产生PWM控制步进电机
控制步进电机可以使用PWM.定时器中断.延时,这里用的就是定时器中断来让它转动. 一.硬件部分1.使用的硬件板子用的是正点原子的STM32F103 mini板,驱动器是DM420(DM420驱动器资料 ...
- zabbix 报警发送qq邮件
1.开启QQ邮箱的IMAP/SMTP服务,获取授权码 获取授权码:点击[开启]按钮,编辑短信发送,即可获得授权码 2.配置 /etc/mail.rc 添加下列配置: [ set from=XXX@qq ...