CF429D Tricky Function 题解
令
则
所以
即求坐标为
求
因为
于是要求
我们可以使用分治进行求解。
如果不知道
请先完成这道题和这道题。
注意:
由于点
代码:
const int N = 1e5, inf = 1e9 + 7;
int n;
ll b[N + 5], sum[N + 5];
struct Poll {
ll x, y;
} a[N + 5], tmp[N + 5];
ll read() {
ll ret = 0, sgn = 0;
char ch = getchar();
while (!isdigit(ch)) sgn |= ch == '-', ch = getchar();
while (isdigit(ch)) ret = ret * 10 + ch - '0', ch = getchar();
return sgn? -ret: ret;
}
bool cmp(Poll a, Poll b) {
return a.x < b.x;
}
void merge(ll l, ll r) {
ll mid = l + r >> 1, i = l, j = mid + 1;
for (ll k = l; k <= r; k++)
if (i <= mid && (j > r || a[i].y < a[j].y)) tmp[k] = a[i++];
else tmp[k] = a[j++];
for (ll i = l; i <= r; i++) a[i] = tmp[i];
}
ll sqr(ll x) {
return x * x;
}
ll dis(Poll a, Poll b) {
return sqr(a.x - b.x) + sqr(a.y - b.y);
}
ll dfs(ll l, ll r) {
if (l >= r) return inf;
if (l + 1 == r) {
if (a[l].y > a[r].y) swap(a[l], a[r]);
return dis(a[l], a[r]);
}
ll mid = l + r >> 1, xmid = a[mid].x;
ll d = min(dfs(l, mid), dfs(mid + 1, r));
merge(l, r);
ll tot = 0;
for (ll i = l; i <= r; i++)
if (sqr(a[i].x - xmid) < d) b[++tot] = i;
for (ll i = 1; i <= tot; i++)
for (ll j = i + 1; j <= tot && sqr(a[b[i]].y - a[b[j]].y) < d; j++)
d = min(d, dis(a[b[i]], a[b[j]]));
return d;
}
int main() {
n = read();
for (ll i = 1; i <= n; i++) sum[i] = read();
for (ll i = 1; i <= n; i++) sum[i] += sum[i - 1];
for (ll i = 1; i <= n; i++) a[i].x = i, a[i].y = sum[i];
cout << dfs(1, n) << endl;
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端