CF gym 102483(NWERC 2018) A题 解答
分析
题目大意:给出 个点的坐标 ,其中 ,要求构造相应的点 , 满足 ,使得 最小。
注意到 和 都是分别独立的,因此只需求 最小值即可。
先给出具体做法:对于每个 ,都创建一个有值和 (简记为 ), (简记为 )两个属性的结点,当当前结点 与先前结点满足: 时,就将 与 进行合并得到更新后的 ,如此下去直到最后的 与 满足:
其中合并方法为: 将 加上 , 加上 ,删去 。
下面说明这样做即可得到最优解:
简便起见,分别将 结点记为 , , 有属性 , 记为 。
设 对应的区间为 , 对应的区间为 。
先给出引理:对于 ,当且仅当 时取到最小值。
证明:展开,可知 是关于 的二次函数,由展开式可知,其在且只在 取到最小值。
- 当 时,只需证明不合并比合并的花费小即可。
记
由所给的做法,对于相应的 可知在 , ,而在 , ,这样的 值是合法的。
只需证明
由引理,
将上两式相加即证。
- 当 时,只需证明合并比不合并的花费小即可。
由所给的做法,对于相应的 ,记在 , ,而在 , ,应有 。
只需证明
因为
故
由引理,显然有
至此证毕。
所以对于所给的做法,每一次操作都是最优的做法,因此整个做法是最优的。
代码:
#pragma GCC optimize("O3")
#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
#define debug(x) cerr << #x << ": " << x << endl
#define pb(a) push_back(a)
#define set0(a) memset(a,0,sizeof(a))
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define dwn(i,a,b) for(int i=(a);i>=(b);i--)
#define ceil(a,b) (a+(b-1))/b
#define INF 0x3f3f3f3f
#define ll_INF 0x7f7f7f7f7f7f7f7f
typedef long long ll;
typedef pair<int,int> PII;
typedef pair<double,double> PDD;
inline int read()
{
int x=0,y=1;char c=getchar();
while (c<'0'||c>'9') {if (c=='-') y=-1;c=getchar();}
while (c>='0'&&c<='9') x=x*10+c-'0',c=getchar();
return x*y;
}
const int N=1e5+5;
const double eps=1e-12;
int n;
double x[N], y[N];
double stk_sum[N];
int stk_cnt[N];
int top;
double cal(double a[]){
set0(stk_sum), set0(stk_cnt);
top=0;
rep(i, 1, n){
double cur_sum=a[i]; int cur_cnt=1;
while(top && cur_sum*stk_cnt[top]+eps<stk_sum[top]*cur_cnt){
cur_sum+=stk_sum[top];
cur_cnt+=stk_cnt[top--];
}
stk_sum[++top]=cur_sum, stk_cnt[top]=cur_cnt;
}
int id=0;
double res=0;
rep(i, 1, top) rep(j, 1, stk_cnt[i]){
id++;
double avg=stk_sum[i]/stk_cnt[i];
res+=(avg-a[id])*(avg-a[id]);
}
return res;
}
int main(){
cin>>n;
rep(i, 1, n) cin>>x[i]>>y[i];
double res=cal(x)+cal(y);
printf("%.10lf\n", res);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】