题意:对一个等差数列$a_i=A+Bi(0\leq i\leq n-1)$和非负整数$x$,把$a_i$的$10^x$位拿出来可以写成一个字符集为$0\cdots9$的字符串,现在给定这个字符串$d_{0\cdots n-1}$,求最小的$A$,或输出无解

如果$x\gt0$,那么有可能产生进位,所以$d_{i+1}-d_i$的取值最多能有$2$种,如果只有$1$种,显然$d_0$就是答案

如果有两种,这两种取值在$\bmod10$意义下必须相差$1$,较小那个($9\lt0$)就是$B$的$x-1$位

先扫一遍,用$B$的$x$位把$d_i$的$x$位向高位的进位复原,得到$d'_i$,现在条件变为$\left\lfloor\frac{a_i}{10^x}\right\rfloor=d'_i$,也可以写成$d'_i\cdot10^x\leq a_i\lt(d'_i+1)\cdot10^x$

我们已经知道了$d_i'$,现在要找到符合以上不等式的$a_i$并使得$a_0$最小,因为$x$越大限制越宽松,同时最小的$a_0$越大,所以考虑从小到大枚举$x$并判断是否能满足条件

实际上我们要找的是一条直线,它必须经过每条端点为$(i,d'_i\cdot10^x),(i,(d'_i+1)\cdot10^x)$的线段,两两枚举$d'_i$和$d'_j+1$,求出斜率的范围,然后不停增大$x$直到这个范围包含整数为止

虽然$n=10^4$,但因为atcoder评测机实在太快了,所以是能过的

以下是更快的方法(我没写==)

横纵坐标范围为$O(n)$的任意整点点集的凸包的大小为$O(n^{\frac23})$,证明如下(来自zjt)

先考虑求左下凸壳的大小,其他方向是一样的,这个凸壳的每条边对应的向量互相叉积$\gt0$,且所有向量的$x$之和和$y$之和都是$O(n)$级别的($x,y\geq0$)

对问题进行弱化:所有向量的$x+y$之和是$O(n)$的,并且我们不要求向量只需不相等

如果每个$(i,j)$都满足$i,j\leq m$,那么$\sum\limits_{i\leq m}\sum\limits_{j\leq m}i+j=O(n)$,即$m=O(n^{\frac13})$,所以不同的向量数只有$O(n^{\frac23})$个

所以凸包的大小也是$O(n^{\frac23})$,因为对问题做了三次弱化,所以实际上凸包上的点还会少很多

先求出所有$(i,d'_i\cdot10^x)$的上凸壳和$(i,(d'_i+1)\cdot10^x)$的下凸壳,由上述定理,在两个凸壳上枚举点对的时间复杂度为$O(n^{\frac43})$

最快当然还是在上凸壳枚举点,在下凸壳上的对应点只会单调地移动,时间复杂度$O(n)$

注意涉及到斜率作差时,如果坐标范围为$M$,$eps$一般要开到$\frac1{M^2}$,这个随便找一个极端情况就知道了

#include<stdio.h>
#include<string.h>
#include<set>
#include<math.h>
using namespace std;
typedef double du;
const du eps=1e-9;
char s[10010];
int a[10010];
set<int>d;
int go(int x,int y){return(y-x+10)%10;}
int main(){int n,i,j,dd,pw,B,res;du mn,mx;scanf("%s",s);n=strlen(s);for(i=0;i<n-1;i++)d.insert(go(s[i],s[i+1]));if(d.size()<2u){putchar(s[0]);return 0;}#define wa {puts("-1");return 0;}#define s1 *d.begin()#define s2 *d.rbegin()if(d.size()>2u||(go(s1,s2)!=1&&go(s2,s1)!=1))wadd=s2==s1+1?s1:s2;a[0]=s[0]-'0';for(i=1;i<n;i++){a[i]=a[i-1]+dd;if(a[i]%10!=s[i]-'0')a[i]++;if(a[i]%10!=s[i]-'0')wa}mn=0;mx=1e9;for(i=0;i<n-1;i++){for(j=i+1;j<n;j++){mn=max(mn,(a[j]-(a[i]+1)+eps)/(du)(j-i));mx=min(mx,((a[j]+1)-a[i]-eps)/(du)(j-i));}}if(mn>mx)wafor(pw=1;ceil(mn*pw)>floor(mx*pw);pw*=10);B=floor(mx*pw);res=0;for(i=0;i<n;i++)res=max(res,a[i]*pw-B*i);printf("%d",res);
}

转载于:https://www.cnblogs.com/jefflyy/p/9852582.html

