luoguP4331 [BOI2004]Sequence 数字序列
题意
大力猜结论。
首先将所有\(a_i\)变为\(a_i-i\),之后求不严格递增的\(b_i\),显然答案不变,最后\(b_i\)加上\(i\)即可。
考虑两种特殊情况:
1.\(a[]\)是递增的:所有\(b_i=a_i\)。
2.\(a[]\)是递减的:显然取\(a[]\)的中位数\(x\),所有\(b_i=x\)。
现在考虑\(a[]\)一段递增一段递减这样排列,我们可以对每一段递减的\(a_i,a_{i+1}...a_{i+k}\)求出中位数\(c_i\)。
现在我们的\(a[]\)变成了\(c_1,c_2...c_k\)的形式,考虑如果还有\(c_{i+1}<c_i\),我们就合并\(i,i+1\)两段,求出它们的中位数作为新的一段的值。
合并求中位数可以用左偏树完成,我们只需要对每一段开一个左偏树,只保留段数的一半个数,每次合并后就暴力弹出。
code:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1000010;
int n,top;
ll ans;
ll a[maxn],b[maxn];
struct Heap
{
#define lc(p) (heap[p].lc)
#define rc(p) (heap[p].rc)
#define dis(p) (heap[p].dis)
int lc,rc,dis;
}heap[maxn];
struct node
{
int root,l,r,size;
ll k;
}sta[maxn];
int merge(int x,int y)
{
if(!x||!y)return x+y;
if(a[x]<a[y])swap(x,y);
rc(x)=merge(rc(x),y);
if(dis(rc(x))>dis(lc(x)))swap(lc(x),rc(x));
dis(x)=dis(rc(x))+1;
return x;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%lld",&a[i]),a[i]-=i;
for(int i=1;i<=n;i++)
{
sta[++top]=(node){i,i,i,1,a[i]};
while(top>1&&sta[top].k<sta[top-1].k)
{
sta[top-1].root=merge(sta[top-1].root,sta[top].root);
sta[top-1].size+=sta[top].size;
sta[top-1].r=sta[top].r;
while(sta[top-1].size>(sta[top-1].r-sta[top-1].l+1-1)/2+1)
{
sta[top-1].size--,sta[top-1].root=merge(lc(sta[top-1].root),rc(sta[top-1].root));
}
top--;
sta[top].k=a[sta[top].root];
}
}
for(int i=1;i<=top;i++)
for(int j=sta[i].l;j<=sta[i].r;j++)
b[j]=sta[i].k,ans+=abs(a[j]-b[j]);
printf("%lld\n",ans);
for(int i=1;i<=n;i++)printf("%lld ",b[i]+i);
return 0;
}
luoguP4331 [BOI2004]Sequence 数字序列的更多相关文章
- 洛谷P4331 [BOI2004] Sequence 数字序列 [左偏树]
题目传送门 数字序列 题目描述 给定一个整数序列 a1,a2,⋅⋅⋅,an ,求出一个递增序列 b1<b2<⋅⋅⋅<bn ,使得序列 ai 和 bi 的各项之差的绝对 ...
- [BOI2004]Sequence 数字序列(左偏树)
PS:参考了黄源河的论文<左偏树的特点及其应用> 题目描述:给定一个整数序列\(a_1, a_2, - , a_n\),求一个递增序列\(b_1 < b_2 < - < ...
- [BOI2004]Sequence 数字序列
Description: Hint: \(n<=10^5\) Solution: 首先考虑b不严格递增时的做法 发现当\(a[i]\)递增时\(b[i]\)直接取\(a[i]\)即可,否则此时需 ...
- P4331 [BOI2004]Sequence 数字序列 (左偏树)
[题目链接] https://www.luogu.org/problemnew/show/P4331 题目描述 给定一个整数序列\(a_1, a_2, ··· , a_n,\)求出一个递增序列\(b_ ...
- 洛谷P4331 [BOI2004]Sequence 数字序列(左偏树)
传送门 感觉……不是很看得懂题解在说什么? 我们先把原数列$a_i-=i$,那么本来要求递增序列,现在只需要求一个非严格递增的就行了(可以看做最后每个$b_i+=i$,那么非严格递增会变为递增) 如果 ...
- 洛谷$P4331\ [BOI2004]\ Sequence$ 数字序列 左偏树
正解:左偏树 解题报告: 传送门$QwQ$ 开始看到的时候$jio$得长得很像之前做的一个$dp$,,, 但是$dp$那题是说不严格这里是严格? 不难想到我们可以让$a_{i},b_{i}$同时减去$ ...
- Luogu P4331 [BOI2004]Sequence 数字序列 (左偏树论文题)
清晰明了%%% Fairycastle的博客 个人习惯把size什么的存在左偏树结点内,这样在外面好写,在里面就是模板(只用修改update). 可以对比一下代码(好像也差不多-) MY CODE # ...
- luogu 4331 [BalticOI 2004]Sequence 数字序列
LINK:数字序列 这是一道论文题 我去看了一眼论文鸽的论文. 发现讲的还算能懂.可并堆的操作也讲的比较清晰. 对于这道题首先有一个小trick 我们给a数组全部减去其对应的下标这样我们求出来的b数组 ...
- 2021.08.01 P4311 数字序列(左偏树)
2021.08.01 P4311 数字序列(左偏树) [P4331 BalticOI 2004]Sequence 数字序列 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 重点: 1 ...
随机推荐
- Java Web 学习(3) —— MVC
MVC 一. MVC 模式 MVC 代表 Model-View-Controller (模型-视图-控制器) 模式. Model:模型代表 DAO (Data Access Object 数据访问对象 ...
- python爬虫之爬取网站到数据库
一.根据已有程序运行得到的结果 完整代码如下: import sqlite3; class DB(object): """数据库访问方法的实现""&q ...
- Tomcat中session复制技术
一.准备三台机器主机的服务都正常,nginx与Tomcat构建负载均衡 主机名 IP地址 nginx 192.168.200.111 Tomcat1 192.168.200.11 ...
- ASP.NET Core 中使用负载均衡时获取客户端 IP
在使用负载均衡的情况下,通过 context.Connection.RemoteIpAddress 获取到的是负载均衡的 IP 地址,需要通过 X-Forwarded-For 请求头才能获取到客户端的 ...
- react组件通信方式汇总
父组件更新组件状态,通过props传递给子组件,子组件得到后进行更新.Timer 是倒计时子组件,集成在了OrderPay父组件里,父组件向子组件传订单数据参数order对象.如下代码: <Ti ...
- python实现圣诞树
先来个迷你的 *_* height = 5 stars = 1 for i in range(height): print((' ' * (height - i)) + ('*' * stars)) ...
- H5纯前端生成Excel表格
H5纯前端生成Excel表格方法如下: <!DOCTYPE html> <html> <head> <title></title> < ...
- node 连接 mysql 数据库三种方法------笔记
一.mysql库 文档:https://github.com/mysqljs/mysql mysql有三种创建连接方式 1.createConnection 使用时需要对连接的创建.断开进行管理 2. ...
- .net core的服务器模式和工作站模式
来源:济南小老虎 .NET Core是一个开源通用的开发框架,具有跨平台能力,我们在享受其性能飙升的同时,也面临了一些问题.通过观察 NetCore 程序的线上运行情况发现 ,负载高的情况下应用程序占 ...
- C#用Call代替CallVirt之后的测试用例
一. C# 原始代码和直接结果 测试 C# 代码: class Program { static void Main(string[] args) { A c1 = new C(); c1.Foo() ...