CF1416E-Split【dp,set】

正题

题目链接:https://www.luogu.com.cn/problem/CF1416E


题目大意

给出nnn个正整数的一个序列aia_iai,你要把aia_iai拆成两个正整数的和b2i,b2i+1b_{2i},b_{2i+1}b2i,b2i+1,要求使得bbb的相同连续段最少。

1≤n≤5×105,1≤ai≤1091\leq n\leq 5\times 10^5,1\leq a_i\leq 10^91n5×105,1ai109


解题思路

考虑求最大的相邻相同数目,先考虑暴力的dpdpdp,设fi,jf_{i,j}fi,j表示分解完aia_iaib2i+1=jb_{2i+1}=jb2i+1=j时的方案,那么有转移方程
fi,j=max⁡{fi−1,k+[k=ai−j]}+[2j=ai]f_{i,j}=\max\{f_{i-1,k}+[k=a_i-j]\}+[2j=a_i]fi,j=max{fi1,k+[k=aij]}+[2j=ai]
而且不难发现对于一个iii来说它的所有fi,jf_{i,j}fi,j在加上[2j=ai][2j=a_i][2j=ai]之前差距不会超过111,而且我们显然只有可能从最大值转移。

对于2j=ai2j=a_i2j=ai的情况很难处理,我们可以先考虑都是奇数的情况。

首先开始都有f1,j=0f_{1,j}=0f1,j=0,可以记为区间[1,a1−1][1,a_{1}-1][1,a11],然后到第二个对于一个最大的jjj,我们可以转移到a2−ja_2-ja2j(如果合法)。同样的我们可以翻转之后得到一个新的最大区间[l,r][l,r][l,r],当某次之后这个区间空了那么因为上面提到的fi,jf_{i,j}fi,j的差距不会超过111,所以最大值不变然后区间变回[1,ai−1][1,a_{i}-1][1,ai1]

之后考虑aia_iai有偶数的情况怎么处理,此时会出现的问题就是:如果ai2\frac{a_i}{2}2ai加之前是最大值,那么加上之后就变为了唯一的最大值,这个很好处理,而如果之前不是最大值,那么加了之后就变为了最大值。

这个时候有可能会在区间之外出现一些单点的最大值,我们可以用setsetset来储存这些位置,至于翻转之后所有的位置xxx都会变为ai−xa_i-xaix,那么可以储存一个xxx表示实际上这个位置的值为x×f+bufx\times f+bufx×f+buf的情况,这样我们就可以快速的翻转然后把不合法的值去掉就好了。

