loj#6518-「雅礼集训 2018 Day11」序列【整体二分,dp,线段树】

正题

题目链接:https://loj.ac/p/6518


题目大意

一个长度为nnn的序列aaa,你可以花费111的代价让一个数+1+1+1或者−1-11,给出mmm个限制形如第kkk个数要是区间[l,r][l,r][l,r]的最大/最小值。

求满足所有限制的最小代价

1≤n≤5000,1≤ai≤1051\leq n\leq 5000,1\leq a_i\leq 10^51n5000,1ai105


解题思路

一个保序回归问题,我们考虑整体二分。

二分到midmidmid时,我们就只考虑每个数选为midmidmid还是mid+1mid+1mid+1,选为midmidmid的最终≤mid\leq midmid,选为mid+1mid+1mid+1的最终>mid> mid>mid

然后是怎么处理一个midmidmid,考虑使用dpdpdp,用000表示midmidmid111表示mid+1mid+1mid+1,那么序列就会被分成很多010101交错的段,设fi,0/1f_{i,0/1}fi,0/1表示上一段的结尾是iii,且是0/10/10/1段。

然后考虑怎么转移,我们将一个条件[type,l,r,k][type,l,r,k][type,l,r,k]分为[type,l,k,k][type,l,k,k][type,l,k,k][type,k,r,k][type,k,r,k][type,k,r,k],然后用线段树维护权值。

对于形如[type,l,k,k][type,l,k,k][type,l,k,k]的条件,这里设type=1type=1type=1,那在我们取000段时如果包括了kkk那么必须包括整个[l,k][l,k][l,k],也就是左端点的选择不能为(l,k](l,k](l,k],我们可以视为在线段树上去掉一段可选区间。

对于形如[type,k,r,k][type,k,r,k][type,k,r,k]的条件,同样设type=1type=1type=1,那我们在取000段时如果包括了kkk那么必须包括整个[k,r][k,r][k,r],也就是如果i∈[k,r]i\in[k,r]i[k,r],那么我们上一个转移点jjj的选择必须有j>kj>kj>k,可以用单调栈来维护这些限制。

需要注意的点就是线段树的清空需要只清空修改过的点,否则会错。

