中山市选 #E 参数拟合
中山市选 #E 参数拟合
题目大意
有两个长度为 的序列 。现在给出你 种操作, 表示你可以将 同时增加 为任意整数。
最后需要使得 最小。
解题思路
首先,我们令 这样我们的目标就是使得 尽量小。
不难想到建一张图。
对于每一个连通块必然是单独考虑。
在一个连通块内,我们不妨以任意一个点为根,先跑出一棵树,规定父亲的深度为 。
对于树边,我们可以把儿子的 全部减到其父亲上。
这样我们可以计算出父亲节点最后剩余的 :
- 若 节点深度为奇数,则对 贡献
- 若 节点深度为偶数,则对 贡献
接下来考虑非树边。
如果有非树边连接深度奇偶性不同的点 ,我们不妨设根节点将 分给 方向( 深度为奇数) , 方向 。
那么 。
作差,发现 ,由于 ,且都为整数,故可以使得 。
如果有非树边连接深度奇偶性相同的点,定义同上。
那么 。
作差,发现 仍然无法解决问题。
令 ,代价为 我们可以在保证 的情况下尽量均摊(整数),来使得代价最小,可以用柯西不等式简单证明。
计算过程详见代码中 Calc
函数。
参考代码
#include<bits/stdc++.h> using namespace std; #define int long long const int maxn=1e6; struct Edge{int u,v,nxt;}; int n,m; int a[maxn+5]; int hd[maxn+5],et; Edge e[maxn+5]; int de[maxn+5]; int tsum,tcnt; bool flg; int ans; inline void Adde(int u,int v){ e[et].u=u,e[et].v=v,e[et].nxt=hd[u],hd[u]=et++; } void Dfs(int u){ int v; tcnt++; if(de[u]&1) tsum+=a[u]; else tsum-=a[u]; for(int i=hd[u];~i;i=e[i].nxt){ v=e[i].v; if(de[v]){ if((de[v]&1)==(de[u]&1)) flg=1; } else{ de[v]=de[u]+1; Dfs(v); } } } inline int Calc(int sum,int cnt){ int res,tmp; tmp=sum%cnt; res=sum/cnt; return tmp*(res+1)*(res+1)+(cnt-tmp)*res*res; } signed main(){ int u,v,x; memset(hd,-1,sizeof(hd)); memset(e,-1,sizeof(e)); scanf("%lld%lld",&n,&m); for(int i=1;i<=n;i++) scanf("%lld",&a[i]); for(int i=1;i<=n;i++) scanf("%lld",&x),a[i]-=x; while(m--) scanf("%lld%lld",&u,&v),Adde(u,v),Adde(v,u); for(int i=1;i<=n;i++){ if(de[i]) continue; tsum=tcnt=0; flg=0; de[i]=1; Dfs(i); tsum=abs(tsum); if(flg) ans+=tsum&1; else ans+=Calc(tsum,tcnt); } printf("%lld",ans); return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现