reverse 题解

reverse 题解

注意到本题数据范围较大且与数位有关,考虑数位 DP 。

我们发现对于每个询问,我们可以将第一个条件拆开之后差分,可以先从后往前 DP ,预处理出末尾满足 $ L \le \operatorname{reverse}(n) \le R $ 的个数,之后使用试填法填数即可。具体地,在预处理时,处理出顶到上界,顶到下界,以及必定满足 $ L \le \operatorname{reverse}(n) \le R $ 的方案数,不妨假定 \(L\)\(R\)位数相等。

显然因为我们是从后向前 DP ,所以假如有一个填法满足

\[L_{k} \le \operatorname{reverse}(n)_{k} \le R_{k},L_{k+1,len} = \operatorname{reverse}(n)_{k+1,len} or \operatorname{reverse}(n)_{k+1,len} = R_{k+1,len} \]

在填到 \(k\) 时,无论后面如何填,一定满足 $ L \le \operatorname{reverse}(n) \le R $,反之如果

\[L_{k} \ge \operatorname{reverse}(n)_{k}or \operatorname{reverse}(n)_{k}\ge R_{k},L_{k+1,len} = \operatorname{reverse}(n)_{k+1,len} or \operatorname{reverse}(n)_{k+1,len} = R_{k+1,len} \]

那么无论后面填什么,一定不满足题意

考虑进行分讨,对于每个 \(k\) 分别处理 \(L_{k,len} = \operatorname{reverse}(n)_{k,len}\)\(R_{k,len} = \operatorname{reverse}(n)_{k,len}\)\(L_{k,len} \le \operatorname{reverse}(n)_{k,len} \le R_{k,len}\) 三种情况的方案数,显然前两种都是\(1\),最后一种是 \(R_{k,len}-L_{k,len}-1\),边界情况自行特判,这根本不用进行 DP,我们可以直接 \(O(len)\) 预处理

填数的时候,根据已经填的几位数reverse之后和 \(L\)\(R\) 的后几位大小关系,确定哪些情况是正确的,如果满足大于等于 \(L\),则可以取到上述第一种情况,满足小于等于 \(R\),则可以取到上述第二种情况。至此,我们完成了对位数相同的 \(L\)\(R\) 的计算。

对于位数不相同的情况,为了避免前导零的干扰,我们可以枚举可能的每个位数计算,这个算法复杂度 \(O(Tu\log^2 L)\) ,其中 \(u\) 是采用的进制,这里取 \(10\)

代码:

#include <bits/stdc++.h>
#define llt unsigned long long
using namespace std;
llt t,a,b,pw[21],dp[22][5],pre[22],len,la,lb;
llt get(llt x,llt index){if(index<1||index>20)	return 0;return x/pw[index-1]%10;}
llt get_head(llt x,llt index){return x/pw[index-1];}
llt Q(llt now){llt cnt=0;while(now){now/=10,cnt++;}return cnt;}
void DP(llt L,llt R)
{llt u,l,r;memset(pre,0,sizeof(pre));memset(dp,0,sizeof(dp));dp[0][0]=0-1;dp[0][1]=dp[0][2]=1;for(int i=1;i<=len;i++){l=get(L,len-i+1);r=get(R,len-i+1);dp[i][0]=get_head(R,len-i+1)-get_head(L,len-i+1)-1;dp[i][1]=dp[i][2]=1;}
}
llt GET(llt p,llt L,llt R)
{llt u,l,r,sum=0,now=0,now1,now2,last1=2,last2=2,tot=0; for(int i=len;i>=1;i--){u=get(p,i);l=get(L,len+1-i),r=get(R,len+1-i);for(int j=0;j<u;j++){if(sum==0&&j==0)	continue;if(j<l) now1=1;if(j==l)    now1=last1;if(j>l) now1=2;if(j<r) now2=2;if(j==r)    now2=last2;if(j>r) now2=1;tot+=dp[i-1][0];if(now1==2) tot+=dp[i-1][1];if(now2==2) tot+=dp[i-1][2];}if(u<l) last1=1;if(u==l)    last1=last1;if(u>l) last1=2;if(u<r) last2=2;if(u==r)    last2=last2;if(u>r) last2=1;sum+=u;}return tot;
}
void work(llt L,llt R)
{llt maxx=Q(R),to=Q(L),x,y,ans=0;for(int i=maxx;i>=to;i--){len=i;if(i==maxx)	x=R;else	x=pw[i]-2,ans++;if(i==to)	y=L;else	y=pw[i-1];DP(L,x);ans+=GET(x+1,L,x)-GET(y,L,x);}printf("%llu\n",ans);
}
int main() 
{#ifdef LOCALfreopen("1.in","r",stdin);freopen("1.out","w",stdout);#endifpw[0]=1;for(int i=1;i<=20;i++)	pw[i]=pw[i-1]*10;	scanf("%llu%llu%llu",&t,&a,&b);while(t--){scanf("%llu%llu",&a,&b);if(b+1==0)  b--;//为了避免炸ull,在MAX_ull不可能取到情况下的特判work(a,b);}return 0;
}

