[Agc029C]Lexicographic constraints_进制_二分答案_贪心
时间:2019-10-24
本文章向大家介绍[Agc029C]Lexicographic constraints_进制_二分答案_贪心,主要包括[Agc029C]Lexicographic constraints_进制_二分答案_贪心使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
Lexicographic constraints
题目链接:https://atcoder.jp/contests/agc029/tasks/agc029_c
数据范围:略。
题解:
二分是显然的,因为题目具有单调性。
但是怎么验证呢?
显然是贪心地验证,就是要$S_i$是满足条件最小的。
我的办法是维护一棵线段树,因为如果$A_i > A_{i - 1}$的话,只需要在后面加上极小字符。
然后只需要开一棵动态开点的权值线段树,维护这段区间是不是全是极大字符。如果是的话就不可以再变大了。
否则的话就可以,修改的话区间修改单点修改。
但其实不用这么麻烦,我们完全可以用一个$ map $胜任。
即,我们维护出来相当于一个$ mid $进制的东西。$ map $里存的是每一段的结尾,是什么。前面有一段空挡。
$ map $是有序的,随便搞一搞就好。
代码:
#include <bits/stdc++.h> #define N 200010 using namespace std; typedef long long ll; char *p1, *p2, buf[100000]; #define nc() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 100000, stdin), p1 == p2) ? EOF : *p1 ++ ) int rd() { int x = 0, f = 1; char c = nc(); while (c < 48) { if (c == '-') f = -1; c = nc(); } while (c > 47) { x = (((x << 2) + x) << 1) + (c ^ 48), c = nc(); } return x * f; } int a[N], n; map <ll, ll> MP; bool check(int x) { MP.clear(); for (int i = 2; i <= n; i ++ ) { if (a[i - 1] >= a[i]) { if (x == 1) { return false; } while (!MP.empty()) { ll mx = MP.rbegin() -> first; if (mx > a[i]) { MP.erase(mx); } else { break; } } int j = a[i]; while (j > 0 && MP[j] + 1 == x) { MP.erase(j); j -- ; } if (!j) { return false; } MP[j] ++ ; } } return true; } int main() { n = rd(); for (int i = 1; i <= n; i ++ ) { a[i] = rd(); } int l = 1, r = n, ans = n; while (l <= r) { int mid = (l + r) >> 1; if (check(mid)) { ans = mid; r = mid - 1; } else { l = mid + 1; } } cout << ans << endl ; return 0; }
原文地址:https://www.cnblogs.com/ShuraK/p/11734650.html
- hdu------1281 棋盘游戏(最小覆盖点)
- hdu-----(1179)Ollivanders: Makers of Fine Wands since 382 BC.(二分匹配)
- hdu-----(1151)Air Raid(最小覆盖路径)
- hdu-----(1150)Machine Schedule(最小覆盖点)
- 【重磅】微软Facebook联手发布AI生态系统,CNTK+Caffe2+PyTorch挑战TensorFlow
- hduoj-----(1068)Girls and Boys(二分匹配)
- 使用Django suit或Bootstrap美化admin模板
- hdu---------(1026)Ignatius and the Princess I(bfs+dfs)
- hdu-----(1113)Word Amalgamation(字符串排序)
- HDUoj-------(1128)Self Numbers
- cf------(round 2)A. Winner
- cf------(round)#1 C. Ancient Berland Circus(几何)
- MySQL配置TokuDB的简单总结
- cf------(round)#1 B. Spreadsheets(模拟)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- ElasticSearch学习笔记(4)——基本操作
- 机器学习之支持向量机—SVM原理代码实现
- 前端性能分析工具利器
- Struts2拦截器
- Css制作hover下划线动画
- 算法数据结构 | 20行代码实现,使用Tarjan算法求解强连通分量
- Js获取系统当前时间展示
- Js反引号遍历数值
- Js传对象数组样式给后台
- ElasticSearch学习笔记(5)——SpringBoot整合ElasticSearch
- jQueryWEUI动态赋值select下拉框并获取value值
- Vue根据数据字段大小进行排列
- Vue里v-for循环双层数组
- Vue动态赋值video视频
- Vue上传头像到服务器加回显照片