时间复杂度:O(alog⁡alog⁡n)O(a\log a\log n)O(alogalogn)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stack>
#define ll long long
using namespace std;
const ll N=5100,M=N<<2,inf=1e9;
ll n,m,a[N],ans,lim[2][N],rim[2][N];
ll p[N],p0[N],p1[N],f[2][N],g[2][N];
stack<ll> d0,d1;
struct SegTree{ll cl[M],p[M],w[M],lazy[M];ll ans,ansp,clt;bool v[M];void Add(ll x){if(!v[x])v[x]=1,cl[++clt]=x;return;}void Downdata(ll x){Add(x);if(!lazy[x])return;Add(x*2);Add(x*2+1);lazy[x*2]+=lazy[x];w[x*2]+=lazy[x];lazy[x*2+1]+=lazy[x];w[x*2+1]+=lazy[x];lazy[x]=0;return;}void Merge(ll x){if(w[x*2]<w[x*2+1])w[x]=w[x*2],p[x]=p[x*2];else w[x]=w[x*2+1],p[x]=p[x*2+1];return;}void Change(ll x,ll L,ll R,ll l,ll r,ll val){if(L==l&&R==r){Add(x);lazy[x]+=val;w[x]+=val;return;}ll mid=(L+R)>>1;Downdata(x);if(r<=mid)Change(x*2,L,mid,l,r,val);else if(l>mid)Change(x*2+1,mid+1,R,l,r,val);else Change(x*2,L,mid,l,mid,val),Change(x*2+1,mid+1,R,mid+1,r,val);Merge(x);return;}void Ins(ll x,ll L,ll R,ll pos,ll val,ll pr){if(L==R){Add(x);if(w[x]>val)w[x]=val,p[x]=pr;return;}ll mid=(L+R)>>1;Downdata(x);if(pos<=mid)Ins(x*2,L,mid,pos,val,pr);else Ins(x*2+1,mid+1,R,pos,val,pr);Merge(x);return;}void Query(ll x,ll L,ll R,ll l,ll r){if(L==l&&R==r){if(w[x]<ans)ans=w[x],ansp=p[x];return;}ll mid=(L+R)>>1;Downdata(x);if(r<=mid)Query(x*2,L,mid,l,r);else if(l>mid)Query(x*2+1,mid+1,R,l,r);else Query(x*2,L,mid,l,mid),Query(x*2+1,mid+1,R,mid+1,r);}void Ask(ll l,ll r){ans=inf;Query(1,1,n,l,r);return;}void Clear(){for(ll i=1;i<=clt;i++){w[cl[i]]=inf;v[cl[i]]=lazy[cl[i]]=0;}clt=0;return;}
}T0,T1;
void solve(ll l,ll r,ll L,ll R){if(l>r)return;if(L==R){for(ll i=l;i<=r;i++)ans+=abs(a[p[i]]-L);return;}T0.Clear();T1.Clear();while(!d0.empty())d0.pop();d0.push(0);while(!d1.empty())d1.pop();d1.push(0);T0.Ins(1,1,n,1,0,0);T1.Ins(1,1,n,1,0,0);ll mid=(L+R)>>1;for(ll i=l;i<=r;i++){f[0][i]=f[1][i]=inf;if(i>l&&lim[0][p[i]]<p[i])T0.Change(1,1,n,lim[0][p[i]]+1,p[i],inf);if(i>l&&lim[1][p[i]]<p[i])T1.Change(1,1,n,lim[1][p[i]]+1,p[i],inf);T1.Change(1,1,n,1,p[i],abs(mid-a[p[i]]));T0.Change(1,1,n,1,p[i],abs(mid+1-a[p[i]]));while(!d0.empty()&&rim[0][d0.top()]<=rim[0][p[i]])d0.pop();while(!d1.empty()&&rim[1][d1.top()]<=rim[1][p[i]])d1.pop();if(i<r){while(!d0.empty()&&rim[0][d0.top()]<p[i+1])d0.pop();while(!d1.empty()&&rim[1][d1.top()]<p[i+1])d1.pop();if(rim[0][p[i]]>=p[i+1])d0.push(p[i]);if(rim[1][p[i]]>=p[i+1])d1.push(p[i]);}else{while(d0.size()>1)d0.pop();while(d1.size()>1)d1.pop();}if(d1.top()<p[i]){T1.Ask(d1.top()+1,p[i]);f[0][i]=T1.ans;g[0][i]=T1.ansp;}if(d0.top()<p[i]){T0.Ask(d0.top()+1,p[i]);f[1][i]=T0.ans;g[1][i]=T0.ansp;}if(i<r){T0.Ins(1,1,n,p[i]+1,f[0][i],i);T1.Ins(1,1,n,p[i]+1,f[1][i],i);}}ll t0=0,t1=0,i=r,k=(f[0][r]<f[1][r])?0:1;while(i){for(ll j=i;j>max(g[k][i],l-1);j--)if(k)p1[++t1]=p[j];else p0[++t0]=p[j];i=g[k][i];k^=1;}for(ll i=1;i<=t0;i++)p[l+i-1]=p0[t0-i+1];for(ll i=1;i<=t1;i++)p[l+t0+i-1]=p1[t1-i+1];solve(l,l+t0-1,L,mid);solve(l+t0,r,mid+1,R);return;
}
signed main()
{freopen("hack.in","r",stdin);scanf("%lld%lld",&n,&m);rim[0][0]=rim[1][0]=inf;for(ll i=1;i<=n;i++)scanf("%lld",&a[i]);memset(lim,0x3f,sizeof(lim));for(ll i=1,t,l,r,k;i<=m;i++){scanf("%lld%lld%lld%lld",&t,&l,&r,&k);lim[t][k]=min(lim[t][k],l);rim[t][k]=max(rim[t][k],r);}for(ll i=1;i<=n;i++)p[i]=i;memset(T0.w,0x3f,sizeof(T0.w));memset(T1.w,0x3f,sizeof(T1.w));solve(1,n,1,1e5);printf("%lld\n",ans);return 0;
}

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

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

相关文章

一二三系列之状压DP——Max Correct Set(一)Neko Rules the Catniverse (Large Version)(二)Make It Ascending(三)