时间复杂度:O(nlog⁡n)O(n\log n)O(nlogn)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<set>
#define ll long long
using namespace std;
const ll N=5e5+10;
ll T,n,ans,l,r,flag,f,buf,a[N];
set<ll> s;
void solve(ll lim){flag=1;if(l<=r){if(lim<=l)l=1,r=0;else l=lim-l,r=lim-min(r,lim-1),swap(l,r),flag=0;}f=f*-1;buf=lim-buf;while(!s.empty()){ll w=(*s.begin())*f+buf;if(w<1||w>=lim)s.erase(s.begin());else break;}while(!s.empty()){ll w=(*(--s.end()))*f+buf;if(w<1||w>=lim)s.erase(--s.end());else break;}return;
}
signed main()
{scanf("%lld",&T);while(T--){s.clear();f=ans=1;buf=flag=0;scanf("%lld",&n);for(ll i=1;i<=n;i++)scanf("%lld",&a[i]);if(a[1]&1)l=1,r=a[1]-1,ans++;else l=r=a[1]/2;for(ll i=2;i<=n;i++){
//			if(s.size())printf("%d\n",*s.begin());if(a[i]&1){solve(a[i]);ans++; if(s.empty()&&flag)l=1,r=a[i]-1,ans++;}else{if(s.find((a[i]/2-buf)*f)!=s.end()||a[i]/2>=l&&a[i]/2<=r)s.clear(),l=r=a[i]/2;else solve(a[i]),s.insert((a[i]/2-buf)*f),ans++;}}printf("%lld\n",ans);}return 0;
}

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

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

相关文章

[选拔赛2 NOIP2018雅礼集训 Day3 u,v,w]玩个三角形(二维差分),玩个球(状压DP+map),玩个树(树上DP)

文章目录T1&#xff1a;玩个三角形titlesolutioncodeT2&#xff1a;玩个球titlesolutioncodeT3&#xff1a;玩个树titlesolutioncodeT1&#xff1a;玩个三角形 title 题目描述 考虑一个 n ∗ n 的矩阵 A&#xff0c;初始所有元素均为 0。 执行 q 次如下形式的操作&#xff…

LOJ:蚂蚁之旅(欧拉回路)

题意描述 给你无向图的NNN个点和MMM条边&#xff0c;保证这 条边都不同且不会存在同一点的自环边&#xff0c;现在问你至少要几笔才能所有边都画一遍。&#xff08;一笔画的时候笔不离开纸&#xff09; 解析 无向图中&#xff0c;若一个图是连通的&#xff0c;且奇数度个数的…

比赛记录

CF1039 2022.10.31 B 随机化概率分析&#xff0c;发现 \(\left(\dfrac{1}{40}\right)^{4000}\) 等于 \(0\)&#xff0c;所以会蒙对一次。C 比较容易分析&#xff0c;发现若 \(c_u\oplus x\notc_v\)&#xff0c;则对这条边没有任何影响&#xff1b;若 \(c_u\oplus xc_v\)&#x…

2019 年起如何开始学习 ABP 框架系列文章-开篇有益

阅读文本大概需要 3.3 分钟。本系列文章推荐阅读地址为&#xff1a;52ABP 开发文档https://www.52abp.com/Wiki/52abp/latest/Welcome-to-52abp本文的目的是为了让刚刚接触 ABP 框架的同学或者准备接触 ABP 框架的同学&#xff0c;能够理解和搞明白 ABP 框架到底是怎么回事&…

【模板】差分约束算法

【模板】差分约束算法 题意&#xff1a; 题解&#xff1a; 模板题 算法讲解 给出一组包含 m 个不等式&#xff0c;有 n 个未知数。求任意一组满足这个不等式组的解&#xff0c;或判定无解。 连边之后跑最短路&#xff0c;保证每个连通块都没有负环即可。 也可以建源点s 0&a…

数论一之定理证明——裴蜀/威尔逊/费马/扩展欧几里得/[扩展]欧拉/[扩展]中国剩余定理,欧拉函数,逆元,剩余系,筛法

打死没想到会在H老师处学懂数论同余&#xff0c;整除模运算埃式筛法欧拉筛法最大公约数和最小公倍数辗转相除法更相减损术裴蜀定理威尔逊定理费马定理同余等价类、剩余系、缩系欧拉函数欧拉定理扩展欧拉定理区间逆元扩展欧几里得中国剩余定理扩展中国剩余定理利用以上所有知识进…

LOJ:相框(欧拉回路、分类讨论)

解析 本题是一道if的板子题 抓住关键&#xff1a;使所有点的度数全变为2 首先对于度数大于2的点&#xff0c;把它分为若干2度点&#xff08;和可能的一个单点&#xff09; 现在我们只剩下单点和二度点了 接下来分来讨论一下 若有多个连通块&#xff0c;我们要把它们变成链再拼…

CF1342F Make It Ascending(状压+求过程-求结果)

CF1342F Make It Ascending 给予一个包含 \(n\) 个元素的数组 \(a\)&#xff0c;你可以进行以下操作&#xff1a; 选择两个不同的元素 \(a_i,a_j\)(\(1 \le i,j \le n\)&#xff0c;\(i \ne j\))将 \(a_j\) 的值加上 \(a_i\)&#xff0c;并移除 \(a\) 中的第 \(i\) 个元素。 求…

AT4437-[AGC028C]Min Cost Cycle【结论,堆】

正题 题目链接:https://www.luogu.com.cn/problem/AT4437 题目大意 有nnn个点的一张有向完全图&#xff0c;每个点有两个点权a,ba,ba,b。连接x,yx,yx,y两个点的边权为min{ax,by}min\{a_x,b_y\}min{ax​,by​}&#xff0c;求一条权值和最小的哈密顿回路。 1≤n≤105,1≤a,b≤1…

某银行大型管理系统端到端持续集成和交付实践

背景传统的银行IT系统研发流程从需求提出到产品交付往往具有较长的研发周期&#xff0c;纵观银行当下面临的市场环境&#xff0c;个人信贷消费升级&#xff0c;资管需求旺盛&#xff0c;普惠金融成为国家战略&#xff0c;来自银行同业和互联网金融的压力扑面而来&#xff0c;谁…

排列组合十一个性质公式及证明,错排数公式及证明

文章目录排列数组合数求组合数常用公式定义式递推式杨辉三角组合数常用性质及证明性质一性质二性质三性质四(二项式定理)性质五性质六性质七性质八性质九性质十性质十一错排数排列数 从nnn个物品中不放回地依次选mmm个物品&#xff0c;考虑顺序&#xff0c;有多少种方案&#…

洛谷P3155:叶子的染色(树形dp)

解析 本题的关键是选取哪一个根对答案没有影响 还有一个重要的性质是&#xff1a;根节点必定涂色 这点对每棵子树作为独立的子问题时依然成立 然鹅我完全没有看到上面那俩性质 直接暴力设计dp状态0.、1、2 开始莽 然后&#xff1f;然后就T了啊… 只好开始考虑换根 然后&#x…

P7011-[CERC2013]Escape【堆,启发式合并】

正题 题目链接:https://www.luogu.com.cn/problem/P7011 题目大意 给出nnn个点的一棵树&#xff0c;从一出发&#xff0c;要走到 ttt。初始时权值为000&#xff0c;每个节点有一个权值wiw_iwi​&#xff0c;第一次走过这个节点时会让权值加上该节点的权值&#xff0c;要求全程…

CF1463F Max Correct Set(取小样法+状压 DP)

CF1463F Max Correct Set 要求选出集合 \(U\{1,2,3,\dots,n\}\) 的一个子集 \(S\)&#xff0c;满足&#xff1a;如果 \(a \in S\) 并且 \(b \in S\)&#xff0c;那么 \(|a-b| \not {x}\) 并且 \(|a-b| \not {y}\)。求集合 \(S\) 大小的最大值。 \(1\le n\le 10^9,1\le x,y\le 2…

引入用于 Azure IoT Edge 的 Visual Studio 工具

物联网开发人员&#xff1a;工具和经验引入用于 Azure IoT Edge 的 Visual Studio 工具今天&#xff0c;我们很高兴地发布用于 Visual Studio 2017 的 Azure IoT Edge 工具的预览版。Azure IoT Edge 是一个全托管服务&#xff0c;通过直接在跨平台物联网设备上部署并运行人工智…

P4878 [USACO05DEC]Layout G

P4878 [USACO05DEC]Layout G 题意&#xff1a; 题解&#xff1a; 这个题其实是差分约束的裸题&#xff0c;但是有几个坑要注意 1.题目说了&#xff0c;奶牛按照编号1…N排列&#xff0c;对于ML个输入&#xff0c;A< B ,所以关系是B - A < 10,而不是A - B <10,我一开…

【学习笔记】原根 / BSGS / 扩展BSGS证明及模板

文章目录原根BSGS大步小步算法扩展BSGS原根 如果两个整数a,ba,ba,b互质&#xff0c;则有aϕ(b)%b1a^{\phi(b)}\%b1aϕ(b)%b1 定义模bbb意义下的aaa的阶为使ad%b1a^d\%b1ad%b1的最小正整数ddd 显然&#xff0c;模bbb的阶d∣ϕ(b)d|\phi(b)d∣ϕ(b) 如果模bbb意义下aaa的阶为…

Loj#3130-「COCI 2018.12」Praktični【线性基】

正题 题目链接:https://loj.ac/p/3130 题目大意 给出nnn个点mmm条边的一张有权无向图&#xff0c;你每次可以选择一个边集异或上一个值&#xff0c;要求最少次数使得所有简单环异或和都为000。 1≤n,m≤1051\leq n,m\leq 10^51≤n,m≤105 解题思路 先找一棵生成树&#xff0…

洛谷P5664:Emiya 家今天的饭(容斥、dp)

解析 应该是比较入门的容斥了 统计方案用总方案数-某列超过1半的方案数 dp设计的一个trick是只统计差值 代码 #include<bits/stdc.h> using namespace std; #define ll long long const int N2050; const double eps1e-6; const int mod998244353; inline ll read(){l…

[ARC098F] Donation(找性质+点 Kruskal 重构树)

[ARC098F] Donation 给出一个 \(N\) 个点 \(M\) 条边的无向连通图&#xff0c;每个点的标号为 \(1\) 到 \(n\)&#xff0c; 且有两个权值 \(A_i,B_i\)。第 \(i\) 条边连接了点 \(u_i\) 和 \(v_i\)。 最开始时你拥有一定数量的钱&#xff0c;并且可以选择这张图上的任意一个点作…