hollow
hollow
给你一个由 \(n\) 段若干个 \(0\) 或 \(1\) 组成的序列,每次可以选择一段区间翻转,每次操作后问最长不下降子序列长度。
显然地,我们可以把连续的相同数字看成一个带权的整体。
最长不下降子序列(以下用 LIS 来表示)可以枚举分割点,前面都是 \(0\),后面都是 \(1\)。
对于分割点 \(x\),它的价值为前面 \(0\) 的数量加后面 \(1\) 的数量,即 \(cnt_{0,x}+(cnt_{1,n}-cnt_{1,x})\)。因为 \(cnt_{1,n}\) 是固定的,我们只需要求最大的 \(cnt_{0,x}-cnt_{1,x}\)。这相当于把 \(0\) 看成 \(1\),把 \(1\) 看成 \(-1\),\(s_x\) 表示前缀和,找出最大的 \(s_x\)。
对于一次翻转 \([l,r]\),相当于 \(s_{1\sim l-1}\) 和 \(s_{r+1 \sim n}\) 不变,\(s_{x,x\in [l,r]}\) 变成 \(s_{[1,l-1]}+s_{[x+1,r]}\)。因为我们可以翻转任意一个区间,因此求 \(\max s'_x\) 就相当于求至多 \(2\) 个不交的区间(必须包含一个左端点为 \(1\) 的区间,当然这个区间的右端点可以为 \(0\))和的最大值。而翻转 \(k\) 次就相当于求至多 \(k+1\) 个不交的区间和的最大值。可以 DP 求解。\(dp_{i,j}\) 表示枚举到第 \(i\) 块,已经用了 \(j\) 个区间的最大和,转移分第 \(i\) 块是否选择,如果选择需要枚举第 \(i\) 块和前面的几块成为一个区间,时间复杂度 \(O(n^3)\)。
考虑怎么优化选择 \(k\) 个不交的区间的最大和这件事。显然,每次贪心选取最大的区间肯定是假的。考虑反悔贪心。每次找到和最大的区间,把它加上,然后把它的值全部取反,这样下次再选到它的时候就相当于把它的一部分取消选择了。可以用线段树维护最大子区间,取反操作。时间复杂度是 \(O(n\log n)\) 的。所以就是一开始先选出一个左端点为 \(1\) 的最大区间,然后后面 \(n\) 次每次选一个最大子区间(可以选空区间,即不选),计入答案并对它取反即可。
震惊!有人写了 16 个信息的线段树!荣获倒数第 3 短解和第 2 快解!
#include<bits/stdc++.h>
//#define int ll
//#define LOCAL
#define sf scanf
#define pf printf
#define rep(x,y,z) for(int x=y;x<=z;x++)
#define per(x,y,z) for(int x=y;x>=z;x--)
#define ls u<<1
#define rs u<<1|1
#define mid ((l+r)>>1)
using namespace std;
typedef long long ll;
const int N=2e5+7;
int n;
ll x[N],y[N];
int cnt;
struct pi{
ll val,pos;
void _max(ll sum,pi lx,pi rx){
if(lx.val>=sum+rx.val) val=lx.val,pos=lx.pos;
else val=sum+rx.val,pos=rx.pos;
}
void _min(ll sum,pi lx,pi rx){
if(lx.val<=sum+rx.val) val=lx.val,pos=lx.pos;
else val=sum+rx.val,pos=rx.pos;
}
};
struct pi2{
ll val,pl,pr;
void _max(pi2 lx,pi2 rx,pi lxx,pi rxx){
if(lx.val>=rx.val&&lx.val>=lxx.val+rxx.val) val=lx.val,pl=lx.pl,pr=lx.pr;
else if(rx.val>=lx.val&&rx.val>=lxx.val+rxx.val) val=rx.val,pl=rx.pl,pr=rx.pr;
else val=lxx.val+rxx.val,pl=lxx.pos,pr=rxx.pos;
}
void _min(pi2 lx,pi2 rx,pi lxx,pi rxx){
if(lx.val<=rx.val&&lx.val<=lxx.val+rxx.val) val=lx.val,pl=lx.pl,pr=lx.pr;
else if(rx.val<=lx.val&&rx.val<=lxx.val+rxx.val) val=rx.val,pl=rx.pl,pr=rx.pr;
else val=lxx.val+rxx.val,pl=lxx.pos,pr=rxx.pos;
}
};
struct node{
pi lmx,rmx,lmn,rmn;
pi2 mx,mn;
ll sum,tag;
void change(){
lmx.val*=-1,rmx.val*=-1,lmn.val*=-1,rmn.val*=-1;
mx.val*=-1,mn.val*=-1;
sum*=-1,tag*=-1;
}
};
struct seg{
node tr[N<<2];
void pushup(int u){
tr[u].lmx._max(tr[ls].sum,tr[ls].lmx,tr[rs].lmx);
tr[u].rmx._max(tr[rs].sum,tr[rs].rmx,tr[ls].rmx);
tr[u].mx._max(tr[ls].mx,tr[rs].mx,tr[ls].rmx,tr[rs].lmx);
tr[u].lmn._min(tr[ls].sum,tr[ls].lmn,tr[rs].lmn);
tr[u].rmn._min(tr[rs].sum,tr[rs].rmn,tr[ls].rmn);
tr[u].mn._min(tr[ls].mn,tr[rs].mn,tr[ls].rmn,tr[rs].lmn);
tr[u].sum=tr[ls].sum+tr[rs].sum;
}
void build(int u,int l,int r){
tr[u].tag=1;
if(l==r) {
ll a=max(0ll,y[l]);
ll b=min(0ll,y[l]);
tr[u]={{a,a?r:r-1},{a,a?l:l+1},{b,b?r:r-1},{b,b?l:l+1},{a,l,a?r:r-1},{b,l,b?r:r-1},y[l],1};
return;
}
build(ls,l,mid);
build(rs,mid+1,r);
pushup(u);
}
void maketag(int u){
// pf("maketag %d\n",u);
tr[u]={tr[u].lmn,tr[u].rmn,tr[u].lmx,tr[u].rmx,tr[u].mn,tr[u].mx,tr[u].sum,tr[u].tag};
tr[u].change();
}
void pushdown(int u){
// pf("pushdown(%d),%lld\n",u,tr[u].tag);
if(tr[u].tag==1) return ;
maketag(ls),maketag(rs);
tr[u].tag=1;
}
void change(int u,int l,int r,int L,int R){
// pf("change(%d)\n",u);
if(R<L) return;
if(l>=L&&r<=R){
maketag(u);
return;
}
pushdown(u);
if(mid>=L) change(ls,l,mid,L,R);
if(mid+1<=R) change(rs,mid+1,r,L,R);
pushup(u);
}
ll ask(){
ll ans=tr[1].mx.val;
// pf("%lld change %lld %lld\n",ans,tr[1].mx.pl,tr[1].mx.pr);
change(1,1,cnt,tr[1].mx.pl,tr[1].mx.pr);
return ans;
}
}T;
ll ans;
signed main(){
#ifdef LOCAL
freopen("3.in","r",stdin);
freopen("my.out","w",stdout);
#else
freopen("hollow.in","r",stdin);
freopen("hollow.out","w",stdout);
#endif
sf("%d",&n);
x[0]=-1;
rep(i,1,n) {
cnt++;
sf("%lld%lld",&x[cnt],&y[cnt]);
if(x[cnt]==1) ans+=y[cnt];
if(x[cnt]==x[cnt-1]) {
y[cnt-1]+=y[cnt];
cnt--;
}
}
rep(i,1,cnt) y[i]*=(x[i]==0?1:-1);
T.build(1,1,cnt);
// rep(i,1,9) pf("%lld ",T.tr[i].mx.val);pf("\n");
// rep(i,1,9) pf("%lld ",T.tr[i].mn.val);pf("\n");
ans+=T.tr[1].lmx.val;
pf("%lld\n",ans);
// pf("pos %lld\n",T.tr[1].lmx.pos);
T.change(1,1,cnt,1,T.tr[1].lmx.pos);
rep(i,1,n) {
// rep(j,1,9) pf("%lld ",T.tr[j].mx.val);pf("\n");
// rep(j,1,9) pf("%lld ",T.tr[j].mn.val);pf("\n");
ans+=T.ask();
pf("%lld\n",ans);
}
}
hollow的更多相关文章
- NetflixOSS:Hollow正式发布
http://www.infoq.com/cn/articles/netflixoss-hollow-officially-released "如果你能 非常有效地 缓存 一切 ,那么通 ...
- esp32编程第一例 hollow word
#include<stdio.h>#include"freertos/FreeRtos.h"#include"freertos/task.h"#in ...
- 基于 HTML5 的 Web SCADA 报表
背景 最近在一个 SCADA 项目中遇到了在 Web 页面中展示设备报表的需求.一个完整的报表,一般包含了筛选操作区.表格.Chart.展板等多种元素,而其中的数据表格是最常用的控件.在以往的工业项目 ...
- 时隔一年再读到the star
The Star Arthur C. Clarke It is three thousand light-years to the Vatican. Once, I believed that spa ...
- ichart.js绘制虚线 ,平均分虚线
var Data=new Array(); Data[0] = { labels : ["第一单元","第二单元","第三单元"," ...
- CentOS 6.7 中安装Emacs 24.5
Emacs 版本:http://mirror.bjtu.edu.cn/gnu/emacs/emacs-24.5.tar.gz CentOS 内核版本:2.6.32-573.el6.x86_64 参考资 ...
- 这些HTML、CSS知识点,面试和平时开发都需要 No5-No7
系列知识点汇总 这些HTML.CSS知识点,面试和平时开发都需要 No1-No4(知识点:HTML.CSS.盒子模型.内容布局) 这些HTML.CSS知识点,面试和平时开发都需要 No5-No7(知识 ...
- 孙鑫MFC学习笔记11:保存图像
1.CPtrArray指针数组 2.CPtrArray返回void指针,需要做类型转换 3.View类中的OnPaint调用OnPrepareDC和OnDraw,如果覆盖OnPaint,就不会调用On ...
- POJ3636Nested Dolls[DP LIS]
Nested Dolls Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8323 Accepted: 2262 Desc ...
- open-flash-chart2
链接 http://www.oschina.net/news/10797/Open-Flash-Chart-2-0 open-flash-chart.rar http://123-reg-suspen ...
随机推荐
- LInux main.cpp 编码问题 导致影响后面的内容
euc-cn linux 的vim 可以查看和设置编码 :set fileencoding euc-cn 表示的是 gbk编码 1.在Vim中直接进行转换文件编码,比如将一个文件转换成utf-8格式 ...
- Scrcpy Shortcuts
Actions can be performed on the scrcpy window using keyboard and mouse shortcuts. In the following l ...
- ICEE-Microchip-MPLAB® X IDE-Microchip-MPLAB-Harmony extension + MHC(**Harmony Configurator)
Microchip-MPLAB-Harmony: Developer Sources: https://microchipdeveloper.com/xwiki/bin/view/software-t ...
- SciTech-BigDataAIML-CV+CG-Digital Image Processing-编辑与合成RGBA图片与视频:RGB图片转换成RGBA:增加Alpha Mask(透明遮罩, 即Alpha Channel透明度通道)
层层堆叠RGBA图片层就可实时修改图片与视频流 用AI自动生成RGBA格式的PNG图片:一层层堆叠. 这也是Adobe Photoshop的Mask原理? https://learnopencv.co ...
- 自定义.sh 文件在linux 中开机自启设置-九五小庞
有时候呢我们需要在centos系统启动的时候运行程序,这样保证一些服务就没有中断,相信你理解是什么意思.其实方法很简单呐,就是把需要运行的程序放在/etc/rc.d/rc.local里面就可以启动了除 ...
- c# ACME client
ACME 协议是一种开放标准,旨在实现数字证书颁发和续订流程的自动化,它彻底改变了证书管理.ACME 的开发旨在简化整个流程,已被许多证书颁发机构 (CA) 广泛采用,并已成为互联网标准 (RFC 8 ...
- 基于vLLM与AWS Trainium的冷启动推荐优化
冷启动问题的本质 推荐系统中的冷启动不仅涉及新用户或新物品问题,更核心的是系统初始化阶段完全缺乏个性化信号.当新用户首次访问或新内容上线时,由于缺乏行为历史数据,系统只能提供泛化推荐,导致点击率和转化 ...
- 2025年:是时候重新认识System.Text.Json了
曾几何时,在.NET的世界里,Newtonsoft.Json如同一位德高望重的王者,无人不晓.直到有一天,一位名叫System.Text.Json(后文简称STJ)的新贵悄然登场.它出身名门(.NET ...
- 【转】-Java并发之CyclicBarrier
Java并发之CyclicBarrier 该博客转载自巴蜀码哥 ** 的Java并发之CyclicBarrier** barrier(屏障)与互斥量.读写锁.自旋锁不同,它不是用来保护临界区 ...
- 解密prompt系列58. MCP - 工具演变 & MCP基础
作为结构化推理的坚定支持者,我一度对MCP感到困惑:Agent和工具调用的概念早已普及,为何还需要MCP这样的额外设计呢?本文就来深入探讨MCP,看看它究竟解决了什么问题. 我们将分几章解析MCP:本 ...