文章目录一&#xff1a;CF1463F二&#xff1a;CF1152F2三&#xff1a;CF1342F一&#xff1a;CF1463F Max Correct Set 有一个结论&#xff1a;以xyxyxy为周期排列填充一定是不劣于最后的答案的 令pxy,rn%ppxy,rn\%ppxy,rn%p ⌊np⌋\lfloor\frac{n}{p}\rfloor⌊pn​⌋出现次数为…

C - Log Calculator FZU - 2036

C - Log Calculator FZU - 2036 题意&#xff1a; 已知a和b&#xff0c;满足alog2x&#xff0c;blog2y 求log2(xy) 题解&#xff1a; 因为alog2x&#xff0c;blog2y 所以x2a, yab log2(xy)log2(2a2b)log2(2b(12a-b))blog2(2a-b1) x>32时&#xff0c;blog2(2x1)xb 代码&…

实用帖 | 使用Visual Studio开发.NET Core推荐设置

Visual Studio 一直是.NET程序员的好伙伴&#xff0c;如今虽然.NET Core的开发可以用VSCode等其他环境&#xff0c;但VS依旧有强大的优势。今天来介绍下如何让VS用得更顺手的技能Here We Go!⛷基本配置首先要搞清楚的一点是&#xff0c;并不是所有版本的Visual Studio都支持.NE…

CF1654F-Minimal String Xoration【倍增】

正题 题目链接:https://www.luogu.com.cn/problem/CF1654F 题目大意 给出一个长度为2n2^n2n的字符串sss&#xff08;下标为0∼2n−10\sim 2^n-10∼2n−1&#xff09; 你要找到一个xxx满足tisixorxt_{i}s_{i\ xor\ x}ti​si xor x​&#xff0c;并且ttt的字典序最小。 1≤n≤…

P3642 [APIO2016]烟火表演(左偏树、函数)

解析 感觉是左偏树的神题了. 首先有一个比较显然的结论&#xff0c;一个合法的方案中&#xff0c;两个叶子到它们 lca\text{lca}lca 的距离必须相等. 考虑设计 dp\text{dp}dp &#xff1a; fi,xf_{i,x}fi,x​ 表示 iii 的子树中&#xff0c;所有叶子到它的距离为 xxx 的最小…

2011年全国大学生程序设计邀请赛(福州)

题号题目考点难度APassword table模拟签到BAxial symmetry计算几何代码题CLog Calculatorjava大数DMaximum Value Problem思维题EAnother Postman Problem思维题FPets二分图匹配模板题GTilingHChecker思维题角度很妙&#xff0c;值得多练练IThe Mad MathematicianJSocial Netwo…

概率与期望游戏地图

文章目录前言拾得宝典的玄灵大陆P2911P4316P6154P1297P6862参悟升级的三千界P1365P1850[CF]Crypto Lights打野刷野怪副本[AT-abc215G]Colorful Candies 2前言 其实从去年开始初次接触概率期望后&#xff0c;后面的考试几乎场场见到&#xff1b;而每次都只能敲最原始的暴力&…

.NET Core IdentityServer4实战 第一章-入门与API添加客户端凭据

内容&#xff1a;本文带大家使用IdentityServer4进行对API授权保护的基本策略作者&#xff1a;zara(张子浩) 欢迎分享&#xff0c;但需在文章鲜明处留下原文地址。本文将要讲述如何使用IdentityServer4对API授权保护以及如何携带Token进行访问受保护的API&#xff0c;通过HttpC…

Loj#3077-「2019 集训队互测 Day 4」绝目编诗【结论,虚树,鸽笼原理】

正题 题目链接:https://loj.ac/p/3077 题目大意 给出nnn个点mmm条边的一张简单无向图&#xff0c;求是否存在两个长度相等的简单环。 1≤n≤104,1≤m≤1061\leq n\leq 10^4,1\leq m\leq 10^61≤n≤104,1≤m≤106 解题思路 先考虑一个暴力的做法&#xff0c;我们暴力搜索图上…

蒋金楠:200行代码7个对象《ASP.NET Core框架揭密》苏州.NET俱乐部课程分享

【课程名称】《ASP.NET Core框架揭密》【老师介绍】蒋金楠&#xff0c;同程艺龙机票事业部技术专家&#xff0c;微软最有价值专家&#xff08;MVP&#xff0c;连续12&#xff09;&#xff0c;多本.NET专著作者。博客园Artech&#xff0c;公众号“大内老A”。【课程简介】讲述AS…

