记录我心路历程吧,这道小水题暴露出我很多问题。


给定 \(n\) 个字符串长度 \(a_i\) ,求字符集最小多大,才能构造出按字典序比较 \(s_1 < s_2 < \dots < s_n\)。

当 \(a_i < a_{i+1}\) 时,显然全补 \(0\) 就行。否则,是一个高精度 \(+1\)。二分字符集大小,判断行不行。


以下是我做题过程。

首先,除了二分部分,全部推出来了。但是加法的细节写烂了,各种没判。

然后没有特判字符集为 \(1\) 的情况,硬是跑了 1e9 差点T。(最后改改还是T了)

然后考虑贪心的过程,写了一个错的。在字符不够的时候新开一个,实际上会导致前面的浪费。

blog 写到最后发现还是一道sb题,就当水了一个 blog 吧。

#include <bits/stdc++.h>
const int MAXN = 500010; int n, st[MAXN], col[MAXN], top;
void add() {
if (st[top] > 1 && st[top - 1] != st[top] - 1) {
st[top + 1] = st[top];
col[top + 1] = col[top];
--st[top]; ++top;
}
++col[top];
}
int A[MAXN];
bool judge(int cnt) {
int lst = 0;
memset(st, 0, top + 1 << 2);
memset(col, 0, top + 1 << 2);
top = 0;
for (int i = 1, t; i <= n; ++i) {
t = A[i];
if (lst < t) {
if (!top || col[top] != 0) st[++top] = t, col[top] = 0;
else st[top] = t;
} else {
int k = -1;
while (st[top] > t) k = col[top], --top;
if (st[top] != t) st[++top] = t, col[top] = k;
if (cnt > 1) {
add();
while (top && col[top] >= cnt) {
int at = st[top]; --top;
if (st[top] + 1 != at)
st[++top] = at - 1;
add();
}
} else top = 0, col[0] = 1;
if (col[0]) return false;
if (st[top] != t) st[++top] = t, col[top] = 0;
}
lst = t;
}
return true;
}
int main() {
std::ios_base::sync_with_stdio(false), std::cin.tie(0);
std::cin >> n;
for (int i = 1; i <= n; ++i) std::cin >> A[i];
int l = 1, r = n, ans = 0;
while (l <= r) {
int mid = l + r >> 1;
if (judge(mid)) ans = mid, r = mid - 1;
else l = mid + 1;
}
std::cout << ans << std::endl;
return 0;
}

AGC029C - Lexicographic constraints的更多相关文章

  1. [Atcoder AGC029C]Lexicographic constraints

    题目大意:给定$n$个字符串的长度$a_i$,问至少用几种字符可以构造出字符串$s_1\sim s_n$,满足$|s_i|=a_i$且$s_1<s_2<\cdots<s_n$. $ ...

  2. 「AGC029C」Lexicographic constraints

    「AGC029C」Lexicographic constraints 传送门 好像这个题非常 easy. 首先这个答案显然具有可二分性,所以问题转化为如何判定给定的 \(k\) 是否可行. 如果 \( ...

  3. [Agc029C]Lexicographic constraints_进制_二分答案_贪心

    Lexicographic constraints 题目链接:https://atcoder.jp/contests/agc029/tasks/agc029_c 数据范围:略. 题解: 二分是显然的, ...

  4. AT4502-[AGC029C]Lexicographic constraints【二分,栈】

    正题 题目链接:https://www.luogu.com.cn/problem/AT4502 题目大意 给出\(n\)个长度\(S\),求一个最小\(m\)表示用大小为\(m\)的字符集构造出\(n ...

  5. 【AtCoder】AGC029(A-E)

    A - Irreversible operation 题解 把每个B后面的W个数累加起来即可 代码 #include <bits/stdc++.h> #define fi first #d ...

  6. Go build constraints

    Go语言有一个不(奇)错(葩)的设计,就是build constraints(构建约束).可以在源码中通过注释的方式指定编译选项,比如只允许在linux下,或者在386的平台上编译啊之类的:还可以通过 ...

  7. Unable to simultaneously satisfy constraints.

    在进行版本的迭代更新时,新功能需求需要对主页面的UI进行重新的布局,但是,报了错误,出了好多约束方面的问题: Unable to simultaneously satisfy constraints. ...

  8. Drop all the tables, stored procedures, triggers, constraints and all the dependencies in one SQL statement

    Is there any way in which I can clean a database in SQl Server 2005 by dropping all the tables and d ...

  9. 自动布局报错(两条连线冲突):Unable to simultaneously satisfy constraints

    这个报错有些长: Unable to simultaneously satisfy constraints.    Probably at least one of the constraints i ...

随机推荐

  1. 20190805-Python基础 第二章 列表和元组(2)列表

    1. list函数,用于将字符串转换为列表 2. 基本的列表操作 修改列表 - 给元素赋值,使用索引表示法给特定的元素赋值,如x[1] = 2 删除元素 - 使用del语句即可 name1 = ['a ...

  2. Pygame小游戏练习三

    @Python编程从入门到实践 Python项目练习 七.创建Passenger类 创建passenger.py文件,创建Passenger类,控制乘客属性和行为 # passenger.py imp ...

  3. 【搜索】Partition problem

    题目链接:传送门 题面: [题意] 给定2×n个人的相互竞争值,请把他们分到两个队伍里,如果是队友,那么竞争值为0,否则就为v[i][j]. [题解] 爆搜,C(28,14)*28,其实可以稍加优化, ...

  4. Asp.net core 学习笔记 Node Service

    我们知道 npm 是很大的库,很多轮子可以用 所以 .net core 替我们封装了一个调用 nodejs 的 service 就叫 node service 我们只要在 server 安装 node ...

  5. JArray

    [{ "A001033": "", ", ", ", ", ", ", ", " ...

  6. 安卓开发之HttpURLConnection类和Handler类的使用

    package com.lidaochen.test; import java.io.ByteArrayOutputStream; import java.io.InputStream; public ...

  7. Lab3 Report

  8. 【Day3】2.re模块使用案例

    课程目标 1.提取 2.匹配 3.替换 1.提取 import re ret = re.findall([正则表达式]) # 返回的类型是列表 2.匹配 import re ret = re.matc ...

  9. 工具---《.264视频 转成 MP4视频》

    <.264视频 转成 MP4视频> 安装了“爱奇艺万能播放器”可以打开.264视频,但是opencv却不能直接读取.264视频,还是需要想办法“.264视频 转成 MP4/avi视频”. ...

  10. JAVA8初探-让方法参数具备行为能力并引入Lambda表达式

    关于JAVA8学习的意义先来贴一下某网站上的对它的简单介绍:“Java 8可谓Java语言历史上变化最大的一个版本,其承诺要调整Java编程向着函数式风格迈进,这有助于编写出更为简洁.表达力更强,并且 ...