LOJ2611. NOIP2013 积木大赛 【线段树】
LOJ2611. NOIP2013 积木大赛
题目大意是给你一个目标状态数组
每次你可以选择一个连续区间加上一个值,求最小操作次数
我是神奇的脑子
最近做数据结构疯了
然后看见这题就数据结构了
好像网上还没有这种做法
逆向考虑这个过程
我们直接从目标数组删去一个连续区间
我们先考虑对于一个区间肯定一次删掉min(l to r)是最优的情况
假设区间最小的位置是pos,那么删除后pos变成了0
所以可以递归成l to pos−1和pos+1 to r两个区间
累加上pos的高度并且区间减这个高度就好了
因为每一次删除会把一个位置变成0,所以最多操作n次,然后时间复杂度是nlogn的
#include<bits/stdc++.h>
using namespace std;
#define N 100010
#define LD t<<1
#define RD t<<1|1
int n,h[N];
int minv[N<<],pos[N<<],sub[N<<];
void pushup(int t){
if(minv[LD]<=minv[RD]){
minv[t]=minv[LD],pos[t]=pos[LD];
}else{
minv[t]=minv[RD],pos[t]=pos[RD];
}
}
void pushdown(int t){
if(sub[t]){
minv[LD]-=sub[t];sub[LD]+=sub[t];
minv[RD]-=sub[t];sub[RD]+=sub[t];
sub[t]=;
}
}
void build(int t,int l,int r){
if(l>r)return;
if(l==r){minv[t]=h[l];pos[t]=l;return;}
int mid=(l+r)>>;
build(LD,l,mid);
build(RD,mid+,r);
pushup(t);
}
void modify(int t,int l,int r,int L,int R,int vl){
if(l>r)return;
if(L<=l&&r<=R){minv[t]-=vl;sub[t]+=vl;return;}
pushdown(t);
int mid=(l+r)>>;
if(R<=mid)modify(LD,l,mid,L,R,vl);
else if(mid<L)modify(RD,mid+,r,L,R,vl);
else {
modify(LD,l,mid,L,mid,vl);
modify(RD,mid+,r,mid+,R,vl);
}
pushup(t);
}
#define pi pair<int,int>
pi query(int t,int l,int r,int L,int R){
if(l>r)return pi(,);
if(L<=l&&r<=R)return pi(minv[t],pos[t]);
pushdown(t);
int mid=(l+r)>>;
pi ans;
if(mid>=R)ans=query(LD,l,mid,L,R);
else if(mid<L)ans=query(RD,mid+,r,L,R);
else{
pi tl=query(LD,l,mid,L,mid);
pi tr=query(RD,mid+,r,mid+,R);
if(tl.first<=tr.first)ans=tl;
else ans=tr;
}
pushup(t);
return ans;
}
#define LL long long
LL solve(int l,int r){
if(l>r)return ;
pi now=query(,,n,l,r);
modify(,,n,l,r,now.first);
return (LL)now.first+solve(l,now.second-)+solve(now.second+,r);
}
int main(){
scanf("%d",&n);
for(int i=;i<=n;i++)scanf("%d",&h[i]);
build(,,n);
printf("%lld",solve(,n));
return ;
}
LOJ2611. NOIP2013 积木大赛 【线段树】的更多相关文章
- cogs 1440. [NOIP2013]积木大赛 贪心水题
1440. [NOIP2013]积木大赛 ★★ 输入文件:BlockNOIP2013.in 输出文件:BlockNOIP2013.out 简单对比时间限制:1 s 内存限制:128 M ...
- NOIP2013积木大赛
题目描述 春春幼儿园举办了一年一度的“积木大赛”.今年比赛的内容是搭建一座宽度为n的大厦,大厦可以看成由n块宽度为1的积木组成,第i块积木的最终高度需要是hi. 在搭建开始之前,没有任何积木(可以看成 ...
- noip2013 积木大赛
题目描述 春春幼儿园举办了一年一度的“积木大赛”.今年比赛的内容是搭建一座宽度为n的大厦,大厦可以看成由n块宽度为1的积木组成,第i块积木的最终高度需要是hi. 在搭建开始之前,没有任何积木(可以看成 ...
- NOIP2013 花匠 DP 线段树优化
网上一堆题解,我写的是N^2优化的那种,nlogn,O(n)的那种能看懂,但是让我自己在赛场写,肯定没戏了 #include <cstdio> #include <iostream& ...
- NOIP2013积木大赛 [贪心]
大意 自己查去... 说明 这道题正解是贪心,但标程里是有这样一句话的:把序列分成(a1,..ai)(ai+1,...aj)......(ak,...an)多个非递减序列.然后所有段中最大值的和减去除 ...
- NOIP 2013 积木大赛
洛谷 P1969 积木大赛 洛谷传送门 JDOJ 2229: [NOIP2013]积木大赛 D2 T1 JDOJ传送门 题目描述 春春幼儿园举办了一年一度的"积木大赛".今年比赛的 ...
- [NOIp2013提高组]积木大赛/[NOIp2018提高组]铺设道路
[NOIp2013提高组]积木大赛/[NOIp2018提高组]铺设道路 题目大意: 对于长度为\(n(n\le10^5)\)的非负数列\(A\),每次可以选取一个区间\(-1\).问将数列清零至少需要 ...
- [NOIP2013] 提高组 洛谷P1969 积木大赛
题目描述 春春幼儿园举办了一年一度的“积木大赛”.今年比赛的内容是搭建一座宽度为n的大厦,大厦可以看成由n块宽度为1的积木组成,第i块积木的最终高度需要是hi. 在搭建开始之前,没有任何积木(可以看成 ...
- noip2013提高组:积木大赛
题目描述 春春幼儿园举办了一年一度的“积木大赛”.今年比赛的内容是搭建一座宽度为n的大厦,大厦可以看成由n块宽度为1的积木组成,第n块积木的最终高度需要是hi. 在搭建开始之前,没有任何积木(可以看成 ...
随机推荐
- Entity Framework 中 Schema是什么
在使用Entity Framework时,会注意到下面这句: protected override void OnModelCreating(DbModelBuilder modelBuilder) ...
- PHP数据库链接类(PDO+Access)
PHP PDO Access链接 class DbHelpClass { private $conn; private $qxId; private $ret; function __construc ...
- GDB操作基本命令
GDB操作基本命令 1 打开文件及退出操作 shell下输入 gdb filename : 打开单个文件 gdb filename -q: 打开单个文件,屏蔽掉GDB自带的说明信息 gdb下输入qui ...
- 欢迎来到 Flask 的世界
欢迎来到 Flask 的世界 欢迎阅读 Flask 的文档.本文档分成几个部分,我推荐您先读 < 安装 >,然后读< 快速上手 >.< 教程 > 比快速上手文档更详 ...
- spring mvc: 多解析器映射(资源绑定视图解析器 + 内部资源[普通模式/]视图解析器)
spring mvc: 多解析器映射(资源绑定视图解析器 + 内部资源[普通模式/]视图解析器) 资源绑定视图解析器 + 内部资源(普通模式)视图解析器 并存方式 内部资源视图解析器: http:// ...
- Spoj-COINS-记忆化dp
COINS - Bytelandian gold coins #dynamic-programming In Byteland they have a very strange monetary sy ...
- spring注入的四种方式
配置文件spring.xml: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=&qu ...
- syslinux启动盘制作
# <font color=DarkCyan >syslinux启动盘制作</font> # ### 准备工具 ### 1. BOOTICEx64 软件 ##分区引导制作工具 ...
- MySql设计规范及SQL索引优化【呕心之作】
数据库及表结构基本设计规范 1. 所有表必须使用Innodb存储引擎 没有特殊要求(即Innodb无法满足的功能如:列存储,存储空间数据等)的情况下,所有表必须使用Innodb存储引擎(mysql5. ...
- laravel中单独获取一个错误信息的方法
获取单独的错误信息的方法