LOJ2611. NOIP2013 积木大赛


LINK


题目大意是给你一个目标状态数组
每次你可以选择一个连续区间加上一个值,求最小操作次数


我是神奇的脑子
最近做数据结构疯了
然后看见这题就数据结构了

好像网上还没有这种做法


逆向考虑这个过程
我们直接从目标数组删去一个连续区间

我们先考虑对于一个区间肯定一次删掉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 积木大赛 【线段树】的更多相关文章

  1. cogs 1440. [NOIP2013]积木大赛 贪心水题

    1440. [NOIP2013]积木大赛 ★★   输入文件:BlockNOIP2013.in   输出文件:BlockNOIP2013.out   简单对比时间限制:1 s   内存限制:128 M ...

  2. NOIP2013积木大赛

    题目描述 春春幼儿园举办了一年一度的“积木大赛”.今年比赛的内容是搭建一座宽度为n的大厦,大厦可以看成由n块宽度为1的积木组成,第i块积木的最终高度需要是hi. 在搭建开始之前,没有任何积木(可以看成 ...

  3. noip2013 积木大赛

    题目描述 春春幼儿园举办了一年一度的“积木大赛”.今年比赛的内容是搭建一座宽度为n的大厦,大厦可以看成由n块宽度为1的积木组成,第i块积木的最终高度需要是hi. 在搭建开始之前,没有任何积木(可以看成 ...

  4. NOIP2013 花匠 DP 线段树优化

    网上一堆题解,我写的是N^2优化的那种,nlogn,O(n)的那种能看懂,但是让我自己在赛场写,肯定没戏了 #include <cstdio> #include <iostream& ...

  5. NOIP2013积木大赛 [贪心]

    大意 自己查去... 说明 这道题正解是贪心,但标程里是有这样一句话的:把序列分成(a1,..ai)(ai+1,...aj)......(ak,...an)多个非递减序列.然后所有段中最大值的和减去除 ...

  6. NOIP 2013 积木大赛

    洛谷 P1969 积木大赛 洛谷传送门 JDOJ 2229: [NOIP2013]积木大赛 D2 T1 JDOJ传送门 题目描述 春春幼儿园举办了一年一度的"积木大赛".今年比赛的 ...

  7. [NOIp2013提高组]积木大赛/[NOIp2018提高组]铺设道路

    [NOIp2013提高组]积木大赛/[NOIp2018提高组]铺设道路 题目大意: 对于长度为\(n(n\le10^5)\)的非负数列\(A\),每次可以选取一个区间\(-1\).问将数列清零至少需要 ...

  8. [NOIP2013] 提高组 洛谷P1969 积木大赛

    题目描述 春春幼儿园举办了一年一度的“积木大赛”.今年比赛的内容是搭建一座宽度为n的大厦,大厦可以看成由n块宽度为1的积木组成,第i块积木的最终高度需要是hi. 在搭建开始之前,没有任何积木(可以看成 ...

  9. noip2013提高组:积木大赛

    题目描述 春春幼儿园举办了一年一度的“积木大赛”.今年比赛的内容是搭建一座宽度为n的大厦,大厦可以看成由n块宽度为1的积木组成,第n块积木的最终高度需要是hi. 在搭建开始之前,没有任何积木(可以看成 ...

随机推荐

  1. oracle快速创建主键

    oracle中,有时我们会发现有一些表中,一些记录它们每个字段的数据 都是一样一样的,即重复数据,这种数据的不存在肯定是不对了. 究其原因,就是该表没有主键,给一个表创建主键,非常容易: alter ...

  2. Pandas教程目录

    Pandas数据结构 Pandas系列 Pandas数据帧(DataFrame) Pandas面板(Panel) Pandas基本功能 Pandas描述性统计 Pandas函数应用 Pandas重建索 ...

  3. django教程目录

    什么是web框架? Do a web framework ourselves MVC和MTV模式 django的流程和命令行工具 Django的配置文件(settings) Django URL (路 ...

  4. C++学习——C++复合类型

    1.引用 引用是为某一个变量起了另一个名字,定义方式为type &rval = val; 引用类型必须与引用的变量类型完全一致,引用后,rval和val将会被视为一个变量,只不过有两种调用方式 ...

  5. [javascript]Dom操作笔记

    1.为一个节点同时设置多个属性 $("div[aria-describedby='F53_batch_history']").attr({"display":& ...

  6. S.O.L.I.D 是面向对象设计(OOD)和面向对象编程(OOP)中的几个重要编码原则

    注:以下图片均来自<如何向妻子解释OOD>译文链接:http://www.cnblogs.com/niyw/archive/2011/01/25/1940603.html      < ...

  7. 学习 nginx (持续更新)

    什么是代理与反向代理,有什么应用场景? 平常经常听别人说代理与反向代理,那么这二者到底有什么区别呢? 代理 场景:我需要访问一个服务器C,但是由于某些原因我无法访问到它,(典型的就是你FQ,然后fai ...

  8. 设计模式--状态模式C++实现

    1定义 当一个状态的内在状态改变时允许其行为改变,这个对象看起来像改变了其类 2类图 角色分析 State抽象状态角色,接口或者抽象类,负责状态定义,并且封装环境角色以实现状态切换 ConcreteS ...

  9. cf 833 A 数论

    A. The Meaningless Game time limit per test 1 second memory limit per test 256 megabytes input stand ...

  10. buctoj——合法的出栈顺序

    题目描述 我们知道,一个入栈序列是{1,2,3}的合法出栈序列有{3,2,1},{1,2,3}等,而{3,1,2}是不合法的.现在冰语有一个长度为n的序列A(保证序列内数字唯一,且1<=A[i] ...