AT4502-[AGC029C]Lexicographic constraints【二分,栈】
正题
题目链接:https://www.luogu.com.cn/problem/AT4502
题目大意
给出\(n\)个长度\(S\),求一个最小\(m\)表示用大小为\(m\)的字符集构造出\(n\)个符合对应长度的字符串使得字符串按照给出顺序从小到大。
\(1\leq n\leq 2\times 10^5,1\leq S_i\leq 10^9\)
解题思路
先二分答案,然后每次构造最小的能构造的就行了。考虑怎么构造最小的。
如果这个字符串比上一个要长,那么显然在上一个后面补上最小的字符就是最优的。
否则我们把上一个字符串截断到目前长度,然后类似于进位的方法来让最后一个位置加上\(1\)。
因为字符串长度很长所以比较难办,开始写了个线段树发现过不了。
其实用栈维护每一个不是最小字符的位置就好了,这些位置不会很多的,进位就暴力递归进位。
时间复杂度\(O(n\log n)\)
code
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=2e5+10;
int n,a[N],s[N],k[N],top;
void ins(int x,int w){
while(s[top]>x)top--;
if(s[top]!=x)
s[++top]=x,k[top]=1;
else k[top]++;
if(top>1&&k[top]>=w)
top--,ins(x-1,w);
}
bool check(int w){
top=1;k[1]=s[1]=0;
for(int i=2;i<=n;i++)
if(a[i]<=a[i-1]){
if(w==1)return 0;
ins(a[i],w);
}
return !k[1];
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
int l=1,r=n;
while(l<=r){
int mid=(l+r)>>1;
if(check(mid))r=mid-1;
else l=mid+1;
}
printf("%d\n",l);
return 0;
}
AT4502-[AGC029C]Lexicographic constraints【二分,栈】的更多相关文章
- [Atcoder AGC029C]Lexicographic constraints
题目大意:给定$n$个字符串的长度$a_i$,问至少用几种字符可以构造出字符串$s_1\sim s_n$,满足$|s_i|=a_i$且$s_1<s_2<\cdots<s_n$. $ ...
- AGC029C - Lexicographic constraints
记录我心路历程吧,这道小水题暴露出我很多问题. 给定 \(n\) 个字符串长度 \(a_i\) ,求字符集最小多大,才能构造出按字典序比较 \(s_1 < s_2 < \dots < ...
- 「AGC029C」Lexicographic constraints
「AGC029C」Lexicographic constraints 传送门 好像这个题非常 easy. 首先这个答案显然具有可二分性,所以问题转化为如何判定给定的 \(k\) 是否可行. 如果 \( ...
- [Agc029C]Lexicographic constraints_进制_二分答案_贪心
Lexicographic constraints 题目链接:https://atcoder.jp/contests/agc029/tasks/agc029_c 数据范围:略. 题解: 二分是显然的, ...
- DP的各种优化(动态规划,决策单调性,斜率优化,带权二分,单调栈,单调队列)
前缀和优化 当DP过程中需要反复从一个求和式转移的话,可以先把它预处理一下.运算一般都要满足可减性. 比较naive就不展开了. 题目 [Todo]洛谷P2513 [HAOI2009]逆序对数列 [D ...
- 【AtCoder】AGC029(A-E)
A - Irreversible operation 题解 把每个B后面的W个数累加起来即可 代码 #include <bits/stdc++.h> #define fi first #d ...
- NOIP总结
拿到题目先写裸的暴力,暴力一定要写对,没想出正解有暴力垫底,想出了正解也可以拿来拍 过了样例之后一定要造数据测,数据越坑越好 一定要造极限数据,哪怕造不知道答案的数据都行,主要是检测RE和TLE,正确 ...
- [ CodeVS冲杯之路 ] P3955
不充钱,你怎么AC? 题目:http://codevs.cn/problem/3955/ 最长上升子序列的加强版,n 有1000000,n 方的 DP 肯定会 TLE,那么用二分栈维护 二分栈我讲不好 ...
- bzoj 2726: [SDOI2012]任务安排
Description 机 器上有N个需要处理的任务,它们构成了一个序列.这些任务被标号为1到N,因此序列的排列为1,2,3...N.这N个任务被分成若干批,每批包含相邻的 若干任务.从时刻0开始,这 ...
随机推荐
- 【spring 注解驱动开发】Spring AOP原理
尚学堂spring 注解驱动开发学习笔记之 - AOP原理 AOP原理: 1.AOP原理-AOP功能实现 2.AOP原理-@EnableAspectJAutoProxy 3.AOP原理-Annotat ...
- p命名空间和c命名空间
4 p命名空间和c命名空间在通过构造方法或set方法给bean注入关联项时通常是通过constructor-arg元素和property元素来定义的.在有了p命名空间和c命名空间时我们可以简单的把它们 ...
- webapp网络定位
1 <script> 2 var x=document.getElementById("demo"); 3 function getLocation() 4 { 5 i ...
- [ASP.NET MVC]@RenderSection,@RenderBody(),@RenderPage
1.@RenderBody() 作用和母版页中的服务器控件类似,当创建基于此布局页面的视图时,视图的内容会和布局页面合并,而新创建视图的内容会通过布局页面的@RenderBody()方法呈现在标签之 ...
- Spring第一课:依赖注入DI(二)
DI Dependency Injection ,依赖注入 is a :是一个,继承. has a:有一个,成员变量,依赖. class B { private A a; //B类依赖A类 } 依 ...
- (int)a、&a、(int)&a、(int&)a的区别,很偏僻的题
(int)a.&a.(int)&a.(int&)a的区别,很偏僻的题 #include <iostream> #include <stdio.h> #i ...
- Visual Studio 2022 预览版3 最新功能解说
我们很高兴地宣布Visual Studio 2022 的第三个预览版问世啦!预览版3 提供了更多关于个人和团队生产力.现代开发和持续创新等主题的新功能.在本文中,我们将重点介绍Visual Studi ...
- rabbitMq内存与磁盘分配问题
在服务器上也可以改变配置文件修改内存 也可以使用命令进行分配: 相对内存:rabbitmqctl set_vm_memory_hgih_waterwmark 0.4 使用时可以把这个0.4替 ...
- Seq2Seq sequence-to-sequence模型 简介
Sequence-to-sequence (seq2seq) 模型. 突破了传统的固定大小输入问题框架 开创了将DNN运用于翻译.聊天(问答)这类序列型任务的先河 并且在各主流语言之间的相互翻译,和语 ...
- 实例_ Java中的代理模式
静态代理 我们定义一个接口,并且使用代理模式,想要做到的就是在调用这个接口的实现类时在此方法上添加功能. public interface HelloInterface { void sayHello ...