不完全考虑构造+dp与构造:1107T2

http://cplusoj.com/d/senior/p/SS231107B

发现reverse操作会对一堆数进行修改,但如果我们只关注其中一些数呢?

假设我们已经构造好 [ 1 , i − 1 ] [1,i-1] [1,i1],我们现在尝试构造 [ i , n ] [i,n] [i,n],我们可操作的范围是在 [ i − 1 , n ] [i-1,n] [i1,n]

假设 i i i p o s i pos_i posi,我们其实要在一个长为 n − i + 1 n-i+1 ni+1 的序列上把位置 p o s i − i + 2 pos_i-i+2 posii+2 移到位置2,这个东西很dp。于是我们就设 d p ( x , y ) dp(x,y) dp(x,y) 表示长为 x x x,从 y y y 移到2的最小步数。

注意这个dp不一定需要最优的策略,也就是说我们可以贪心决策。我们可以枚举最后一个格子是否被选,或者选多少。然后我们贪心希望 y y y 每次往前移。(往后移可能也可行,但我们找的是范围内的最优解,所以不需要)

然后这样子还是会略超,所以我们可以考虑继续完善贪心。我们可以维护从前往后指针 x x x 和从后往前指针 y y y,取最优的取移。

#include<bits/stdc++.h>
using namespace std;
#ifdef LOCAL#define debug(...) fprintf(stdout, ##__VA_ARGS__)
#else#define debug(...) void(0)
#endif
//#define int long long
inline int read(){int x=0,f=1;char ch=getchar(); while(ch<'0'||
ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){
x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}return x*f;}
#define Z(x) (x)*(x)
#define pb push_back
#define fi first
#define se second
//srand(time(0));
#define N 3010
//#define M
//#define mo
int rev[13][100010]; 
void revese(int n, int l) {for(int i=0; i<n; ++i) rev[l][i]=((rev[l][i>>1]>>1)|((i&1)<<l-1)); 
}
void Min(int &a, int b)  {a=min(a, b); 
}
struct Fe {int x, lstx, lsty, opx, opy; Fe operator = (const int a)  {x=a;  return (*this); }
}f[N][N], g[N][N];
Fe Min(Fe a, Fe b) {return a.x<b.x ? a : b; 
}
int n, m, i, j, k, T;
int a[N], pos[N]; 
vector<pair<int, int> >G; void init() {int x, y, l, t; for(x=0; x<N; ++x) for(y=0; y<N; ++y) f[x][y].x=g[x][y].x=1e9; for(x=3; x<=n; ++x) {for(y=2; y<x; ++y) {f[x][y]=f[x-1][y]; if(y==2) f[x][y]=0; for(k=1; (1<<k)<=x; ++k) {l=x-(1<<k)+1; if(l>=y) continue; t=y-l; 
//				debug("[%d][%d] %d %d\n", x, y, k, t); if(rev[k][t]<t && f[x][l+rev[k][t]].x+1<f[x][y].x) {f[x][y].x=f[x][l+rev[k][t]].x+1; f[x][y].lstx=x; f[x][y].lsty=l+rev[k][t]; f[x][y].opx=l; f[x][y].opy=k; }}
//			debug("f[%d][%d]=%d\n", x, y, f[x][y].x); }}for(x=3; x<=n; ++x) {for(y=x-1; y>=2; --y) {g[x][y]=g[x-1][y-1]; if(y==x-1) g[x][y]=0; for(k=1; (1<<k)<=x; ++k) {if((1<<k)<y) continue; t=y-1; if(rev[k][t]>t && g[x][rev[k][t]+1].x+1<g[x][y].x) {debug(">>> %d || %d %d 【】 %d\n", k, rev[k][t], t, g[x][rev[k][t]+1].x); g[x][y].x=g[x][rev[k][t]+1].x+1; g[x][y].lstx=x; g[x][y].lsty=rev[k][t]+1; g[x][y].opx=x; g[x][y].opy=k; }}debug("g[%d %d] = %d\n", x, y, g[x][y].x); }}
}void work(int l, int k) {for(int i=0; i<(1<<k); ++i) if(i<rev[k][i]) swap(a[i+l], a[rev[k][i]+l]); 
}void remake_pos() {for(int i=1; i<=n; ++i) pos[a[i]]=i; 
}signed main()
{freopen("butterfly.in", "r", stdin);freopen("butterfly.out", "w", stdout);#ifdef LOCALfreopen("in.txt", "r", stdin);freopen("out.txt", "w", stdout);#endif
//	T=read();
//	while(T--) {
//
//	}n=read(); m=read(); for(i=0; i<=12; ++i) revese(1<<i, i); for(i=1; i<=n; ++i) a[i]=read(); remake_pos(); init(); int x, y; x=2; y=n-1; while(x<y) {if(pos[x]==x) { ++x; continue; }if(pos[y]==y) { --y; continue; }int len=y-x+1; int s1=f[len+2][pos[x]-x+2].x; int s2=g[len+2][pos[y]-x+2].x; debug("=== %d %d\n", s1, s2); if(s1<s2) {debug("oper 1\n"); auto t=f[len+2][pos[x]-x+2]; while(t.opx) {G.pb({t.opx+x-2, t.opy}); work(t.opx+x-2, t.opy); t=f[t.lstx][t.lsty]; }++x; }else {debug("oper 2\n"); auto t=g[len+2][pos[y]-x+2]; while(t.opx) {G.pb({y+2-t.opx, t.opy}); work(y+2-t.opx, t.opy); t=g[t.lstx][t.lsty]; }--y; }remake_pos(); for(int i=1; i<=n; ++i) debug("%d ", a[i]); debug("\n"); }for(int i=1; i<=n; ++i) debug("%d ", a[i]); debug("\n"); printf("%d\n", G.size()); for(auto t : G) printf("%d %d\n", t.fi, t.se); return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/134191.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JAVA中类和对象的认识

1、面向对象的初步认知 1.1 什么是面向对象 Java是一门纯面向对象的语言(Object Oriented Program&#xff0c;简称OOP)&#xff0c;在面向对象的世界里&#xff0c;一切皆为对象。面 向对象是解决问题的一种思想&#xff0c;主要依靠对象之间的交互完成一件事情。用面向对象的…

最新Cocos Creator 3.x 如何动态修改3D物体的透明度

Cocos Creator 3.x 的2D UI有个组件UIOpacity组件可以动态修改UI的透明度,非常方便。很多同学想3D物体上也有一个这样的组件来动态的控制与修改3D物体的透明度。今天基于Cocos Creator 3.8 来实现一个可以动态修改3D物体透明度的组件Opacity3D。 对啦&#xff01;这里有个游戏…

Web服务器的搭建

网站需求&#xff1a; 1.基于域名www.openlab.com可以访问网站内容为 welcome to openlab!!! 2.给该公司创建三个网站目录分别显示学生信息&#xff0c;教学资料和缴费网站&#xff0c;基于www.openlab.com/student 网站访问学生信息&#xff0c;www.openlab.com/data网站访问教…

适合汽车应用的MAX49017ATA/VY、MAX40025AAWT、MAX40025CAWT、MAX40026ATA/VY(线性)微功耗比较器

一、MAX49017ATA/VY 内置基准电压源的1.7V、双通道微功耗比较器 MAX49017是一款节省空间的双通道比较器&#xff0c;内置基准电压源&#xff0c;提供推挽输出。该器件通过了AEC-Q100认证&#xff0c;非常适合汽车应用&#xff0c;例如汽车电池监控系统、信息娱乐系统音响主机和…

AI 绘画 | Stable Diffusion 涂鸦功能与局部重绘

在 StableDiffusion图生图的面板里&#xff0c;除了图生图&#xff08;img2img&#xff09;选卡外&#xff0c;还有局部重绘(Inpaint)&#xff0c;涂鸦(Sketch)&#xff0c;涂鸦重绘(Inpaint Sketch),上传重绘蒙版&#xff08;Inpaint Uplaod&#xff09;、批量处理&#xff08…

网络安全与TikTok:年轻一代的数字素养

在数字时代&#xff0c;互联网成为我们生活的重要组成部分&#xff0c;而社交媒体平台则在年轻一代中变得日益流行。其中&#xff0c;TikTok作为一个短视频分享平台&#xff0c;吸引了全球数以亿计的用户&#xff0c;尤其年轻人。 然而&#xff0c;与其快速的普及相伴随的是网…

【UE4】UE编辑器乱码问题

环境&#xff1a;UE4.27、vs2019 如何解决 问题原因&#xff0c;UE的编码默认是UTF-8&#xff0c;VS的默认编码是GBK 通过"高级保存选项" 直接修改VS的 .h头文件 的 编码 为 UTF-8 步骤1. 步骤2. 修改编码后&#xff0c;从新编译&#xff0c;然后就可以解决编辑器…

[Machine Learning][Part 8]神经网络的学习训练过程

目录 训练过程 一、建立模型&#xff1a; 二、建立损失函数 J(w,b): 三、寻找最小损失函数的(w,b)组合 为什么需要激活函数 激活函数种类 二分法逻辑回归模型 线性回归模型 回归模型 训练过程 一、建立模型&#xff1a; 根据需求建立模型&#xff0c;从前面神经网络的…

【C语言】函数的系统化精讲(三)

文章目录 一、递归举例二、递归举例2.1求n的阶乘2.2 顺序打印⼀个整数的每⼀位 三、递归与迭代3.1递归的思考3.2求第n个斐波那契数 总结 一、递归举例 .通过上回&#xff08;【C语言】函数的系统化精讲&#xff08;二&#xff09;&#xff09;我们了解到递归的限制条件&#x…

79. 单词搜索

79. 单词搜索 不要用 int[][] dir {{0, 1}, {1, 0}, {0, -1}, {-1, 0}}; 的写法了&#xff0c;下面这种比较好记。 class Solution {boolean[][] vis;public boolean exist(char[][] board, String word) {int m board.length, n board[0].length;vis new boolean[m][n];…

Ansible概述以及模块

目录 一、Ansible概述&#xff1a; 1. Ansible是什么: 2. Ansible的作用: 3. Ansible的特性: 二、Ansible 环境安装部署&#xff1a; 1. 管理端安装 ansible&#xff1a; 2. ansible 目录结构&#xff1a; 3. 配置主机清单&#xff1a; 4. 配置密钥对验证&#xff1a; 三、an…

什么GAN生成对抗网络?生成对抗网络可以干什么?

生成对抗网络(Generative Adversarial Nets,简称GAN)。神经网络分很多种,有普通的前向传播网络,有分析图片的CNN卷积神经网络,有分析系列化数据比如语言、文字的RNN循环神经网络,这些神经网络都是用来输入数据,得到想要的结果,我们看中的是这些神经网络中很好地将数据与…

Qt 项目实战 | 音乐播放器

Qt 项目实战 | 音乐播放器 Qt 项目实战 | 音乐播放器播放器整体架构创建播放器主界面 官方博客&#xff1a;https://www.yafeilinux.com/ Qt开源社区&#xff1a;https://www.qter.org/ 参考书&#xff1a;《Qt 及 Qt Quick 开发实战精解》 Qt 项目实战 | 音乐播放器 开发环…

sqlite3.NotSupportedError: deterministic=True requires SQLite 3.8.3 or higher

问题描述 sqlite3.NotSupportedError: deterministicTrue requires SQLite 3.8.3 or higher 解决方法 A kind of solution is changing the database from sqlite3 to pysqlite3. After acticate the virtualenv, install pysqlite. pip3 install pysqlite3 pip3 install …

【Linux】vim

文章目录 一、vim是什么&#xff1f;二 、命令模式三、插入模式四、底行模式五、vim配置 一、vim是什么&#xff1f; Vim是一个强大的文本编辑器&#xff0c;它是Vi的增强版&#xff0c;支持多种语法高亮、插件扩展、多模式操作等功能。Vim有三种基本的工作模式&#xff1a;命…

self.register_buffer方法使用解析(pytorch)

self.register_buffer就是pytorch框架用来保存不更新参数的方法。 列子如下&#xff1a; self.register_buffer("position_emb", torch.randn((5, 3)))第一个参数position_emb传入一个字符串&#xff0c;表示这组参数的名字&#xff0c;第二个就是tensor形式的参数…

互联网Java工程师面试题·Spring篇·第七弹

目录 36、什么是基于 Java 的 Spring 注解配置? 给一些注解的例子. 37、什么是基于注解的容器配置? 38、怎样开启注解装配&#xff1f; 39、Required 注解 40、Autowired 注解 41、Qualifier 注解 42、在 Spring 框架中如何更有效地使用 JDBC? 43、JdbcTemplate 44…

Flink的API分层、架构与组件原理、并行度、任务执行计划

Flink的API分层 Apache Flink的API分为四个层次&#xff0c;每个层次都提供不同的抽象和功能&#xff0c;以满足不同场景下的数据处理需求。下面是这四个层次的具体介绍&#xff1a; CEP API&#xff1a;Flink API 最底层的抽象为有状态实时流处理。其抽象实现是Process Functi…

macOS电池续航工具:Endurance中文

Endurance for Mac是一款强大而实用的电池管理和优化软件&#xff0c;专为MacBook设计。通过智能调整系统设置和管理后台应用&#xff0c;它能有效延长电池续航时间&#xff0c;提升工作和娱乐效率&#xff0c;成为你在各种场合下的得力助手。 Endurance for Mac软件的功能特色…

spring中纯注解实现Advice

背景&#xff1a;课本上是注解和Xml文件混用的方式&#xff0c;研究了一下用配置类加注解和测试方法实现各种通知方式的切入。 1.首先dao的接口&#xff0c;增删改查 public interface UserDaoAspect {public void add();public void delete();public void update();public vo…