[ARC055D]隠された等差数列相关推荐

  1. LeetCode简单题之判断能否形成等差数列

    题目 给你一个数字数组 arr . 如果一个数列中,任意相邻两项的差总等于同一个常数,那么这个数列就称为 等差数列 . 如果可以重新排列数组形成等差数列,请返回 true :否则,返回 false . ...

  2. n个素数构成等差数列

    n个素数构成等差数列 Time Limit: 1 Sec  Memory Limit: 128 MB   64bit IO Format: %lld Description 有n个素数(均小于m)可以 ...

  3. BZOJ.1558.[JSOI2009]等差数列(线段树 差分)

    BZOJ 洛谷 首先可以把原序列\(A_i\)转化成差分序列\(B_i\)去做. 这样对于区间加一个等差数列\((l,r,a_0,d)\),就可以转化为\(B_{l-1}\)+=\(a_0\),\(B ...

  4. 1035等差数列末项计算

    1 #include<iostream> 2 using namespace std; 3 int main() 4 { 5 int a1,a2,an,d,n; 6 cin>> ...

  5. 莫队 ---- CF 135D. Jeff and Removing Periods (等差数列预处理 + 莫队)

    题目 题目大意: 给你一个等差序列,每次查询一段区间[l,r][l,r][l,r]的答案. 显然这是典型的不带修改的区间询问类问题,我们可以考虑用莫队算法去解决. 解题思路: 接下来看怎么递推[l,r ...

  6. 等差数列末项_等差数列末项(第n项)公式

    点击上方蓝字 · 关注珂珂的小园 先思考,再对答案,不会做和没做对的,看视频讲解. 题目 1.如图,从小明家门前有一条路,路边种了一排树,相邻两棵树的间隔都是3米.从小明家到第1棵树要走20米. (1 ...

  7. TYVJ P1091 等差数列 Label:dp

    背景 广东汕头聿怀初中 Train#3 Problem 3 描述 等差数列的定义是一个数列S,它满足了(S[i]-S[i-1]) = d (i>1).显然的一个单独的数字或者两个数字也可以形成一 ...

  8. fibonacci数列前20项_等差数列、等比数列、调和数列等几种常见数列的总结

    给大家梳理一下几种常见的数列的定义.通项公式.求和公式以及性质. 斐波那契数列 一.等差数列 如果一个数列从第二项起,每一项与前一项的差都是定值,则这个数列叫做等差数列,这个定差为公差. 1.等差数列 ...

  9. [再寄小读者之数学篇](2014-11-19 等差数列的部分和)

    设 $\sed{a_k}_{k=1}^n$ 为等差数列, 则 $$\bex a_1+\cdots+a_n=\frac{n(a_1+a_n)}{2}. \eex$$ Ref. [Proof Withou ...

最新文章

  1. CSP 2019-09-1 小明种苹果 Python实现+详解
  2. 适合小团队作战,奖金+招聘绿色通道,这一届算法大赛关注下?
  3. 如何从NumPy直接创建RNN?
  4. C/C++中退出线程的四种解决方法
  5. 浅谈php7的重大新特性_PHP7的新特性和源码结构
  6. InstallShield Premier版本和Professional版本的功能差异
  7. ssms没有弹出服务器验证_使用SSMS扫描和查找SQL Server数据库的潜在安全漏洞
  8. 【正式发布】火星人敏捷开发手册2012-12-25(基于Scrum的敏捷开发免费培训教材及公司内部宣传材料)...
  9. 基本不等式解决乘积最大问题(洛谷P1887题题解,Java语言描述)
  10. (转)PostGIS+QGIS+GeoServer+OpenLayers实现数据的存储、服务的发布以及地图的显示...
  11. Python 3 - 如何下载视图和保存证书
  12. JavaWeb一些常用操作
  13. python pandas库的应用(类比mysql语言)
  14. html5 area 获取坐标,HTML 5
  15. DVM 和 JVM 的区别?
  16. 181223每日一句
  17. php 导出 设置多表头,PHP Excel 导出文件,自定义表头
  18. 计算机ppt用快捷键,计算机_电脑操作快捷键大全祥解.ppt
  19. 在线生成各种印章式图片
  20. Sonatype Nexus Repository Manager

热门文章

  1. Java NIO之缓冲区
  2. JVM垃圾回收算法 总结及汇总
  3. opencv 中 快速傅里叶变换 FFT
  4. 空类的sizeof为1
  5. 性能优化:Sql语句中HINT不起作用
  6. 火狐已阻止载入混合活动内容“http://www.XXX/index.php?app=serviceac=authts=isauthurl=...
  7. 用prop还是attr
  8. Hitpoint:外贸企业如何选择合适的ERP系统
  9. acl 日志记录方式介绍
  10. LINQTOSQL作为底层ORM框架后,我们的数据基类就变成了这个样子