2023NOIP A层联测28 T3 大眼鸹猫
2023NOIP A层联测28 T3 大眼鸹猫
比赛做出来了,但是文抄……
思路
分析每一个
如果求出最小操作次数,然后在此基础上,将上升或下降操作分成多次,减小对答案的贡献即可。
最小操作次数
从后向前考虑,若
如果
执行完上升后,从前向后考虑,此时要上升的
这里可以发现,最多只需要
Ps:独立性对减小贡献有很大帮助。
最小答案
考虑对于
一开始每一个
可以记录一下,如果给
具体实现就是,开一个优先队列,以
注意对于
CODE
#include<bits/stdc++.h>
using namespace std;
#define mod 998244353
#define ll long long
#define S second
#define F first
const int maxn=3e5+5;
int n,m;
int a[maxn],b[maxn],cd[maxn];
ll now[maxn],t[maxn];
priority_queue< pair<ll,int> >que;
ll sqr(ll x){return x*x;}
int main()
{
freopen("attend.in","r",stdin);
freopen("attend.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=1;i<=n;i++) scanf("%d",&b[i]);
for(int i=1;i<=n;i++)
{
cd[i]++;
t[i]=abs(a[i]-b[i]);
if(t[i]==0) {m++,cd[i]=0;continue;}
now[i]=sqr(t[i]);
que.push( make_pair(now[i]-
(sqr((t[i])/(cd[i]+1))*((cd[i]+1)-t[i]%(cd[i]+1))+
sqr(t[i]/(cd[i]+1)+1)*(t[i]%(cd[i]+1))),i) );
}
m-=n;
if(m<0) printf("-1"),exit(0);
while(m&&!que.empty())
{
m--;
pair<ll,int>x=que.top();
if(x.first==0) break;
que.pop();
now[x.S]-=x.F;
cd[x.S]++;
int i=x.S;
que.push( make_pair(now[i]-
(sqr((t[i])/(cd[i]+1))*((cd[i]+1)-t[i]%(cd[i]+1))+
sqr(t[i]/(cd[i]+1)+1)*(t[i]%(cd[i]+1))),i) );
}
ll ans=0;
for(int i=1;i<=n;i++) ans=(ans+now[i])%mod;
printf("%lld",ans);
}
麻麻的,文抄写错哩。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现