首页 > 其他分享 >CF1808C Unlucky Numbers 题解

CF1808C Unlucky Numbers 题解

时间:2023-07-17 14:23:58浏览次数:35  
标签:std 10 CF1808C 题解 back Unlucky int using include

可以证明答案是 \(l\) 或 \(r\) 的一段前缀,拼上后面全部相同的一段字符 \(d\),证明方式类似数位 dp。能够自由填的数字一定是相等的,这样不会影响幸运值。前面那些不能自由填写的,就是 \(l\) 或 \(r\) 的一段前缀。假如不是 \(l\) 或 \(r\) 的一段前缀,必然填写相等的更好,而这种情况已经被考虑到了。
枚举前缀长度,枚举修改成的字符 \(d\),复杂度 \(\mathcal O(T\log^2w\Sigma)\),字符集大小为 \(10\)。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#define siz(x) int((x).size())
#define all(x) std::begin(x),std::end(x)
using std::cin;using std::cout;
using std::max;using std::min;
using loli=long long;
int n;
loli l,r;
std::vector<int>b1,b2,t,ans;
int calc(std::vector<int>b){
	reverse(all(b));
	while(!b.empty()&&!b.back())b.pop_back();
	return *max_element(all(b))-*min_element(all(b));
}
signed main(){
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);
	std::ios::sync_with_stdio(false);cin.tie(nullptr);
	int T;cin>>T;while(T--){
		cin>>l>>r;
		b1.clear();b2.clear();
		ans.clear();
		for(;l;l/=10)b1.push_back(int(l%10));
		for(;r;r/=10)b2.push_back(int(r%10));
		n=max(siz(b1),siz(b2));
		while(siz(b1)<n)b1.push_back(0);
		while(siz(b2)<n)b2.push_back(0);
		reverse(all(b1));reverse(all(b2));
		for(int k=0;k<=n;k++)for(int d=0;d<=9;d++){
			t=b1;
			for(int j=k;j<n;j++)t[j]=d;
			if(b1<=t&&t<=b2&&(ans.empty()||calc(t)<calc(ans)))
				ans=move(t);
		}
		for(int k=0;k<=n;k++)for(int d=0;d<=9;d++){
			t=b2;
			for(int j=k;j<n;j++)t[j]=d;
			if(b1<=t&&t<=b2&&(ans.empty()||calc(t)<calc(ans)))
				ans=move(t);
		}
		reverse(all(ans));
		while(!ans.empty()&&!ans.back())ans.pop_back();
		reverse(all(ans));
		for(int i:ans)cout<<i;
		cout<<'\n';
	}
	return 0;
}

标签:std,10,CF1808C,题解,back,Unlucky,int,using,include
From: https://www.cnblogs.com/bxjz/p/CF1808C.html

相关文章

  • P7809 [JRKSJ R2] 01 序列 题解
    前言传送门blog思路Problem1问题一问的是最长不下降子序列的长度,在一个$01$串中的最长不下降子序列,总共有三种$000\dots$,$000\dots111\dots$和$111111\dots$。可以把找到以上三种最长不下降子序列问题变为:$$\max^r_{i=l}(\sum_{j=l}^i[a_j=0])+(\sum_{j=i+1}^......
  • P7333 [JRKSJ R1] JFCA 题解
    前言传送门blog思路首先看数据范围$10^5$,$O(n\log_2n)$可以过,自然想到二分。二分具有单调性,那么如何确保整个$a$序列按顺序排列呢?我们可以使用st表维护区间最大值,如果在这个距离中已经有了$a_i\geb_j$那么最大值一定指向的是新加入进来的那个值,否则在之前二分就......
  • P8708 [蓝桥杯 2020 省 A1] 整数小拼接 题解
    前言传送门blog思路这种选出两个数拼接在一起的题,一看就可以使用two-point,我们使用$l$和$r$分别从最大的和最小的开始搜索,进行两次。以$l$为头,$r$为尾。以$r$为头,$l$为尾。如何比较大小呢?我们可以先去做宇宙总统这道题。首先排序的$cmp$:boolcmp(strin......
  • UVA10791 最小公倍数的最小和 Minimum Sum LCM 题解
    前言长沙市一中8机房0714模拟测1。传送门blog思路本题思路,首先我们先看$\operatorname{lcm}$,明显要使得这些数的$\operatorname{lcm}=n$那么我们就需要所有的数的质因子必须包含$n$的质因子。若$1\lea,b$,则$a\timesb\gea+b$,所以我们就有了策略。将同一个质因......
  • P9451 [ZSHOI-R1] 新概念报数 题解
    目录DescriptionSolutionCodeDescription在此题中,对于一个数\(x\),若\(\texttt{popcount}(x)\geq3\)(即\(x\)在二进制下\(\texttt{1}\)的个数大于等于三时),那它是非法的,否则其为合法的。给定\(T\)个数,如果当前的数\(x\)是非法的,则输出No,Commander,否则输出第一个大于......
  • requests.exceptions.ProxyError问题解决方法
    出现这个问题是因为你系统上在使用代理,然后你的代理又是规则匹配的。https://stackoverflow.com/questions/36906985/switch-off-proxy-in-requests-library3种解决方法:headers={"User-Agent":"Mozilla/5.0(WindowsNT10.0;Win64;x64;rv:109.0)Gecko/20100101Fi......
  • CF512D Fox And Travelling 题解--zhengjun
    计数好题。首先对于每个连通块独立考虑,最后合并答案。发现点数超过1的强连通分量一定删不掉。若连通块中存在点数超过1的强连通分量tarjan缩点之后,称这些点数超过1的强连通分量为关键点;那么两关键点之间的点也不能删;于是对于剩下的点直接dp即可,由于可删的子树......
  • 你省(福建)省队集训模拟赛题解
    Day5$\texttt{T1}$简要题意有两个正整数\(a<b\le10^9\),给出\(\dfrac{a}{b}\)的小数点后\(19\)位,要求还原\(a,b\),保证有解。solution一个科技:\(\texttt{Stern-Brocottree}(SBT)\),可以参考这个博客学习。先给出$O(n)$找的代码#include<bits/stdc++.h>#defineLL......
  • 洛谷-P9455 题解
    写在前面:本题蒟蒻给出两种做法,一种乱搞贪心(只是目前能过,若能被Hack请和我说),一种正解二分。正文1最坏时间复杂度:\(\mathcal{O}(n+\logV)(V=10^9)\)这个做法是很简单的,在此不多讲。只需要二分超频电压mid即可,若当前mid可行,则令右边界缩小至mid,否则令左边界扩大至mid。......
  • 230226题解
    A数列题目描述给定一个长为\(n\)的数列\(A_1,A_2,…,A_n\)。给出\(q\)次询问,每次询问给定\(X\),请你回答至少需要多少次操作,能够让数列中的每个数都变成\(X\)。每次操作你可以选择数列中的一个数加\(1\)或者减\(1\)。询问之间相互独立。输入格式第一行两个整数\(n,q\)。第......