[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, ...
随机推荐
- WPF实现聚光灯效果
WPF开发者QQ群: 340500857 | 微信群 -> 进入公众号主页 加入组织 前言 效果仿照 CSS聚光灯效果 实现思路: 1. 设置底部Canvas背景色 #222222 . 2. ...
- 如何通过 Serverless 轻松识别验证码?
作者 | 江昱 来源 | Serverless 公众号 前言 Serverless 概念自被提出就倍受关注,尤其是近些年来 Serverless 焕发出了前所未有的活力,各领域的工程师都在试图将 Se ...
- Space Time Pattern Mining Tools(时空模式挖掘工具)
时空模式挖掘工具 # Process: 局部异常值分析 arcpy.LocalOutlierAnalysis_stpm("", "", 输出要素, " ...
- SpringBoot-thymeleaf-静态资源引入和接管
引入前端 templates下放html页面 static下放css.js.image等静态资源 添加thymeleaf命名空间 <html lang="en" xmlns: ...
- JSR303数据校验
Springboot中可以用@validated来校验数据,如果数据异常则会统一抛出异常,方便异常中心统一处理. 导入依赖: <dependency> <groupId>org ...
- Java 读取PDF中的表格
一.概述 本文以Java示例展示读取PDF中的表格的方法.这里导入Spire.PDF for Javah中的jar包,并使用其提供的相关及方法来实现获取表格中的文本内容.下表中整理了本次代码使用到的主 ...
- Go 里的超时控制
前言 日常开发中我们大概率会遇到超时控制的场景,比如一个批量耗时任务.网络请求等:一个良好的超时控制可以有效的避免一些问题(比如 goroutine 泄露.资源不释放等). Timer 在 go 中实 ...
- 2021.8.19考试总结[NOIP模拟44]
T1 emotional flutter 把脚长合到黑条中. 每个黑条可以映射到统一区间,实际操作就是左右端点取模.长度大于$k$时显然不合法. 然后检查一遍区间内有没有不被黑条覆盖的点即可. 区间端 ...
- Linux入门需要搞清楚的思路问题
很多同学接触linux不多,对linux平台的开发更是一无所知. 而现在的趋势越来越表明,作为一个优秀的软件开发人员,或计算机it行业从业人员,="" 掌握linux是一种很重要的 ...
- The entitlements specified in your application’s Code Signing Entitlements file do not match those s
今天给打包 TPshop IOS (搜豹商城) ipa文件 调试运行 xcode运行提示这个错误: The entitlements specified in your application's C ...