YBTOJ洛谷P4331:数字序列(左偏树)

文章目录

  • 题目描述
    • 数据范围
  • 解析
  • 代码

题目描述

在这里插入图片描述

数据范围

n<=1e6n<=1e6n<=1e6

解析

先考虑简单情况
如果原数列是单调递增的,显然应该使bi=aib_i=a_ibi=ai
如果单调递减,应该取中位数
那么原数列如果分成单调递减的几段,那么每一段都取中位数使最好的
但是这样会有非法的情况,因为中位数不一定单调递增
所以我们把中位数递减的区间合并,再求大区间的中位数即可
那么怎么快速维护合并区间中位数呢?
主席树最棒了
考虑对每个区间建一个堆,pop掉一半的元素,这样堆顶就是中位数了
再把两个区间的堆合并即可
考虑正确性,为什么不会提前pop掉未来的中位数?
因为如果需要合并,左边中位数大于右边,那么未来的中位数一定是不比左边的中位数大的
而关键就是右边的堆先合并再pop
《巧夺天工》
(说实话我觉得本题主席树真的挺可做的)

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=2e6+100;
const int M=1050;
const int mod=998244353;
ll read(){ll x=0,f=1;char c=getchar();while(!isdigit(c)){if(c=='-') f=-1;c=getchar();}while(isdigit(c)){x=x*10+c-'0';c=getchar();}return x*f;
}
int n,m,tot,num;
int val[N],ls[N],rs[N],rot[N],dis[N],a[N],siz[N];
int New(int v){++tot;val[tot]=v;return tot;
}
int merge(int x,int y){if(!x||!y) return x|y;if(val[x]<val[y]) swap(x,y);rs[x]=merge(rs[x],y);if(dis[ls[x]]<dis[rs[x]]) swap(ls[x],rs[x]);dis[x]=dis[rs[x]]+1;return x;
}
void del(int &x){//printf("    del:id=%d %d\n",x,val[x]);x=merge(ls[x],rs[x]);//printf("nx=%d\n",x);
}
int st[N],ed[N],l[N],r[N];
inline void cut(int x){l[r[x]]=l[x];r[l[x]]=r[x];
}
int b[N];
struct node{int l,r,val,rt,siz;
}s[N];
int top;
int main(){
//	freopen("a.in","r",stdin);
//	freopen("a.out","w",stdout);n=read();dis[0]=-1;for(int i=1;i<=n;i++){a[i]=read();a[i]-=i;}	for(int i=1;i<=n;i++){s[++top]=(node){i,i,a[i],New(a[i]),1};while(top>1&&s[top-1].val>s[top].val){top--;s[top].siz+=s[top+1].siz;s[top].rt=merge(s[top].rt,s[top+1].rt);s[top].r=s[top+1].r;while(s[top].siz>(s[top].r-s[top].l+2)/2){del(s[top].rt);s[top].siz--;}s[top].val=val[s[top].rt];}}for(int i=1;i<=top;i++){for(int j=s[i].l;j<=s[i].r;j++){b[j]=s[i].val;}}ll tot=0;for(int i=1;i<=n;i++){tot+=abs(a[i]-b[i]);}printf("%lld",tot);return 0;
}
/**/

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

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

相关文章

P8441 旭日东升(二维数点经典套路)

P8441 旭日东升 维护一个不可重集合的序列 \(a\)&#xff0c;长度为 \(n\)。支持以下两种操作&#xff1a; l r x 对于每个 \(l\le i\le r\)&#xff0c;将 \(x\) 并入 \(a_i\)。l r 设 \(S\) 把每个 \(l\le i\le r\) 的 \(a_i\) 并在一起的集合&#xff0c;输出 \(S\) 中所有元…

深搜、广搜、搜索剪枝

搜索与回溯讲解 文章目录深搜方向向量&#xff1a;DFS代码&#xff1a;题目讲解&#xff1a;八皇后问题字符序列自然数的拆分广搜BFS代码&#xff1a;题目讲解&#xff1a;瓷砖关系网络bfs与dfs的用途与区别搜索剪枝可行性剪枝最优性剪枝记忆化搜索搜索顺序剪枝题目&#xff1a…

