P5044-[IOI2018] meetings 会议【dp,笛卡尔树,线段树二分】

正题

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


题目大意

给出一个长度为nnn的序列hhh,定义dis(x,y)=max{hi}(x≤i≤y)dis(x,y)=max\{h_i\}(x\leq i\leq y)dis(x,y)=max{hi}(xiy)

qqq次询问给出一个区间[L,R][L,R][L,R],找到一个x∈[L,R]x\in[L,R]x[L,R],最小化∑i=LRdis(i,x)\sum_{i=L}^Rdis(i,x)i=LRdis(i,x)的值。

1≤n,q≤750000,1≤hi≤1091\leq n,q\leq 750000,1\leq h_i\leq 10^91n,q750000,1hi109


解题思路

先考虑暴力的做法,记fl,rf_{l,r}fl,r表示区间[l,r][l,r][l,r]的答案,那么我们找出[l,r][l,r][l,r]的任意一个最大值的位置xxx,要么是左边跨过这个值要么是右边跨过这个值,也就是
fl,r=min{fl,x−1+(r−x+1)×hx,fx+1,r+(x−l+1)×hx}f_{l,r}=min\{f_{l,x-1}+(r-x+1)\times h_x,f_{x+1,r}+(x-l+1)\times h_x\}fl,r=min{fl,x1+(rx+1)×hx,fx+1,r+(xl+1)×hx}
考虑怎么优化这个转移,因为关系到这个区间的最大值,所以我们考虑在笛卡尔树上计算答案。

对于每个询问[L,R][L,R][L,R],我们先找到这个区间的最大值xxx把它拆分成[L,x][L,x][L,x][x,R][x,R][x,R]的询问。

先考虑形如[x,R][x,R][x,R]这一部分的询问,因为这一部分都满足最大值在最左边。

对于每个笛卡尔树上的节点midmidmid,记它的区间[l,r][l,r][l,r],我们考虑维护所有的fl,xf_{l,x}fl,x其中x∈[l,r]x\in[l,r]x[l,r]

那么我们怎么转移这个东西

  • 对于x∈[l,mid−1]x\in[l,mid-1]x[l,mid1]fl,xf_{l,x}fl,x代表的意义不变。
  • 对于x=midx=midx=midfl,mid=fl,mid−1+hmidf_{l,mid}=f_{l,mid-1}+h_{mid}fl,mid=fl,mid1+hmid,因为midmidmid是最高点,在这个点聚合显然不合适。
  • 对于x∈[mid+1,r]x\in[mid+1,r]x[mid+1,r]fl,x=min{fl,mid+hmid×(x−mid),fmid+1,x+hmid×(mid−l+1)}f_{l,x}=min\{f_{l,mid}+h_{mid}\times (x-mid),f_{mid+1,x}+h_{mid}\times (mid-l+1)\}fl,x=min{fl,mid+hmid×(xmid),fmid+1,x+hmid×(midl+1)}

麻烦的是后面那个东西,我们考虑在线段树上维护所有的f?,xf_{?,x}f?,x???根据处理到的节点改变)。

然后发现fl,mid+hmid×(x−mid)f_{l,mid}+h_{mid}\times (x-mid)fl,mid+hmid×(xmid)根据xxx的变化稳定增加hmidh_{mid}hmid,而fmid+1,x+hmid×(mid−l+1)f_{mid+1,x}+h_{mid}\times (mid-l+1)fmid+1,x+hmid×(midl+1)这个玩意每次的增量是fmid+1,x−fmid+1,x−1f_{mid+1,x}-f_{mid+1,x-1}fmid+1,xfmid+1,x1,显然是不会超过hmidh_{mid}hmid的。

所以选择它们两个的决策之间存在一个交点,我们可以二分这个位置。考虑这个加等差序列和区间推平操作都是要在线段树上搞的,所以我们直接顺手在线段树上二分就好了,因为这个的原因我们要记录一下左端点和右端点的权值。

