正题

题目链接: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^91≤n≤5×105,1≤ai​≤109


解题思路

考虑求最大的相邻相同数目,先考虑暴力的dpdpdp,设fi,jf_{i,j}fi,j​表示分解完aia_iai​且b2i+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{fi−1,k​+[k=ai​−j]}+[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,a1​−1],然后到第二个对于一个最大的jjj,我们可以转移到a2−ja_2-ja2​−j(如果合法)。同样的我们可以翻转之后得到一个新的最大区间[l,r][l,r][l,r],当某次之后这个区间空了那么因为上面提到的fi,jf_{i,j}fi,j​的差距不会超过111,所以最大值不变然后区间变回[1,ai−1][1,a_{i}-1][1,ai​−1]。

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

这个时候有可能会在区间之外出现一些单点的最大值,我们可以用setsetset来储存这些位置,至于翻转之后所有的位置xxx都会变为ai−xa_i-xai​−x,那么可以储存一个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;
}

CF1416E-Split【dp,set】相关推荐

  1. 【DP练习】月饼盒(提高版)(vijos1255)

    [DP练习]月饼盒(提高版) 测试链接:https://vijos.org/p/1255 [题目背景]:中秋节了,CCC老师决定去送礼.  [问题描述]:一个被分为 n*m 个格子的月饼盒,第 i 行 ...

  2. 【dp专题】在经历了时空扭曲后的总结

    在很久很久很久以后,我终于又回到了coder的舞台. 那么我们来水一发dp吧! 好懒啊不想动 字符染色 [原题]BZOJ 2958 题目描述 给出一个长度为N由B.W.X三种字符组成的字符串S,你需要 ...

  3. 【dp动态规划】飙车

    [问题描述] [说明]此题中出现的所有数字均为整数 [背景]有天SubRaY发现宇宙新秀在玩一个游戏叫Need For Speed(什么?连大名鼎鼎的极品飞车都没听说过..),他发现宇宙新秀总是逆行, ...

  4. 愤怒的小鸟【$DP$优化】

    卡常的状压\(DP\),愤怒的小鸟. 其实本来是个很水的状压\(DP\),但因为最后三个点\(n=18\),成功地把我的不可能达到的下界为\(\Omega(2^nn^2)\),紧确的上界为\(O(2^ ...

  5. 【DP优化】【P1430】序列取数

    传送门 Description 给定一个长为n的整数序列,由A和B轮流取数(A先取).每个人可从序列的左端或右端取若干个数(至少一个),但不能两端都取.所有数都被取走后,两人分别统计所取数的和作为各自 ...

  6. 【dp 贪心】bzoj4391: [Usaco2015 dec]High Card Low Card

    巧妙的贪心 Description Bessie the cow is a huge fan of card games, which is quite surprising, given her l ...

  7. CF573E-Bear and Bowling【dp,平衡树】

    正题 题目链接:https://www.luogu.com.cn/problem/CF573E 题目大意 给出一个长度为nnn的序列aaa,求它的一个子序列bbb,要求最大化 ∑i=1∣b∣bi×i\ ...

  8. 【2018.3.24】模拟赛之五-ssl1864 得分【dp,贪心】

    正题 链接(需要jzoj账号) 大意 有n道题,有不同的价值和需要的时间,在剩余x分钟做并且可以做完的话就可以获得 价值*x的价值. 大意 用贪心+Dp,然后就好了.贪心就是用价值除以时间,然后排序. ...

  9. 【DP + 卖股票】LeetCode 188. Best Time to Buy and Sell Stock IV

    LeetCode 188. Best Time to Buy and Sell Stock IV Solution1:我的答案 参考链接:http://www.cnblogs.com/grandyan ...

最新文章

  1. Redis模式匹配删除key
  2. Spring Data Solr教程:分页
  3. 猴子选大王 (20 分)
  4. 【计算机二级基础知识笔记】【C+Python】
  5. [随感]GIS开发的困惑
  6. iOS中将后台JSON数据转化为模型的总结
  7. html5中布局命名,HTML5 发展中的命名约定和微格式
  8. paip.读取WEB.XML中的参数值总结
  9. MATLAB学习与使用:矩阵的运算
  10. linux系统USB转网卡驱动异常,usb 网卡驱动安装问题(芯片AX88772B)
  11. Redis 下载安装教程 及 客户端可视化工具
  12. python xlsxwriter生成图片保存_Python Excel操作模块XlsxWriter之插入图片worksheet.insert_image()...
  13. Vue高仿网易云音乐APP (vue.js 移动端)
  14. 生活随记 - 2020国庆第二天
  15. 从突变到新抗原:肿瘤与免疫系统之间的一场豪赌!
  16. mac连接android手机存储,Android安卓设备连接Mac的方法
  17. android立体3D效果_3D立体画手绘墙体彩绘
  18. Vscode 打开终端窗口
  19. Zookeeper、Curator
  20. 判断电路是正反馈还是负反馈,电流反馈还是电压反馈

热门文章

  1. 中科大计算机博士毕业条件,中国科技大学博士和硕士研究生毕业要求.doc
  2. php七牛分片上传_利用七牛的php SDK分片上传时如何处理Notify?
  3. Java开发面试高频考点学习笔记(每日更新)
  4. gif分解工具_Python之GIF图倒放,沙雕快乐源泉
  5. 计算机网络:如何传输一条数据(详解)
  6. 7-37 模拟EXCEL排序 (25 分)(思路+详解+超时解决 兄弟们冲呀呀呀呀呀呀)
  7. [C++11]使用using和typedef给模板定义别名
  8. LeetCode 1669合并两个链表-中等
  9. 《C++ Primer》7.5.2节练习
  10. C++string容器-赋值操作