使用logdashboard查看可视化日志

logdashboard日志面板是我在Github写的一个开源项目&#xff0c;旨在让查看日志变的方便快捷。在线预览现在功能有日志检索、趋势图、异常堆栈快速查看、日志详情等logdashboard支持自定义日志模型可以记录更多自定义的属性。logdashboard支持的日志来源有以下两种&#xff0c;…

CF1603C-Extreme Extension【整除分块,dp】

正题 题目链接:http://codeforces.com/contest/1603/problem/C 题目大意 定义一个序列aaa的f(a)f(a)f(a)为你每次可以将序列中的一个数zzz分裂成xyzxyzxyz&#xff0c;然后再把x,yx,yx,y放回原来的位置&#xff0c;然后f(a)f(a)f(a)表示把aaa变成不降序列的最少操作次数 给出…

数论分块专题复习(余数求和+模积和+Ice Rain+The Fool)

文章目录前提知识复习T1&#xff1a;余数求和titlesolutioncodeT2&#xff1a;Ice RaintitlesolutioncodeT3&#xff1a;The FooltitlesolutioncodeT4&#xff1a;模积和titlesolutioncode前提知识复习 整除分块是用于快速处理形似下列式子的方法&#xff0c;是解决莫比乌斯反…

SP1557 GSS2 - Can you answer these queries II(离线 线段树)

SP1557 GSS2 - Can you answer these queries II \(\bigstar\texttt{Hint}\)&#xff1a;遇到去重的问题&#xff0c;我们通常考虑离线询问后处理。 可以枚举右端点&#xff0c;将询问存储在右端点&#xff0c;考虑用数据结构记录左端点的信息。 那么我们如果用线段树维护左端点…

模板:K-D tree

文章目录前言思想能解决的问题操作建树询问修改完整代码所谓KDtree&#xff0c;就是有K个D的树 &#xff08;逃&#xff09; 前言 KDtree是一种解决多维问题的暴力数据结构 K维状态下的最差复杂度是nk−1/kn^{k-1/k}nk−1/k 在最常见的2Dtree中就是根号n 但是玄学的它常常能到…

AT3877-[ARC089C]GraphXY【构造】

正题 题目链接:https://www.luogu.com.cn/problem/AT3877 题目大意 给出一个大小为ABA\times BAB的矩阵ddd 要求构造一个点数不超过300300300的有向图满足 图中没有重边和自环图中的边权为[0,100][0,100][0,100]的整数或者未知数X/YX/YX/Y对于所有X∈[1,A],Y∈[1,B]X\in[1,A…

领域驱动设计,让程序员心中有码(六)

领域驱动设计-聚合&#xff0c;一种极简的思维模式引言作为IT技术产业飞速发展的产物&#xff0c;软件工程学已经成为当今时代非常重要的一个学科。作为一名资深的软件开发从业者&#xff0c;我们需要学习的东西实际上已经远远超出了原本在大学教育阶段所接受的知识深度和广度&…

CF856D Masha and Cactus(树上 DP+抵消贡献技巧)

CF856D Masha and Cactus 我们先捞出一个根节点&#xff0c;那么一次旋变就是对路径上点的覆盖。 设 \(dp_{i,0}\) 表示 \(i\) 没有选择时子树内最大收益&#xff0c;\(dp_{i,1}\) 表示 \(i\) 选择时子树内最大收益&#xff0c;那么将每条边存在 \(lca\) 上。 之后贡献怎么算&a…

hdu 5094 Maze

题意&#xff1a; n*m大的迷宫 &#xff0c;有p种钥匙。钥匙最多有10种。 然后一个k&#xff0c;然后k行表示 (x1,y1),(x2,y2)直接有门或者墙。 如果g0 &#xff0c;就是有墙&#xff0c; 如果g>0 表示有门&#xff0c;且门需要第g把钥匙才能开。 然后下来一个s&#xff…

