标签:le rp 所以 int 题解 number ge 枚举 CF1687D
一道很有意思的小清新题。
首先我们知道两个相邻平方数 \(p^2,(p+1)^2\) 之间距离 \(2x+1\) 一定是奇数,所以 cute 数的范围一定是 \([p^2,p^2 + p]\)。
直接做没有头绪,考虑用枚举降低难度。我们试着枚举 \(p^2\le a_1 + k \le p ^2 + p\),所以 \(k\) 的取值为 \([p^2 - a_1, p^2 + p - a_1]\)。
接下来我们看 \(a_2\),那么如果 \(a_2\) 的 \(p\) 不变,\(k\) 的区间就是 \([p^2 - a_2,p^2 + p - a_2]\),由于 \(a_2 \ge a_1\),所以条件只有一个就是 \(p^2 + p- a_2 \ge p^2 - a_1\)。如果 \(p\) 增大了,那么有 \((p + c) ^2 - (p^2 + p) \ge p + 1\),所以 \(p\) 不变和 \(p\) 增大中,最多只有一个符合条件,所以我们不用进行决策。
同时观察到如果 \(p\) 增大需要满足 \((p+c) ^ 2 - a_2 \le p^2 + p - a_1 \to a_2 - a_1\ge p + 1\),所以枚举 \(p\) 后,\(p\) 最多增大 \(\dfrac{a_n}{p + 1}\) 次。所以直接暴力做的时间复杂度是 \(\mathcal{O}(a_n\ln a_n)\),不需要用到任何算法或数据结构。
#define N 2000005
int n, a[N], b[N], c[N];
inline int calc(int x){return sqrt(x) + eps;}
signed main() {
read(n);
rp(i, n)read(a[i]);
n = unique(a + 1, a + n + 1) - a - 1;
rp(i, n)c[a[i]] = b[a[i]] = a[i];
rp(i, a[n])if(!b[i])b[i] = b[i - 1];
pr(i, a[n])if(!c[i])c[i] = c[i + 1];
rp(p, a[n]){
int x = (a[1] + p <= a[n] ? c[a[1] + p + 1] : 0), y = (a[1] + p >= a[n] ? a[n] : b[a[1] + p]),
l = max(0LL, p * p - a[1]), r = p * (p + 1) - y;
while(x){
int q = calc(x + l), y = x + p >= a[n] ? a[n] : b[x + p];
if(q * (q + 1) - x < l)q++;
cmx(l, q * q - x), cmn(r, q * (q + 1) - y);
if(l > r || x + p >= a[n])break;
x = c[x + p + 1];
}
if(l <= r){printf("%lld\n", l); return 0;}
}
return 0;
}
标签:le,rp,所以,int,题解,number,ge,枚举,CF1687D 来源: https://www.cnblogs.com/7KByte/p/16341260.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。