日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[ARC055D]隠された等差数列

發(fā)布時間:2025/3/21 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [ARC055D]隠された等差数列 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

題意:對一個等差數(shù)列$a_i=A+Bi(0\leq i\leq n-1)$和非負整數(shù)$x$,把$a_i$的$10^x$位拿出來可以寫成一個字符集為$0\cdots9$的字符串,現(xiàn)在給定這個字符串$d_{0\cdots n-1}$,求最小的$A$,或輸出無解

如果$x\gt0$,那么有可能產(chǎn)生進位,所以$d_{i+1}-d_i$的取值最多能有$2$種,如果只有$1$種,顯然$d_0$就是答案

如果有兩種,這兩種取值在$\bmod10$意義下必須相差$1$,較小那個($9\lt0$)就是$B$的$x-1$位

先掃一遍,用$B$的$x$位把$d_i$的$x$位向高位的進位復(fù)原,得到$d'_i$,現(xiàn)在條件變?yōu)?\left\lfloor\frac{a_i}{10^x}\right\rfloor=d'_i$,也可以寫成$d'_i\cdot10^x\leq a_i\lt(d'_i+1)\cdot10^x$

我們已經(jīng)知道了$d_i'$,現(xiàn)在要找到符合以上不等式的$a_i$并使得$a_0$最小,因為$x$越大限制越寬松,同時最小的$a_0$越大,所以考慮從小到大枚舉$x$并判斷是否能滿足條件

實際上我們要找的是一條直線,它必須經(jīng)過每條端點為$(i,d'_i\cdot10^x),(i,(d'_i+1)\cdot10^x)$的線段,兩兩枚舉$d'_i$和$d'_j+1$,求出斜率的范圍,然后不停增大$x$直到這個范圍包含整數(shù)為止

雖然$n=10^4$,但因為atcoder評測機實在太快了,所以是能過的

以下是更快的方法(我沒寫==)

橫縱坐標范圍為$O(n)$的任意整點點集的凸包的大小為$O(n^{\frac23})$,證明如下(來自zjt)

先考慮求左下凸殼的大小,其他方向是一樣的,這個凸殼的每條邊對應(yīng)的向量互相叉積$\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})$,所以不同的向量數(shù)只有$O(n^{\frac23})$個

所以凸包的大小也是$O(n^{\frac23})$,因為對問題做了三次弱化,所以實際上凸包上的點還會少很多

先求出所有$(i,d'_i\cdot10^x)$的上凸殼和$(i,(d'_i+1)\cdot10^x)$的下凸殼,由上述定理,在兩個凸殼上枚舉點對的時間復(fù)雜度為$O(n^{\frac43})$

最快當(dāng)然還是在上凸殼枚舉點,在下凸殼上的對應(yīng)點只會單調(diào)地移動,時間復(fù)雜度$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); }

轉(zhuǎn)載于:https://www.cnblogs.com/jefflyy/p/9852582.html

總結(jié)

以上是生活随笔為你收集整理的[ARC055D]隠された等差数列的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。