Luogu P10843 Turtle and Cycles 题解 [ 蓝 ] [ 差分 ] [ 前缀和 ] [ 贪心 ] [ 数学 ]

news/2024/12/26 0:15:43/文章来源:https://www.cnblogs.com/zhr0102/p/18631685

Turtle and Cycles:修改转化为交换差分数组的 trick 运用。这个 trick 实际上在 NOIp2021 里出过一次了。

转化

首先,\(a_{(i - 1) \bmod n} + a_{(i + 1) \bmod n} - a_i\) 是个很典的形式。设 \(a_{(i - 1) \bmod n}=x,a_i=y,a_{(i + 1) \bmod n}=z\),那么 \(a_i\) 处的原来的差分值为 \(y-x\)\(a_{(i + 1) \bmod n}\) 处的原来的差分值为 \(z-y\)

修改后,\(a_i\) 处的差分值变为 \(x+z-y-x=z-y\)\(a_{(i + 1) \bmod n}\) 处的差分值变为 \(z-(x+z-y)=z-x-z+y=y-x\)。所以对 \(a_i\) 进行修改后相当于把 \(a_i\)\(a_{(i + 1) \bmod n}\) 处的差分值交换了。

\(b_i\) 表示 \(a_i\) 处的差分值。

那么我们要让这个环满足条件,首先就得破环为链。拆成链之后,显然只能有一个地方满足 \(b_i>0,b_{(i + 1) \bmod n}<0\)。于是设 \(b_i>0\) 时为 \(1\),否则为 \(0\),就可以先转化为 \(01\) 串问题来解决。这个 \(01\) 串合法的条件就是满足 \(111\dots000\dots111\) 的形式。

贪心

接下来考虑如何最小化操作次数,不难发现,贪心移动时,对于在中间点左边的 \(1\) 都必须移动到左边来,对于在中间点右边的 \(1\) 都必须移动到右边来。那么如何快速计算这个值呢?

假设我们当前计算的区间为 \([l,r]\)

先考虑左半边的情况,设 \(g_i\) 表示前 \(i\) 个数里的 \(1\) 的下标之和为多少,\(f_i\) 表示前 \(i\) 个数中 \(1\) 的个数。如果先让这些 \(1\) 全都移动到 \(l\) 处,那么答案就是 \(g_{mid}-g_{l-1}-l\times (f_{mid}-f_{l-1})\)

但是实际有些 \(1\) 是不需要完全移动到 \(l\) 处的,它们有些可以移动到 \(l+1,l+2,l+3\) 等位置,这就需要减掉它们的贡献。而这些贡献显然构成一个等差数列,那么只需要求和一下就好了,多算的贡献即为 \(\frac{(f_{mid}-f_{l-1}-1)\times (f_{mid}-f_{l-1})}{2}\)

左半边的答案就是 \(g_{mid}-g_{l-1}-l\times (f_{mid}-f_{l-1})-\frac{(f_{mid}-f_{l-1}-1)\times (f_{mid}-f_{l-1})}{2}\)

右半边同理,就不写了。

时间复杂度 \(O(n)\)

代码

#include <bits/stdc++.h>
#define fi first
#define se second
#define lc (p<<1)
#define rc ((p<<1)|1)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pi;
int t,n,a[400005];
ll g[400005],f[400005],sg[400005];
bitset<400005>b;
ll cal()
{ll ans=0x3f3f3f3f3f3f3f3f;for(ll i=1;i<=n;i++){int mid=i+n/2-1;ll lk=f[mid]-f[i-1];ll lres=g[mid]-g[i-1]-lk*i-(lk-1)*lk/2;ll rk=f[i+n-1]-f[mid];ll rres=sg[mid+1]-sg[i+n]-rk*(2*n-(i+n-1)+1)-(rk-1)*rk/2;ans=min(ans,lres+rres);}return ans;
}
void solve()
{cin>>n;for(int i=1;i<=n;i++){cin>>a[i];a[i+n]=a[i];}for(int i=2;i<=n+1;i++){b[i-1]=(a[i]>a[i-1]);b[i-1+n]=b[i-1];}for(int i=1;i<=2*n;i++){f[i]=f[i-1]+b[i];g[i]=g[i-1]+i*b[i];}sg[2*n+1]=0;for(int j=1,i=2*n;i>=1;i--,j++)sg[i]=sg[i+1]+j*b[i];cout<<cal()<<'\n';
}
int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin>>t;while(t--)solve();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/858944.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

