【笛卡尔树】【线段树】meetings 会议(P5044)

正题

P5044


题目大意

给出一个序列a,设 dist(x,y)=max⁡i=xyaidist(x,y)=\max_{i=x}^ya_idist(x,y)=maxi=xyai,有m个询问,对于每个询问,给出 l,r,让你找一个点x(l≤x≤r)(l\leq x\leq r)(lxr),使得 ∑i=lrdist(i,x)\sum_{i=l}^rdist(i,x)i=lrdist(i,x) 最小


解题思路

fi,jf_{i,j}fi,j 为区间 [l,r] 的答案,那么得到区间最大值x后,可以按如下转移

fl,r=min⁡(fl,x−1+ax×(r−x+1),fx+1,r+ax×(x−l+1))f_{l,r}=\min(f_{l,x-1}+a_x\times(r-x+1),f_{x+1,r}+a_x\times(x-l+1))fl,r=min(fl,x1+ax×(rx+1),fx+1,r+ax×(xl+1))

考虑如何优化

考虑对该数列建立笛卡尔树

对于一个查询 [l,r] ,求出最大点x,那么可以把当前询问拆成 [l,x-1] 和 [x+1,r]

那么对于笛卡尔树上的一个点x(子树范围为 [l,r]),只需维护 [l,x-1],[l+1,x-1]…[x-1,x-1] 和 [x+1,r],[x+1,r-1]…[x+1,x+1] 这些状态

那么可以用两个线段树,分别维护遍历到当前点时每个点到子树最左/右端的答案

对于左子树的点,考虑从左子树选还是从右子树选,可以把右子树选的贡献差分一下,然后线段树上二分找分界点修改决策(即哪些点选左子树,哪些点选右子树,单调性易证),右子树同理

遍历完笛卡尔树中左右子树后,计算最大点为当前点的询问,记下答案后再往回走

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


code