数论分块练习([CF830 C]Bamboo Partition + [hdu 6395]Sequence )

文章目录T1&#xff1a;SequencetitlesolutionT2&#xff1a;Bamboo PartitiontitlesolutioncodeT1&#xff1a;Sequence title 传送 solution 一眼就是很裸的矩阵加速 ⌊pl⌋\lfloor\frac{p}{l}\rfloor⌊lp​⌋分块矩阵加速就可以了 [BA1][DC⌊pl⌋010001]\begin{bmatrix}…

YBTOJ:染颜色(KDtree)

文章目录题目描述数据范围解析代码题目描述 数据范围 n≤105,T≤5n\le10^5,T\le5n≤105,T≤5 解析 关键是对问题的转化 考虑一次修改&#xff0c;一个点需要满足哪些条件才可以满足 1.与x的距离不超过lll 2.在x的子树内 这两个条件可以转化为对深度的限制和对dfs序的限制 这样…

Kubernetes初探[1]:部署你的第一个ASP.NET Core应用到k8s集群

Kubernetes简介Kubernetes是Google基于Borg开源的容器编排调度引擎&#xff0c;作为CNCF&#xff08;Cloud Native Computing Foundation&#xff09;最重要的组件之一&#xff0c;它的目标不仅仅是一个编排系统&#xff0c;而是提供一个规范&#xff0c;可以让你来描述集群的架…

P5933 [清华集训2012]串珠子(连通性 状压 计数)

P5933 [清华集训2012]串珠子 \(\color{yellow}{\bigstar\texttt{Trick}}\)&#xff1a;遇到连通性题可以暂时忽略是否联通。 设 \(g_s\) 表示集合为 \(s\) 的点的子图有多少个&#xff0c;可以不连通&#xff1b;\(f_s\) 表示答案。 那么 \(g_s\) 可以直接计算 \(g_s\prod_{(i&…

AT2365-[AGC012E]Camel and Oases【状压dp】

正题 题目链接:https://www.luogu.com.cn/problem/AT2365 题目大意 一个数轴上有nnn个点&#xff0c;开始你有个水壶容量为VVV&#xff0c;你每次有两个操作 走到一个距离与你不超过VVV的点让V⌊V2⌋V\lfloor\frac V2\rfloorV⌊2V​⌋&#xff0c;然后跳到任意一个点。 对于…

01分数规划

参考文章 01分数规划 什么是01分数规划&#xff1a; 给定n个a[i]和b[i]&#xff0c;a[i]和b[i]绑定在一起要选同时选&#xff0c;求sum(a[i]) 除以 sum(b[i]) 的最大值&#xff0c;sum为求和函数 对于这种问题我们可以多定义一个数组x[1…n]&#xff0c;x为bool型只取0或者1,…

CF1156D 0-1-Tree(换根DP)

牛犇犇titlesolutioncodetitle 戳一戳 solution 直接设dp[i][k]dp[i][k]dp[i][k]表示以iii为根时&#xff0c;子树内&#xff0c;边权为kkk时的答案 &#xff08;定义写得好复杂&#xff0c;可略过&#xff09; 考虑对于点uuu&#xff0c;vvv是他的一个儿子&#xff0c;两点…

模版:替罪羊树

文章目录前言注意事项代码所谓替罪羊树&#xff0c;就是有一头替罪羊的树 &#xff08;逃&#xff09; 前言 在看完了一大堆各种平衡树的教程之后&#xff0c;决定学一个这个 因为它有一个很关键的好处&#xff1a;无须旋转 可以在pushup复杂度太恶心的题中做到splay做不到的…

Entity Framework 6.3 和 EF Core 3.0 路线图

尽管脱离了 .NET Core 发布循环&#xff0c;但是 EF Core 正在开发其 3.0 路线图。除此之外&#xff0c;还对原来的 Entity Framework 进行了一些重要的变更。更多服务器端的查询将 LINQ 查询转换为对应的 SQL 查询通常是比较困难的&#xff0c;甚至是不可能的。许多 QRM 只能在…