寒假思维训练day12 E. Increasing Subsequences

适合喜欢算法、对算法感兴趣的朋友。

今天又来更新啦,断更一天,有点摆了,今天继续补上,献上一道1800的构造。


摘要:

part1:关于一些构造题的总结

part2:  每日一题: Problem - E - Codeforces (链接在此处,有需自取)

part3:  数学证明、题解 (尽量保证严谨、详细)

part4代码(cpp版本,后续可能会更新python版本)


Part1 先给大家分享一下我总结归纳的一些构造题模型,一点自己的浅薄之见:

1、前后缀贪心,比如说观察前后缀的sum,去看以后怎么考虑最好。Problem - 1903C - Codeforces

2、双指针贪心法,考虑两端相消或者相互作用,还有就是考虑左右边界。   Problem - 1891C - Codeforces

Problem - 1907D - Codeforces

3、转换观察法,有些关系可以抽象成图,观察图的某些性质去总结规律。也可以抽象成一个集合,两个集合相等可以说明有解可构造。Problem - 1891C - Codeforces

4、打表找规律,一般没什么规律可循即可打表找规律,一般和数论有关的很喜欢考,acm也喜欢考,属于人类智慧题。Problem - 1916D - Codeforces

5、公式推导演算,常见的分为公式的等价变形、公式的化简(这个常考,一般需要先证明某些性质,可以直接抵消,一般如果原公式处理起来很复杂时就可以考虑)。Problem - 1889B - Codeforces

6、考虑奇偶数去简化问题或者分类问题,从其中的一些运算性质入手,因为奇数偶数的加减以及%运算(这个结论很重要)的结果的奇偶性是固定的,Problem - 1898C - Codeforces

7、根据性质构造模型,看看能不能分成几个块,几个不同的集合,再选择算法去解决。Problem - 1873G - Codeforces

8、考虑从小到大处理,或者是从大到小处理,有时候先处理小的对大的不会有影响,或者反过来,这样的处理顺序是最完美的。Problem - 1904D2 - Codeforces

9、边界贪心法,一般要在问题的最边界处考虑,有时候这样做结果是最优的,或者考虑边界上的影响,假如让影响最小,就使得影响<= 固定值 。 ​​​​​​Problem - E - Codeforces and Problem - 1903C - Codeforces


Part2    寒假思维训练之每日一道构造题(思维 + 构造 + 数学)题目链接: Problem - E - Codeforces

题意:
给定一个整数n,数字n的范围是[2, 1e18],闭区间,要求构造一个递增子序列(可以不连续)的数量为n的序列,空序列也算是递增子序列,构造一个长度<= 200的序列满足这个性质,序列元素abs(a[i]) <= 1e9


Part3  题解(数学证明):

题解(数学证明):

求解偶数的情况,当n % 2, 先求n - 1,这样子保证了二进制不包含{2^{^{0}}}位: 

1、已知n,有:n = \sum_{} {2^{^{i}}},设 i \epsilon \begin{Bmatrix} i1, i2, i3, i4,i5,...,ik& \end{Bmatrix},i是n的每一个二进制位。
2、设 j = max(\begin{Bmatrix} i1, i2, i3, i4,i5,...,ik& \end{Bmatrix}),记录Ans为上升序列的数量

3、我们观察一下构造一个递增块(后面简称为块)有什么性质,当我们只构造一个块时,定它的长度为x的时候,它恰好有2^{^{x}}个递增序列,那我们必然可以这样构造:先构造一个块有j = max(\begin{Bmatrix} i1, i2, i3, i4,i5,...,ik& \end{Bmatrix})个元素,此时Ans = {2^{^{j}}}这个地方要注意了,此时的Ans是包含了将序列删除成空序列的方案,所以后面统一不需要考虑删除成空。设该块元素序列为:{a[1], a[2], a[3], ... ,a[j]}, a[1] > -1e9, a[i] < a[i + 1], i \varepsilon [1,j],往后加块时,从二进制位大的位置往小的位置枚举,当枚举到二进制位u时,必然满足u < j,此时取第一个块的第u + 1个元素a[u + 1],此时Ans = {2^{^{j}}} + {2^{^{u}}},接下来是说明一下为什么:

符号说明:a[i....j] (i <= j) <=> a[i], a[i + 1], ..., a[j]nextu: u的下一个二进制位

\because a[1...u] < a[u + 1] < a[j] \\,此时统计带有a[u +1]的递增子序列,那么必然是删除a[u + 1 ... j]部分,剩下的a[1... u]部分可删可不删,并且a[u + 1]不能删除,所以就是{2^{^{u}}}

\because a[u + 1] > a[nextu + 1] \\ ,所以显然后面的直接累加上来最终得到了n。
4、最初的n如果是奇数,就在后面加上一个-1e9,因为不用考虑删除成空,它必然小于前面的所有数字,所以贡献值就是1。

5、证毕。


Part4:   代码部分(cpp版本):