时间复杂度:O((n+q)log⁡n)O(\ (n+q)\log n\ )O( (n+q)logn )


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#define ll long long
using namespace std;
const ll N=760000;
struct node{ll r,w,id;
};
ll n,m,lg[N],h[N],f[N][20],ans[N];
ll ql[N],qr[N];vector<node> q[N];
struct SegTree{#define M N<<2ll w[M],k[M],c[M],wl[M],wr[M];void Clear(){memset(w,0,sizeof(w));memset(wl,0,sizeof(wl));memset(wr,0,sizeof(wr));memset(k,0,sizeof(k));memset(c,0,sizeof(c));}void Setw(ll x,ll val){w[x]=wl[x]=wr[x]=val;k[x]=c[x]=0;return;}void Setk(ll x,ll val){wl[x]+=val;wr[x]+=val;k[x]+=val;return;}void Downdata(ll x,ll L,ll R){if(w[x]>0)Setw(x*2,w[x]),Setw(x*2+1,w[x]),w[x]=-1;if(k[x])Setk(x*2,k[x]),Setk(x*2+1,k[x]),k[x]=0;if(c[x]){ll mid=(L+R)>>1;k[x*2+1]+=c[x]*(mid-L+1);wr[x*2]+=c[x]*(mid-L);wl[x*2+1]+=c[x]*(mid-L+1);wr[x*2+1]+=c[x]*(R-L);c[x*2]+=c[x];c[x*2+1]+=c[x];c[x]=0;}return;}void Change(ll x,ll L,ll R,ll l,ll r,ll val){if(L==l&&R==r){Setw(x,val);return;}ll mid=(L+R)>>1;Downdata(x,L,R);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);wl[x]=wl[x*2];wr[x]=wr[x*2+1];return;}void Update(ll x,ll L,ll R,ll l,ll r,ll ks,ll cs){if(L==l&&R==r){Setk(x,ks);c[x]+=cs;wr[x]+=(R-L)*cs;return;}ll mid=(L+R)>>1;Downdata(x,L,R);if(r<=mid)Update(x*2,L,mid,l,r,ks,cs);else if(l>mid)Update(x*2+1,mid+1,R,l,r,ks,cs);else Update(x*2,L,mid,l,mid,ks,cs),Update(x*2+1,mid+1,R,mid+1,r,ks,cs);wl[x]=wl[x*2];wr[x]=wr[x*2+1];return;}ll Ask(ll x,ll L,ll R,ll pos){if(L==R)return wr[x];ll mid=(L+R)>>1;Downdata(x,L,R);if(pos<=mid)return Ask(x*2,L,mid,pos);return Ask(x*2+1,mid+1,R,pos);}void Solve(ll x,ll L,ll R,ll l,ll r,ll k1,ll b1,ll b2){if(L==l&&R==r){if(b1>=wl[x]+b2){Setk(x,b2);return;}if(k1*(R-L)+b1<=wr[x]+b2){Setw(x,b1);wr[x]+=k1*(R-L);c[x]+=k1;return;}}ll mid=(L+R)>>1;Downdata(x,L,R);if(r<=mid)Solve(x*2,L,mid,l,r,k1,b1,b2);else if(l>mid) Solve(x*2+1,mid+1,R,l,r,k1,b1,b2);else Solve(x*2,L,mid,l,mid,k1,b1,b2),Solve(x*2+1,mid+1,R,mid+1,r,k1,b1+k1*(mid-l+1),b2);wl[x]=wl[x*2];wr[x]=wr[x*2+1];return;}#undef M
}T;
ll RMQ(ll l,ll r){ll z=lg[r-l+1];l=f[l][z];r=f[r-(1<<z)+1][z];return (h[l]<h[r])?r:l;
}
void solve(ll L,ll R){if(L>R)return;ll x=RMQ(L,R);solve(L,x-1);solve(x+1,R);for(ll i=0;i<q[x].size();i++)ans[q[x][i].id]=min(ans[q[x][i].id],q[x][i].w+T.Ask(1,1,n,q[x][i].r));ll f=(x>L)?T.Ask(1,1,n,x-1):0;f+=h[x];T.Change(1,1,n,x,x,f);if(x<R)T.Solve(1,1,n,x+1,R,h[x],f+h[x],(x-L+1)*h[x]);return;
}
signed main()
{scanf("%lld%lld",&n,&m);for(ll i=2;i<=n;i++)lg[i]=lg[i>>1]+1;for(ll i=1;i<=n;i++)scanf("%lld",&h[i]),f[i][0]=i;memset(ans,0x3f,sizeof(ans));	for(ll j=1;(1<<j)<=n;j++)for(ll i=1;i+(1<<j)-1<=n;i++){ll a=f[i][j-1],b=f[i+(1<<j-1)][j-1];f[i][j]=(h[a]<h[b])?b:a;}for(ll i=1;i<=m;i++){scanf("%lld%lld",&ql[i],&qr[i]);ql[i]++;qr[i]++;ll x=RMQ(ql[i],qr[i]);q[x].push_back((node){qr[i],(x-ql[i]+1)*h[x],i});}solve(1,n);reverse(h+1,h+1+n);for(ll i=1;i<=n;i++)q[i].clear();for(ll j=1;(1<<j)<=n;j++)for(ll i=1;i+(1<<j)-1<=n;i++){ll a=f[i][j-1],b=f[i+(1<<j-1)][j-1];f[i][j]=(h[a]<h[b])?b:a;}for(ll i=1;i<=m;i++){ql[i]=n-ql[i]+1;qr[i]=n-qr[i]+1;swap(ql[i],qr[i]);ll x=RMQ(ql[i],qr[i]);q[x].push_back((node){qr[i],(x-ql[i]+1)*h[x],i});}T.Clear();solve(1,n);for(ll i=1;i<=m;i++)printf("%lld\n",ans[i]);return 0;
}

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

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