CF1137C:Museums Tour(缩点、分层图)

解析 比起CF&#xff0c;更像是主题库的一道题 也是很好的一道题 由于可以在环里转圈&#xff0c;容易想到缩点 但是出现了一个问题&#xff1a;缩点是无法统计一个强连通分量里有哪些环及其大小的 而本题中显然环的大小和d的关系至关重要 考虑转换思路 把每个城市x割成d个点…

H - Checker FZU - 2041

H - Checker FZU - 2041 题意&#xff1a; 一个长度为n的01串&#xff0c;现在能将里面的1移动m次&#xff0c;问最长的连续0是多长 题解&#xff1a; 没想出来&#xff0c;看了其他人代码&#xff0c;就是对于每个0空间进行扩充&#xff0c;然后记录每次扩充的最大值 关键…

2021-4-1 多校省选模拟赛

文章目录考试复盘nmd考试复盘 T1T1T1 我可太喜欢这种不要脑子的莽试题了&#xff01;&#xff01; 考场上猜的结论d>3d>3d>3无解 d1,d2d1,d2d1,d2的填法也试出来了 d3d3d3只试出来了n,mn,mn,m是333的倍数的填法 但是另外的情况就GGGGGG了 最后交上去竟然还敲挂了(…

CF838C-Future Failure【dp,子集卷积】

正题 题目链接:https://www.luogu.com.cn/problem/CF838C 题目大意 一个字符串sss&#xff0c;两个人轮流操作&#xff0c;每次每个人可以选择删掉一个字符或者重排列这个字符串&#xff0c;但是不能出现之前出现过的字符串&#xff0c;不能操作者输。 求有多少个长度为nnn且…

Reactive Extensions 相见恨晚的Rx.Net

何为Reactive Extensions&#xff08;Rx&#xff09;Rx是一个遵循函数式编程的类库&#xff0c;它引用观察者以及迭代器设计模式对可观察对象产生的数据进行异步消费。使用Rx&#xff0c;开发人员将使用LINQ运算符操作异步数据流&#xff0c;并使用调度程序参数化异步数据流中的…

CF819E:Mister B and Flight to the Moon(构造、归纳法)

解析 本题也算看了一半题解吧 看到“数学归纳法”退出来自己推的 这题想到归纳法后面也就简单了 首先&#xff0c;n3和n4的时候显然有解&#xff0c;可以打表 然后考虑在获得n-2的答案时&#xff0c;如何获得n的答案 如果n为奇数&#xff0c;我们可以把(1,n-1,2,n)、(3,n-1,4…

AcWing 1303. 斐波那契前 n 项和

AcWing 1303. 斐波那契前 n 项和 题意: 题解&#xff1a; 这个题解分析的太到位了 代码&#xff1a; #include<iostream> #include<cstring>#define ll long longusing namespace std;const int N3;int n,m; ll f1[N][N]{{1,1,1}}; ll A[N][N]{{0,1,0},{1,1,1…

2021-4-4 省选模拟赛(灯,十字路口,密室逃脱)

文章目录考试复盘A&#xff1a;灯(light)B&#xff1a;十字路口(crossing)C&#xff1a;密室逃脱(escape)考试复盘 第一题分块虽然明显&#xff0c;但是说实话自己没怎么做过分块的题 就不会做大块的处理。。。(;_) 今天听H老说分块可以成替代数据结构的骗分暴力对拍神器 这么…

AGC056E-Cheese【dp】

前言 奶酪可能会长腿&#xff0c;但绝对不会变质 _ _&#xff0c;_ _ _ _ _ _ _ 正题 题目链接:https://atcoder.jp/contests/agc056/tasks/agc056_e 题目大意 有一个长度为nnn的环&#xff0c;第i0.5(0≤i<n)i0.5(0\leq i<n)i0.5(0≤i<n)位置上各有一只老鼠。 然…

张高兴的 .NET Core IoT 入门指南:(二)GPIO 的使用

什么是 GPIOGPIO 是 General Purpose Input Output 的缩写&#xff0c;即“通用输入输出”。 Raspberry Pi 有两行 GPIO 引脚&#xff0c; Raspberry Pi 通过这两行引脚进行一些硬件上的扩展&#xff0c;与传感器进行交互等等。Raspberry Pi B/2B/3B/3B/Zero 引脚图简单的讲&am…