#include <bits/stdc++.h> 
#define int long long
#define ff first 
#define ss second 
using namespace std;
using PII = pair<int, int>; 
constexpr int N = 1e5 + 10; 
constexpr int inf = 0x3f3f3f3f;
int n, m; 
void solve() {cin >> n;m = n;if(n % 2) -- m; vector<int> ans;int idx = -1; for(int i = 62; i >= 1; i -- ) if(m >> i & 1) {int u = 1e9 - 200; for(int j = 0; j < i; j ++ ) ans.push_back(u ++);idx = i; break; }  vector<int> us; for(int i = idx - 1; i >= 1 && i != -1; i -- ) if(m >> i & 1) us.push_back(ans[i]);         if(n % 2) us.push_back(-1e9); if(ans.size() + us.size() <= 200) {cout << ans.size() + us.size() << endl;for(auto t : ans) cout << t << ' ';for(auto t : us) cout << t << ' '; cout << endl;}else cout << -1 << endl; 
}
signed main() {int ts; cin >> ts; while(ts --) solve(); return 0;
}

 

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

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

相关文章

JAVA------基础篇

java基础 1.JDK JDK :java development kit JRE&#xff1a;java runtime environment JDK包含JRE java跨平台&#xff1a;因为java程序运行依赖虚拟机&#xff0c;虚拟机需要有对应操作系统的版本&#xff0c;而jre中有虚拟机。 当你想要在Linux系统下运行&#xff0c;则需要…

HCIA-HarmonyOS设备开发认证-HarmonyOS简介

目录 前言目标一、HarmonyOS简介1.1、初识HarmonyOS1.2、HarmonyOS典型应用场景 二、HarmonyOS架构与安全2.1、HarmonyOS架构 前言 本章主要介绍HarmonyOS分布式操作系统的概念、关键技术与能力以及HarmonyOS典型的应用场景。 目标 学习完成本课程后&#xff0c;您将能够&…

kubeadm 安装k8s集群后,master节点notready问题解决方案

使用kubeadm 安装k8s集群后&#xff0c;加载calico cni 网络组件后&#xff0c;master节点notready问题 表现为&#xff1a; 使用命令查看日志&#xff1a;journalctl -f -u kubelet 报错如下&#xff1a; Failed to start ContainerManager failed to initialize top level…

【Linux】Shell 命令以及运行原理

Shell 命令以及运行原理 当用户登录 Linux 系统的时候&#xff0c;系统会给用户创建一个新的进程&#xff0c;一般叫做 bash&#xff08;命令行解释器&#xff09;。 Linux 严格意义上说的是一个操作系统&#xff0c;我们称之为 “核心&#xff08; kernel &#xff09;” &…

uniapp踩坑之项目:canvas第一次保存是空白图片

在ctx.draw()回调生成图片&#xff0c;参考canvasToTempFilePath接口文档 // data imgFilePath: null,// 缓存二维码图片canvas路径//js // 首先在draw&#xff08;&#xff09;里进行本地存储 ...... ctx.draw(false, () >{uni.canvasToTempFilePath({ // 把画布转化成临时…

138.随机链表的复制(附带源码)

目录 一、思路分析 二、如何操作 三、源码 深拷贝&#xff1a;原封不动的拷贝一份 一、思路分析&#xff1a; 这一题&#xff0c;偏向于技巧性。如果是按照工科思维硬推&#xff0c;那会非常头大&#xff0c;脑袋瓜疼。 这一题目的核心难点在于&#xff1a;处理random指针…

学习STM32,该用哪款开发工具?

有很多初学者在问&#xff1a;学习STM32&#xff0c;该用哪款开发工具&#xff1f; 我首先说一下我的观点&#xff1a; 1.没有最好&#xff0c;只有适不适合&#xff0c;适合自己的才是最好的。 2.开发工具很多&#xff0c;各有各的特点&#xff0c;有优点肯定也有缺点。 本文…

Java网络编程-16

网络层级 import java.net.InetAddress; import java.net.UnknownHostException;//测试IP public class Demo {public static void main(String[] args) throws UnknownHostException {//查询本机地址InetAddress inetAddress InetAddress.getByName("127.0.0.1");…

快速排序(三)——hoare法

目录 ​一.前言 二.快速排序 hoare排法​ 三.结语 一.前言 本文给大家带来的是快速排序&#xff0c;快速排序是一种很强大的排序方法&#xff0c;相信大家在学习完后一定会有所收获。 码字不易&#xff0c;希望大家多多支持我呀&#xff01;&#xff08;三连&#xff0b;关…

Leetcode刷题笔记题解(C++):LCR 174. 寻找二叉搜索树中的目标节点

思路&#xff1a;二叉搜索树的中序遍历是有序的从大到小的&#xff0c;故得出中序遍历的结果&#xff0c;即要第cnt大的数为倒数第cnt的数 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeN…

Maven 打包时,依赖配置正确,但是类引入出现错误,一般是快照(Snapshot)依赖拉取策略问题

问题描述&#xff1a; 项目打包时&#xff0c;类缺少依赖&#xff0c;操作 pom.xml -> Maven -> Reload project &#xff0c;还是不生效&#xff0c;但是同事&#xff08;别人&#xff09;那里正常。 问题出现的环境&#xff1a; 可能项目是多模块项目&#xff0c;结构…

Mybatis 动态SQL(set)

我们先用XML的方式实现 : 把 id 为 13 的那一行的 username 改为 ip 创建一个接口 UserInfo2Mapper ,然后在接口中声明该方法 package com.example.mybatisdemo.mapper; import com.example.mybatisdemo.model.UserInfo; import org.apache.ibatis.annotations.*; import jav…