为了通过加强版数据,我们需要继续优化复杂度,首先我们发现 GET 里面对于 \(j\) 的枚举完全可以避免,接着又发现中间的 \(l\)\(r\) 都是 \(10^k\)\(10^{k+1}-1\) ,此时因为 \(R\) 的位数比我们多一位,所以只剩下 \(L\) 的限制,所有 \(len\) 位(包含前导零)大于等于 \(L\) 且没有末尾零的数翻转过来都是一个合法的数,直接累加答案就好了,GET 只需要跑两次,复杂度 \(O(T\log R)\),可以通过加强版数据。

代码:

#include <bits/stdc++.h>
#define llt unsigned long long
#define Il __always_inline
using namespace std;
llt seed,last,pw[21],b,a;int t,len;
Il int Q(llt now){int cnt=0;for(;now;now/=10,++cnt);return cnt;}
Il llt GET(llt p,llt L,llt R)
{int u,l,r,last1=2,last2=2;llt tot=0; for(int i=len;i>=1;--i){u=p/pw[i-1]%10;l=L/pw[len-i]%10,r=R/pw[len-i]%10;if(last1==2&&l<u)	++tot;if(last2==2&&r<u)	++tot;	if(u>l+1)	tot+=u-l-1;tot+=min(r,u);tot+=(R/pw[len-i+1]-L/pw[len-i+1]-1)*(u-1);if(u<l) last1=1;else if(u>l) last1=2;if(u<r) last2=2;else if(u>r) last2=1;}return tot;
}
Il void work(llt L,llt R)
{int maxx=Q(R),to=Q(L);llt x,y,ans=0;for(int i=maxx;i>=to;--i){len=i;if(i==maxx)	x=R;else	x=pw[i]-2,++ans;if(i==to)	y=L;else	y=pw[i-1];if(i!=maxx&&i!=to)  ans+=x-y+1-(L-L/10)+(L%10!=0);else ans+=GET(x+1,L,x)-GET(y,L,x);}printf("%llu\n",ans);
}
int main() 
{#ifdef LOCALfreopen("1.in","r",stdin);freopen("std.out","w",stdout);#endifpw[0]=1;for(register int i=1;i<=19;++i)	pw[i]=pw[i-1]*10;pw[20]=0-1;	scanf("%llu%llu%llu",&t,&a,&b);while(t--){scanf("%llu%llu",&a,&b);if(b+1==0)  b--;work(a,b);}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/738149.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VMware vSphere Tanzu部署_14_部署容器应用

1.部署运行容器应用 1.1. 登录tkc集群 jianhua@napp:~/tkc$ kubectl vsphere login --server=192.168.203.194 \ --tanzu-kubernetes-cluster-name tkc-dev-cluster \ --tanzu-kubernetes-cluster-namespace tkc-01 \ --vsphere-username administrator@vsphere.local \ --ins…

贝塞尔曲线原理、推导及Matlab实现

本文详细解析了贝塞尔曲线的定义、性质、构建方法以及多种阶数的推导公式,并提供了完整的Matlab代码用于绘制和计算贝塞尔曲线。贝塞尔曲线原理、推导及Matlab实现 贝塞尔曲线原理、推导及Matlab实现 一、简介 贝塞尔曲线提出 在数学的数值分析领域中,贝塞尔曲线(English:B…

刘积仁的大健康“长跑”

软件是一个长命的产业,但软件企业的寿命都很短。懂得怕死,才能有机会活得长久。 这一次,刘积仁又为东软医疗找到了强大助力!中国通用技术(集团)控股有限责任公司(以下简称通用技术集团)所属资本公司战略投资东软集团在医疗健康领域资的创新业务公司——东软医疗,双方也由…

【AppStore】一文让你学会IOS应用上架Appstore

咱们国内现在手机分为两类,Android手机与苹果手机,现在用的各类APP,为了手机的使用安全,避免下载到病毒软件,官方都极力推荐使用手机自带的应用商城进行下载,但是国内Android手机品类众多,手机商城各式各样,做不到统一,所以Android的APP上架得一个一个平台去申请上架,…

关于airtest生成的报告中缺少poco语句问题

1、airtest生成的报告只显示airtest的相关操作,如果是poco和airtest-selenium的操作则不记录。因此需要在报告中引用插件。支持poco语句插件,poco.utils.airtest.report 支持airtest-selenium语句插件,airtest_selenium.report2、在IDE运行 .py 脚本报告生成的依据是脚本运行…

xshell7的下载ssh远程连接

1.下载地址家庭/学校免费 - NetSarang Website (xshell.com) 2.下载后一路next,来到主页面,我们来连接一下试一试吧,这里主机就是ifconfig得到的 3.用户名一般都是root密码是自己设置的那个 4.连接的时候注意比如我要连接Node1那么node1就要保持开启并却防火墙已经关闭 5.看一…

xhcms1.0

xhcms1.0 目录结构 admin --管理后台文件夹 css --存放css的文件夹 files --存放页面的文件夹 images --存放图片的文件夹 inc --存放网站配置文件的文件夹 install --网站进行安装的文件夹 seacmseditor --编辑器文件夹 te…

关于巴图自动化Profinet协议转Modbus协议网关模块怎么配置IP地址教学

Profinet协议和Modbus协议是工业通讯常用协议,通过巴图自动化PN转Modbus网关模块(BT-MDPN10)实现连接。常见的协议有:ModbusTCP协议,Profibus协议,Profibus DP协议,EtherCAT协议,EtherNET协议,CAN,CANOPEN等Profinet协议和Modbus协议是工业领域中常用的两种通讯协议,…

基础篇:Stable Diffusion 基础原理详述

【基础篇】Stable Diffusion 基础原理详述前言我认为学习 ComfyUI 应该先从理论学起。与传统绘图工具(如 Photoshop 或 Figma)相比,AI 绘图工具有着显著不同。首先,许多设置和操作在 AI 绘图工具中是非可视化的,这意味着即使你更改了某个配置,界面上也未必会有任何变化,…

微信云开发数据库连接

//.js文件const db = wx.cloud.database()Page({//页面的初始数据data: {dataObj:"" //定义对象dataObj}, //查询数据getData(){db.collection("pro1").where({ //pro1为数据库名author:"张三" …

Camstar里拿到Grid的行数据

两种方法: 1.GridDataMode属性为Geceric的:拿到的数据直接放在datatable里,并且赋值给grid,这里我把拿来的数据放在了一个集合里,测试用的 随便写写 2.GridDataMode属性为ItemList的:这里是用了一个集合去接收datatable的值,再把集合赋值给grid这里和第一种的区别是我没有…

MQTT专题

什么是Mqtt MQTT协议 全称是(Message Queuing Telemetry Transport),即消息队列遥测传输协议。 是一种基于发布/订阅(Publish/Subscribe)模式的轻量级通讯协议,并且该协议构建于TCP/IP协议之上,我们知道TCP协议本身就具有高可靠性的特点,因此基于其上的MQTT协议同样也…

安装visual studio失败,组策略阻止安装webview2

排查安装和升级问题 - Visual Studio | Microsoft Learn 需要修改注册表 ,将 InstallDefault值改为1注册表路径 HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\EdgeUpdate

appium 使用

refer to: python+appium2~inspector工具使用及定位操作元素~_哔哩哔哩_bilibili 1 APPium Inspector 可以查看Android应用的 包名 和activity 打开APP,且处于启动页面 Q1 noReset=True 设置每次APP启动 不重头 初始化环境 怎么实现呢 Q1 那我们现在用的是appium1 还是 appi…

7月11日云技术研讨会 | 车载信息安全全流程实施方案

7月11日,经纬恒润《车载信息安全全流程实施方案》云技术研讨会,与您相聚云端,不见不散! 伴随着汽车的智能网联化发展,网络攻击也逐渐渗透漫延至汽车领域,汽车行业面临着重大的信息安全挑战。此外,UNECE WP.29 R155和ISO/SAE 21434等标准也对汽车的信息安全提出了规…

基于全数字实时仿真的嵌入式DevOps解决方案

​为丰富浙江省信息技术应用创新(以下简称“信创”)产业生态,在全社会各领域形成示范效应,浙江省经信厅联合省密码管理局开展2023年浙江省深化信创典型案例评选工作。经过征集申报、专家评选、名单公示等程序,确定36个应用示范案例和24个典型解决方案。【典型解决方案】 基…

巴图自动化PN转Modbus RTU协议转换网关模块快速配置

巴图自动化推出Profinet转Modbus网关模块BT-MDPN10,实现Modbus和Profinet设备互联互通。配置简便,提高系统智能化和生产效率。工业领域中常用的通讯协议有:Profinet协议,Modbus协议,ModbusTCP协议,Profibus协议,Profibus DP协议,EtherCAT协议,EtherNET协议,CAN,CanO…

springboot+vue前后端分离项目-项目搭建7-服务器上安装部署

1.下载VMware(个人使用版),官网下载,需要先用邮箱注册,下载地址:https://support.broadcom.com/group/ecx/productdownloads?subfamily=VMware%20Workstation%20Pro 2.下载镜像dvd类型的,华为云官网下载,需要先注册,下载地址:https://mirrors.huaweicloud.com/mirro…

linux进程被杀掉日志,Linux进程突然被杀掉(OOM killer),查看系统日志

Linux进程被杀掉(OOM killer),查看系统日志 基本概念: Linux 内核有个机制叫OOM killer(Out Of Memory killer),该机制会监控那些占用内存过大,尤其是瞬间占用内存很快的进程,然后防止内存耗尽而自动把该进程杀掉。内核检测到系统内存不足、挑选并杀掉某个进程的过程可以参…