梦幻神器-起-魔犀角之怒-1星

1-该任务需要提前准备5个佛光舍利子或者九转回魂丹,也可以混搭,凑够5个即可。 2-号一般的推荐带5个血供慢慢打,底子好、须弥强的可以带5个须弥速推。 3-前面的战斗比较简单,没有什么技巧 4-在打boss之前,需要我们找小食铁兽。 5-在大唐(60,83)捡起小袋子、(99,54)拾起残存…

Elasticsearch filter context 的使用原理

ES querycache 加速匹配的方法 前言 ES 进行信息检索的时候,boolean 查询组合条件有 must/must_not/should/filter 四个操作。其中 must 和 filter 的用途都是用于过滤必要符合的条件,但是 filter 在查询过程中不算分并且可以进行缓存,这样逻辑简单又可以加速的查询方式经常…

[转]教大家如何选择正确的Google Play服务

前言全局说明来源:https://blog.csdn.net/luo2757227663/article/details/104514864一、说明 1.1 环境: android二、 想必不少刚入坑的小伙伴就经历了各种play服务的问题 而实际上,这些问题大部分来自于未能正确找到play服务的版本 好啦,我们通过这一贴来教大家如何快速找到…

hot100-一刷-12栈(共5道题)

20. 有效的括号 题目链接 题目描述代码实现 分析: 代码: class Solution {public boolean isValid(String s) {int n = s.length();if(n % 2 == 1) return false;Deque<Character> st = new LinkedList<>();for (char c : s.toCharArray()){if(c == () {st.push(…

模型训练中性能指标

在机器学习和深度学习的模型训练过程中,评估模型性能是至关重要的一环。不同的任务和应用场景可能会采用不同的评估指标,常见的包括 准确率(Accuracy)、精确率(Precision)、召回率(Recall)和 均值平均精度(mAP)。本文将介绍这些评估指标的定义、计算方法及其在实际中…

ThreeJs-083D动画系统详解

一.动画原理和应用 three的动画大概就是通过不同时间的关键帧来实现 加载一个手机模型在这个对象里面,注意后期都是直接通过可视化软件Blender编辑好关键帧就能实现动画,这也是个已经编辑好的动画模型,在这个对象里面有一个animations就是动画集,也就是这个物体可以有很多个…

day1——伙伴匹配学习笔记

了解了一些Java8特性lambda语法 (parameters) -> expression (parameters) -> { statements; }相当于是函数的另一种写法,更优雅。stream()用法以及和parallelStream()的一些对比 详见博客 java8新特性-流-stream()和parallelStream() 求求你们了,别再乱用 parallelStr…

如何获取局域网内所有IP

cmd命令: ipconfig/ALL 这时会在cmd命令窗口看见自己电脑的IP地址,记下来cmd命令窗口输入 for /L %i IN (1,1,254) DO ping -w 2 -n 1 192.168.0.%i (注意:我这里的192.168.0.*是根据自己电脑的ip网段来填写的) 待几分钟后 命令处理完成,然后在cmd命令窗口输入 arp -a第七步…

对话 Project Astra 研究主管:打造通用 AI 助理,主动视频交互和全双工对话是未来重点

Project Astra 愿景之一:「系统不仅能在你说话时做出回应,还能在持续的过程中帮助你。」近期,Google DeepMind 的 YouTube 频道采访了 Google DeepMind 研究主管格雷格韦恩 (Greg Wayne)。格雷格韦恩的研究工作为 DeepMind 的诸多突破性成果做出了重要贡献,涵盖强化学习、神…

3 三角翼

3 三角翼 概念 在很大程度上,基于二维流动和高展弦比无后掠三维翼型流动的证据,流动分离一直被视为应不惜一切代价避免的现象。 然而,人们发现,高速飞行所需的低展弦比、高度后掠的机翼,尽管其上表面已经发生了分离流动,但随着迎角的增加,升力也会增加。 剪切层由机翼跨…