#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
#define N 750100
#define mp make_pair
#define fs first
#define sn second
using namespace std;
ll n,t,l,r,lg[N],h[N],f[N][25],ans[N];
vector<pair<pair<ll,ll>,ll> >q[N];
struct Tree
{#define ls x*2#define rs x*2+1ll lazy[N<<2],b[N<<2],k[N<<2],lm[N<<2],rm[N<<2];void push_up(ll x){lm[x]=lm[ls];rm[x]=rm[rs];return;}void get(ll x,ll l,ll r,ll bb,ll kk){b[x]+=bb;k[x]+=kk;lm[x]+=bb+kk*l;rm[x]+=bb+kk*r;return;}void clr(ll x){lazy[x]=1;k[x]=b[x]=lm[x]=rm[x]=0;return;}void push_down(ll x,ll l,ll r){if(lazy[x]){clr(ls);clr(rs);lazy[x]=0;}ll mid=l+r>>1;get(ls,l,mid,b[x],k[x]);get(rs,mid+1,r,b[x],k[x]);b[x]=k[x]=0;return;}void add(ll x,ll L,ll R,ll l,ll r,ll y){if(L==l&&R==r){get(x,l,r,y,0);return;}push_down(x,L,R);ll mid=L+R>>1;if(r<=mid)add(ls,L,mid,l,r,y);else if(l>mid)add(rs,mid+1,R,l,r,y);else add(ls,L,mid,l,mid,y),add(rs,mid+1,R,mid+1,r,y);push_up(x);return;}void change(ll x,ll L,ll R,ll l,ll r,ll y,ll z){if(L==l&&R==r){ll gl=y+z*l,gr=y+z*r;if(gl>=lm[x]&&gr>=rm[x])return;//分界点在中间就二分下去else if(gl<=lm[x]&&gr<=rm[x]){clr(x);get(x,l,r,y,z);return;}}push_down(x,L,R);ll mid=L+R>>1;if(r<=mid)change(ls,L,mid,l,r,y,z);else if(l>mid)change(rs,mid+1,R,l,r,y,z);else change(ls,L,mid,l,mid,y,z),change(rs,mid+1,R,mid+1,r,y,z);push_up(x);return;}ll ask(ll x,ll l,ll r,ll y){if(l==r)return lm[x];push_down(x,l,r);ll mid=l+r>>1;if(y<=mid)return ask(ls,l,mid,y);else return ask(rs,mid+1,r,y);}
}TL,TR;
ll get(ll l,ll r)
{ll g=lg[r-l+1];if(h[f[l][g]]>=h[f[r-(1<<g)+1][g]])return f[l][g];else return f[r-(1<<g)+1][g];
}
void solve(ll l,ll r)
{ll x=get(l,r);if(l<x)solve(l,x-1);if(x<r)solve(x+1,r);for(ll i=0;i<q[x].size();++i){ll lans=0,rans=0,L=q[x][i].fs.fs,R=q[x][i].fs.sn;if(L<x)lans=TR.ask(1,1,n,L);if(x<R)rans=TL.ask(1,1,n,R);ans[q[x][i].sn]=min(lans+h[x]*(R-x+1),rans+h[x]*(x-L+1));}ll gl=h[x],gr=h[x];if(l<x)gl+=TL.ask(1,1,n,x-1);if(x<r)gr+=TR.ask(1,1,n,x+1);TL.add(1,1,n,x,x,gl);TR.add(1,1,n,x,x,gr);if(l<x){TR.add(1,1,n,l,x-1,h[x]*(r-x+1));//加上右子树的点走到左边的贡献TR.change(1,1,n,l,x-1,gr+h[x]*x,-h[x]);//在右边选的贡献}if(x<r){TL.add(1,1,n,x+1,r,h[x]*(x-l+1));TL.change(1,1,n,x+1,r,gl-h[x]*x,h[x]);}return;
}
int main()
{scanf("%lld%lld",&n,&t);for(ll i=1;i<=n;++i){scanf("%lld",&h[i]);f[i][0]=i;}for(ll i=2;i<=n;++i)lg[i]=lg[i>>1]+1;for(ll j=1;j<=20;++j)for(ll i=1;i<=n-(1<<j)+1;++i)if(h[f[i][j-1]]>=h[f[i+(1<<j-1)][j-1]])f[i][j]=f[i][j-1];else f[i][j]=f[i+(1<<j-1)][j-1];for(ll i=1;i<=t;++i){scanf("%lld%lld",&l,&r);l++;r++;q[get(l,r)].push_back(mp(mp(l,r),i));}solve(1,n);for(ll i=1;i<=t;++i)printf("%lld\n",ans[i]);return 0;
}

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

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

相关文章

codeforces438 D. The Child and Sequence

2020威海区域赛G. Caesar Cipher就用到了此思想&#xff08; 今天碰到模板题了还是再写一遍吧 D. The Child and Sequence 区间取模操作模板题 有一个公式 x%p<x2(x>p)x\%p<\frac{x}{2}(x>p)x%p<2x​(x>p) 由此对于每一个数最多模log次&#xff0c;如果我们…

2020牛客国庆集训派对day4 Emergency Evacuation

Emergency Evacuation 题意&#xff1a; 有n个人在不同的位置上&#xff0c;在最后面有一个出口exit&#xff0c;所有人都要逃离出去&#xff08;走出出口&#xff09;&#xff0c;且每个格子最多容纳一个人&#xff0c;当有人挡在前面时&#xff0c;后面的人必须停留&#x…

P3170-[CQOI2015]标识设计【插头dp】

正题 题目链接:https://www.luogu.com.cn/problem/P3170 题目大意 给出n∗mn*mn∗m的网格上有一些障碍&#xff0c;要求用三个LLL形&#xff08;高宽随意&#xff0c;不能退化成线段/点&#xff09;覆盖格子且LLL形之间不能重叠。 求覆盖方案&#xff08;每个LLL形相同&…

【活动(广州)】MonkeyFest2018 微软最有价值专家讲座

MonkeyFest2018微软最有价值专家讲座Monkey Fest 是一个一年一度由全球Microsoft Xamarin跨平台开发者发起的全球性社区活动&#xff0c;主要是推广在云、人工智能、大数据、移动开发等技术。本次活动同时在新加坡&#xff0c;美国&#xff0c;日本&#xff0c;加拿大&#xff…

【数学】Natasha, Sasha and the Prefix Sums(CF1204E)

正题 luogu CF1204E 题目大意 给出序列a&#xff0c;由n个1和m个-1组成&#xff0c;设 f 为最大前缀和和0的最大值&#xff0c;问全排列的 f 之和 解题思路 可以问题转换到平面图上&#xff0c;把1看作往上走&#xff0c;-1看作往下走 那么问题就变成了求 (0,0) 到 (nm,n-m…

codeforces1454 F. Array Partition

这周忙死&#xff0c;一直没机会吧补一下题&#xff0c;周二晚上打的div3&#xff0c;过了A~E&#xff0c;F就看了下题目就没时间了&#xff0c;无聊的时候想应该会用到ST表&#xff0c;然后想要维护指针&#xff0c;后来写的时候发现维护不了&#xff0c;然后就歇菜了。。。 …

2020牛客国庆集训派对day4 Arithmetic Progressions

Arithmetic Progressions 链接&#xff1a;https://ac.nowcoder.com/acm/contest/7831/B 来源&#xff1a;牛客网 题目描述 An arithmetic progression is a sequence of numbers a1, a2, ..., ak where the difference of consecutive members ai1−ai is a constant (1 ≤ …

P4457-[BJOI2018]治疗之雨【期望dp,高斯消元】

正题 题目链接:https://www.luogu.com.cn/problem/P4457 题目大意 开始一个人最大生命值为nnn&#xff0c;剩余hphphp点生命&#xff0c;然后每个时刻如果生命值没有满那么有1m1\frac{1}{m1}m11​的概率回复一点生命&#xff0c;然后敌人攻击kkk次&#xff0c;每次有1m1\frac…

互联网公司为什么普遍996而不是666

根据skinshoe wu的遭遇&#xff0c;解释一下互联网行业的12小时工作制以及996。题目说的有点绝对&#xff0c;这里先澄清一下&#xff1a;有的公司是10106&#xff0c;9106&#xff0c;10126&#xff0c;995&#xff0c;甚至955&#xff0c;007的都有&#xff0c;我只说大多数&…

【DP】【四边形不等式】邮局(P4767)

正题 P4767 题目大意 给出坐标轴上的n个点&#xff0c;让你选择m个点作为特殊点&#xff0c;使所有点到最近特殊点的距离之和最小 解题思路 考虑对于一个区间选择一个特殊点的最小代价&#xff0c;可以把所有点到当前点的路径分割开来&#xff0c;即每段距离走的次数为1,2,3…

IdentityServer4之JWT签名(RSA加密证书)及验签

一、前言在IdentityServer4中有两种令牌&#xff0c;一个是JWT和Reference Token&#xff0c;在IDS4中默认用的是JWT&#xff0c;那么这两者有什么区别呢&#xff1f;二、JWT与Reference Token的区别1、JWT(不可撤回)  JWT是一个非常轻巧的规范&#xff0c;一般被用来在身份提…

2020牛客国庆集训派对day4 What Goes Up Must Come Down

What Goes Up Must Come Down 题意&#xff1a; 我们规定一个序列合理&#xff1a;当一个序列左部分是非降序列&#xff0c;右部分是非升序列&#xff08;左右部分可为0&#xff0c;也就是整体可以为非降序列&#xff0c;非升序列&#xff09; 题解&#xff1a; 树状数组来…

codeforces1451 E. Bitwise Queries(位运算妙用)

E1. Bitwise Queries (Easy Version) ab(a&b)(a∣b)ab(a\&b)(a|b)ab(a&b)(a∣b) 根据上述式子用333次$&和333次∣|∣操作求出a1a2,a2a3,a1a3a_1a_2,a_2a_3,a_1a_3a1​a2​,a2​a3​,a1​a3​由此得出a1,a2,a3a_1,a_2,a_3a1​,a2​,a3​ 根据a1⊕aixa_1\oplus a…

P4240-毒瘤之神的考验【莫比乌斯反演,平衡规划】

正题 题目链接:https://www.luogu.com.cn/problem/P4240 题目大意 QQQ组数据给出n,mn,mn,m求 ∑i1n∑j1mφ(ij)\sum_{i1}^n\sum_{j1}^m\varphi(i\times j)i1∑n​j1∑m​φ(ij) 1≤Q≤104,1≤n,m≤1051\leq Q\leq 10^4,1\leq n,m\leq 10^51≤Q≤104,1≤n,m≤105 解题思路 首先…

【最小生成树】水箱(P5952)

正题 P5952 题目大意 有一个n*m的网格&#xff0c;每个网格之间有一个板&#xff0c;给出每个板的高度&#xff08;边界有一个高度为 ∞\infty∞ 的墙&#xff09;&#xff0c;在每个网格中注水&#xff08;必须是非负整数&#xff09;&#xff0c;使得两个高度不等且相邻的网…

2020牛客国庆集训派对day4 Jokewithpermutation

Jokewithpermutation 题目描述 Joey had saved a permutation of integers from 1 to n in a text file. All the numbers were written as decimal numbers without leading spaces. Then Joe made a practical joke on her: he removed all the spaces in the file. Help Jo…

.NET Core使用IO合并技巧轻松实现千万级消息推送

之前讲述过多路复用实现单服百万级别RPS吞吐,但在文中有一点是没有说的就是消息IO合并&#xff0c;如果缺少了消息IO合并即使怎样多路复用也很难达到百万级别的请求响毕竟所有应用层面的网络IO读写都是非常损耗性能的&#xff08;需要硬件配置很高的服务器&#xff09;。这一章…

codeforces1457 C. Bouncing Ball

写这个题写了1h&#xff0c;赛后无意看见jly神的代码只能膜拜%%% C. Bouncing Ball 预处理从1→k1\to k1→k开始跳需要添加多少个平台&#xff0c;预处从k1→nk1\to nk1→n这些不难发现由于每次跳k格&#xff0c;只需要利用前缀和思想和前面预处理的结果即可做差求出。 然后枚…

P4491-[HAOI2018]染色【二项式反演,NTT】

正题 题目链接:https://www.luogu.com.cn/problem/P4491 题目大意 给nnn个物品染上mmm种颜色&#xff0c;若恰好有kkk个颜色的物品个数为SSS那么就会产生WkW_kWk​的贡献。求所有染色方案的贡献和 1≤n≤107,1≤m≤105,1≤S≤1501\leq n\leq 10^7,1\leq m\leq 10^5,1\leq S\l…

【传递闭包】【倍增】幸福路径(P4308)

正题 P4308 题目大意 给一个图&#xff0c;每个点有一个权值 axa_xax​&#xff0c;当你经过一条边时体力p\times pp&#xff08;体力初始为1&#xff09;&#xff0c;每到一个点造成的贡献为体力ax\times a_xax​&#xff0c;问最大贡献&#xff08;路径可能是无限长的&…