相关文章

模板:线段树标记永久化

为了那不可知的询问永远坚守于此 解析 众所周知线段树的区间修改是需要打懒标记的 多数时候&#xff0c;这个标记在询问子区间时需要下传 而标记永久化&#xff0c;就是指不下传懒标记的一种操作 在某些时候标记不便下传时有所应用 比如zkw线段树和二维线段树等 然而zkw线段树…

1305. GT考试

1305. GT考试 题意&#xff1a; 准考证长度为n位&#xff0c;不吉利数字有m位&#xff0c;问不出现不吉利数字的准考证有多少种&#xff0c;答案mod K 题解&#xff1a; 动态规划kmp矩阵快速幂 设dp[i][j]表示长度为i&#xff0c;且不包含S串&#xff0c;且末尾部分与S串的…

.NET Core IdentityServer4实战 第二章-OpenID Connect添加用户认证

内容&#xff1a;本文带大家使用IdentityServer4进行使用OpenID Connect添加用户认证作者&#xff1a;zara(张子浩) 欢迎分享&#xff0c;但需在文章鲜明处留下原文地址。在这一篇文章中我们希望使用OpenID Connect这种方式来验证我们的MVC程序&#xff08;需要有IdentityServe…

[CF/AT]各大网站网赛 体验部部长第一季度工作报告

文章目录CodeForces#712 (Div. 1)——1503A. Balance the BitsB. 3-ColoringC. Travelling Salesman ProblemD. Flip the Cards108 (Rated for Div. 2)——1519A. Red and Blue BeansB. The Cake Is a LieC. Berland RegionalD. Maximum Sum of ProductsE. Off by OneCodeforce…

G - Tiling FZU - 2040(未解决)

G - Tiling FZU - 2040 题意&#xff1a; m * n的矩阵&#xff0c;通过任意大小的矩阵&#xff0c;有多少种填充方式&#xff1f; 图片为3 * 2的矩阵有如下填充方式&#xff1a; 题解&#xff1a; 矩阵快速幂 目前还没参透 代码:

P7520-[省选联考 2021 A 卷]支配

正题 题目链接:https://www.luogu.com.cn/problem/P7520 题目大意 给出nnn个点mmm条边的一张有向图&#xff0c;一号点为起始点&#xff0c;qqq次独立的询问加入一条边后有多少个点的支配集发生了变化。 1≤n≤3000,1≤m≤2n,1≤q≤21041\leq n\leq 3000,1\leq m\leq 2\times…

11.16 模拟:总结

220pts 100100020 整体还可以&#xff0c;虽然T3挂掉了&#xff0c;但T1T2做出来还是不错的 问题&#xff1a; 开局审错了题&#xff01;T2调了太久T3写挂了白给了40… &#xff08;我临交前就觉得T3细节这么多很可能挂还检查了一遍&#xff09; 只能说我的直觉很灵敏了 这…

C# 8 的新提案:new 关键字类型推断

在很多情况下&#xff0c;一个地方只允许出现一种可能的类型。C# 仍然要求你明确列出类型&#xff0c;但如果目标类型“new”表达式提案被采用&#xff0c;那么就不再需要这些样板代码。从表面上看&#xff0c;这个特性看起来与 var 关键字恰好相反。它不是根据表达式推断出变量…

CF1540B Tree Array(期望,dp)

解析 关于合理的实现 这题卡在最后的小破dp是我没想到的 一开始看到200的数据范围就不禁笑出了声 lca直接On求&#xff01; 然后就开始大力分类讨论 然后就卡在了一个问题上 两个栈AB&#xff0c;分别有a和b个元素&#xff0c;随机从两个栈中弹出一个元素&#xff0c;求最后A栈…

pjudge#21614-[PR #1]守卫【Kruskal生成树,费用流】

