首页 > 其他分享 >agc029c 题解

agc029c 题解

时间:2023-05-11 20:36:35浏览次数:36  
标签:sta agc029c int 题解 top val && id

  • 首先随便想个暴力,对于 \(a_i > a_{i -1}\),我们直接往字符串的末尾加上一些最小的字符。对于 \(a_i \le a_{i - 1}\),我们保留前缀之后随便加一个位置的 \(1\)。

  • 发现这个随便的位置不是很好找,于是想到用二分转枚举为判断。二分最大的字符(可以转化为数字)\(x\),每次我们只往最后一位加一,这相当于在 \(x\) 进制下做一个加法。

  • 注意二分的判断错误的条件,当第一位产生进位时,前面已经没有位置了,于是无解。

  • 注意到 \(a_i\) 很大,直接做加法会炸。我们不妨去除重复状态,只记录不为 \(0\) 的数,如果这些数中没有加一的数就添一个数进来。这样由于每次最多添一个数,所以空间复杂度为 \(O(n)\)。时间复杂度为 \(O(n\log n)\)。这里的 \(\log\) 来自二分。

  • 实现的细节写在代码里了。

/*
教学局,必拿下
更新分三步走:删后缀,进位,加数。
于是我们需要一个支持查询,删除,加入,更改值,下标还很大的东西。很容易想到 map。
将 map 的 first 作位,second 存值,直接更新即可。
注意到只有当 a[i]>=a[i-1] 时才会更新,所以把超过的后缀删掉这一步可以直接从最后开始删。因为里面加入的元素 first 递增。
这样理论复杂度会上升一个 log,应该还是能过的,但我被卡了 -_-b
注意到上上行的发现,想到用栈代替 map,果然快的一批
*/

#include <iostream>
#include <stack>
#include <algorithm>

using namespace std;
const long long N = 2e5+5, mod = 998244353;

int n;
int a[N];

#define id first
#define w second
bool check(int x) {
	stack<pair<int, int>> sta;
	for (int i = 2; i <= n; ++i) 
		if (a[i] <= a[i - 1]) {
            while (!sta.empty()) {
                int l = sta.top().id;
                if (l > a[i]) sta.pop();
                else break;
            }
            int l = a[i];
            while (((!sta.empty() && sta.top().id == l && sta.top().w + 1 == x) || x == 1) && l > 0) {
				if (!sta.empty()) sta.pop();
				--l;
			} 
            if (l == 0) 
				return false;
			int val = 0;
			if (!sta.empty() && sta.top().id == l) val = sta.top().w;
			++val;
			if (!sta.empty() && sta.top().id == l) sta.pop();
			sta.push(make_pair(l, val));
		}
	return true;
}
#undef id
#undef w

signed main(){
	freopen("text.in", "r", stdin);
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	
	cin >> n;
	for (int i = 1; i <= n; ++i) cin >> a[i];
	
	int l = 1, r = n;
	while (l < r) {
		int mid = (l + r) >> 1;
		if (check(mid) == true) r = mid;
		else l = mid + 1;
	}

    cout << l << endl;
	
	return 0;
}

标签:sta,agc029c,int,题解,top,val,&&,id
From: https://www.cnblogs.com/closureshop/p/agc029c.html

相关文章

  • 51nod 1227 平均最小公倍数 题解
    题目大意\[A(n)=\frac{1}{n}\sum_{i=1}^{n}\text{lcm}(n,i)\\F(a,b)=\sum_{i=a}^{b}A(i)\\\]给定\(a,b\),求\(F(a,b)\mod10^9+7\)。\(1\lea\leb\le10^9\)。思路首先我们可以想到,如果我们定义\(B(n)=\underset{i=1}{\overset{n}{\sum}}A(i)\),那么\(F(a,......
  • 【题解】P4331 [BalticOI 2004]Sequence 数字序列
    以各种方式出现被玩烂的题目,算是小trick题?cpeditor意外地好用思路可并堆。平行时空同位体:CF13CP4331P4597CF713CP2893已知做法:\(O(n^2)\)dp:令\(f[i][j]\)为前\(i\)个数不超过\(j\)的最小代价优化:使用堆维护dp产生的折线(P4597题解区)\(O(n\logn......
  • AtCoder Beginner Contest 298 题解
    题面:https://atcoder.jp/contests/abc298/tasks_printA-JobInterview直接模拟即可。#include<bits/stdc++.h>#include<ext/pb_ds/assoc_container.hpp>#include<ext/pb_ds/tree_policy.hpp>#include<ext/pb_ds/hash_policy.hpp>usingnamespace......
  • # Codeforces Round 872 (Div. 2) 题解
    CodeforcesRound872(Div.2)题解A.LuoTianyiandthePalindromeString略B.LuoTianyiandtheTable略C.LuoTianyiandtheShow略D1.LuoTianyiandtheFloatingIslands(EasyVersion)题意在树上随机撒\(k(k\leq3)\)个关键点,规定一个点是好的当且仅当这个......
  • springboot跨域问题解决方案
    以下内容仅供自己学习使用,侵权私聊必删。在进行前后端交互的时候,往往会遇到以下的跨域问题。那么解决这种跨域的话,可以使用以下这种方法:(引自于程序员青戈)创建config配置目录新建CorsConfig类然后把下面的内容复制进去根据自己需要修改以下就可以解决跨域问题啦importo......
  • P1676 [USACO05FEB] Aggressive cows G 题解
    题目传送门解题思路最大值最小化问题,考虑二分答案。首先要排序,保证序列单调不降,然后求出两个隔间之间的距离。sort(a+1,a+1+n);for(rii=1;i<=n;i++) dis[i]=a[i+1]-a[i];二分出一个\(mid\),判断它是否合法:每次累加距离,如果距离和比\(mid\)大,说明当前可以分配牛,记录数量......
  • Codeforces Round 683 (Div. 1, by Meet IT) ABCDF题解
    F和D都在ABC上做过类似的,但是没打好,道心破碎。。。。A.Knapsack若物品质量在[(w+1)/2,w]之间做完了否则一直贪心加voidsolve(){intn;llw;cin>>n>>w;intc=n;for(inti=1;i<=n;i++){cin>>a[i];if(a[i]>w)c--;}if(!c){......
  • Linux环境下,输入文件的编码格式和系统格式导致的问题解决办法
    1.用vim111.txt进入查看状态 2系统格式的查看和修改查看指令:setfileformat修改指令:setfileformat=unix3编码格式的查看和修改 查看指令 :setfileencoding 修改指令 在Vim中直接实行转换文件编码,比如将一个文件转换成u......
  • linux静态库的制作及问题解决
       首先介绍下分文件,在学习或者开发中,实现一个项目需要实现很多的功能,那么这些功能不可能在一个".c"文件下实现,需要多个".c"文件来共同实现,但是程序的入口只有一个,就体现了分文件编程的重要性,在主函数中调用其余的功能函数。分文件编程的优点及意义就是:分模块编程思......
  • CF1825D1 题解
    一、题目描述:给定$n$和$k$,表示有$n$个点,其中有$k$个点是关键点,这$k$个点随机分布。给出$n$个点的连接方式,保证构成一棵树,求有期望多少个点使得这个点到$k$个关键点的距离之和最小,答案对$1e9+7$取模。数据范围:$1\leqn\leq2e5,1\leqk\leqmin(n,3)......