当前位置: 首页 > news >正文

一道好题——分治

一道好题应该有一个简洁的题面。
有一个长度为 n,初始全为 0 的序列 a,另有一个长度为 n 的序列 b,你希望将 a 变成 b,你可以执行如下两种操作:

1 x:将 a 中所有值为 x 的数 +1+1。
2 x:将 a 中下标为 x 的数 +1+1。

你不需要最小化操作次数,但只能使用最多 2000020000 次操作。

Input
第一行 一个正整数 n(1≤n≤1000)。
第二行  n 个非负整数 b1 ,⋯,bn (0≤ bi ≤n)描述序列 b。

Output
第一行一个整数 k 表示操作次数,你需要保证 0≤k≤20000。
之后 k 行每行两个整数 ,1 x 或 2 x,表示一次操作。对于 1 x 类型的操作,你需要保证 0≤x≤n,对于 2 x 类型的操作,你需要保证 1≤x≤n。

Input
4
2 4 3 1

Output
7
1 0
2 1
2 2
2 3
2 2
1 3
2 3
 

解析:

考虑分治,将所有相等的数压在一起先,然后每次让后半截先 +1 然后就可以提出后半截变成子问题了。做完后半截再做前半截。
这样大概是 nlogn 次。
要先进行 后半截的操作,避免 1类型操作。

这样造成的效果就是

1 1 1 1        1 1 1 1
1 1 2 1        1 1 2 1
1 1 2 2        1 2 2 1
1 1 3 3        1 3 3 1
1 1 3 4        1 4 3 1
1 2 3 4        2 4 3 1 
(排序后)      (原序列)

#include <bits/stdc++.h>
using namespace std;
#define int long long 
#define ios ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
typedef pair<int,int> PII;
const int N=2e6+10;
vector <PII> a;
vector <PII> ans;
int n;
void dfs(int l,int r,int now)
{if (l>r) return ;if (l==r){while (now<a[l].first){ans.push_back({2,a[l].second});now++;}return ;}else{while (now<a[l].first){ans.push_back({1,now});now++;}int mid=l+r>>1;mid++;while (mid<=r&&a[mid].first<=now) mid++;if (mid<=r){for (int i=mid;i<=r;i++) ans.push_back({2,a[i].second});dfs(mid,r,now+1);dfs(l,mid-1,now);}}
}
signed main()
{ios;cin>>n;for (int i=1;i<=n;i++){int x;cin>>x;a.push_back({x,i});}sort(a.begin(),a.end());dfs(0,a.size()-1,0);cout<<ans.size()<<endl;for (auto x:ans) cout<<x.first<<" "<<x.second<<endl;return 0;
}

http://www.lryc.cn/news/236808.html

相关文章:

  • 庖丁解牛:NIO核心概念与机制详解 02 _ 缓冲区的细节实现
  • Python itertools模块中的combinations() 函数用法
  • 在线预览excel,luckysheet在vue项目中的使用
  • 【python】OpenCV—Image Pyramid(8)
  • vue3父组件提交校验多个子组件
  • 系统移植-uboot
  • 使用FFmpeg合并多个ts视频文件转为mp4格式
  • 大模型之十二十-中英双语开源大语言模型选型
  • .Net6 部署到IIS示例
  • 轻松搭建短域名短链接服务系统,可选权限认证,并自动生成证书认证把nginx的http访问转换为https加密访问,完整步骤和代码
  • JS 日期格式化
  • 右键菜单和弹出菜单的区别
  • 查询数据库DQL
  • SpringBoot中文乱码问题解决方案
  • 京东联盟flutter插件使用方法
  • python电影数据可视化分析系统的设计与实现【附源码】
  • SQLMAP --TAMPER的编写
  • 美国服务器:全面剖析其主要优点与潜在缺点
  • 验证二叉搜索树
  • Ubuntu 18.04无网络连接的n种可能办法
  • MIUI查看当前手机电池容量
  • 链动2+1模式:创新营销引领白酒产业新潮流
  • openGauss学习笔记-126 openGauss 数据库管理-设置账本数据库-归档账本数据库
  • UE 视差材质 学习笔记
  • openfeign整合sentinel出现异常
  • Java的继承
  • 十二、Docker的简介
  • 卷积神经网络(CNN)多种图片分类的实现
  • 【备忘录】Docker容器、镜像删除与资源清理命令
  • 使用 Splashtop 的开放 API 简化 IT 工作流程