正题 题目链接:http://pjudge.ac/problem/21614 题目大意 给出一张nnn个点mmm条边的一张图&#xff0c;有kkk个守卫&#xff0c;每个守卫都有一个点集SSS表示这个守卫可以被派遣到这个点集中的某个点&#xff0c;然后你可以选择一些边删除&#xff0c;要求使得每个点都恰好和…

I - The Mad Mathematician FZU - 2042(未解决)

I - The Mad Mathematician FZU - 2042 题意&#xff1a; 给你一段伪代码&#xff1a;如图 现在给你A&#xff0c;B&#xff0c;C&#xff0c;D&#xff0c;E&#xff0c;的具体值&#xff0c;问你sum是多少 0<A,B,C,D,E<263-1 题解&#xff1a; 数位dp&#xff1f;…

程序员修仙之路--高性能排序多个文件

点击上方蓝色字体&#xff0c;关注我们菜菜呀&#xff0c;昨天晚上班级空间崩溃了程序员主力 Y总what&#xff1f;菜菜我看服务器上写了很多个日志文件&#xff0c;我看着太费劲了&#xff0c;能不能按照日期排序整合成一个文件呀&#xff1f;程序员主力 Y总Y总要查日志呀&…

CF718E Matvey‘s Birthday(状压、bfs、暴力、分类讨论)

解析 比较复杂的一道题 看数据范围&#xff0c;我们肯定要从种类很少的颜色入手 因为第二种加边方式和颜色密切相关 所以设计disi,kdis_{i,k}disi,k​表示 i 号节点到颜色为 k 的节点的最小步数 通过对每个k bfs一遍就能得出答案 然后两个点之间的距离就可以写出转移式&#…

P5366-[SNOI2017]遗失的答案【状压dp,FWT】

正题 题目链接:https://www.luogu.com.cn/problem/P5366 题目大意 给出一个n,G,Ln,G,Ln,G,L。 qqq次询问在1∼n1\sim n1∼n中选择若干个数字并且数字xxx必选&#xff0c;要求这些数的gcdgcdgcd为GGG且lcmlcmlcm为LLL的方案数。 1≤n,G,L,x≤108,1≤q≤1051\leq n,G,L,x\leq 1…

2017ACM/ICPC广西邀请赛

2017ACM/ICPC广西邀请赛&#xff08;感谢广西大学&#xff09; 题号题目考点难度AA Math Problem数论签到题BColor itCCounting StarsDCoveringECS Course思维 &#xff0c;二进制思维题FDestroy Walls最大生成树GDuizi and Shunzi思维题HLaw of CommutationIMatching in a Tr…

【.NET Core项目实战-统一认证平台】第十四章 授权篇-自定义授权方式

上篇文章我介绍了如何强制令牌过期的实现&#xff0c;相信大家对IdentityServer4的验证流程有了更深的了解&#xff0c;本篇我将介绍如何使用自定义的授权方式集成老的业务系统验证&#xff0c;然后根据不同的客户端使用不同的认证方式来集成到统一认证平台。.netcore项目实战交…

CF1500C Matrix Sorting(拓扑排序)

解析 神仙题 我想到了一部分&#xff0c;但是由于没想到倒着做&#xff0c;后面越想越复杂… 本题的关键是要倒着想 考虑最后一次排序的列x 必须是单调不增的 否则直接错 然后倒数第二列y 必须在x列相等的段内单调不增&#xff0c;因为这些地方x无法起到排序的作用 同理再到倒…

P8292-[省选联考 2022]卡牌【状压,容斥】

正题 题目链接:https://www.luogu.com.cn/problem/P8292 题目大意 有nnn张卡牌&#xff0c;第iii张上的数字是sis_isi​。mmm次询问给出cic_ici​个质数&#xff0c;要求选择一些卡使得这些卡的乘积是这些质数的倍数&#xff0c;求方案数。 1≤n≤106,1≤si≤2000,1≤m≤1500…

D - Covering HDU - 6185(未解决完)

D - Covering HDU - 6185 题意&#xff1a; 4 * n的地板&#xff0c;有无数个1 * 2 和2 * 1 的砖块&#xff0c;问有多少方式填满&#xff1f; 1≤n≤10^18 题解&#xff1a; 矩阵快速幂 代码&#xff1a;

.NET-记一次架构优化实战与方案-前端优化

前言上一篇《.NET-记一次架构优化实战与方案-梳理篇》整理了基本的业务知识&#xff0c;同时也罗列了存在的问题&#xff0c;本篇主要是针对任务列表的页面进行性能优化。该篇主要涉及的是代码实现上的优化&#xff0c;实现上的问题是战术债务&#xff0c;也就是我们平常出现的…