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. Asp.Net Core 2.0 WebUploader FastDfs 文件上传 分段上传

    功能点: 1. 使用.net core 2.0 实现文件上传 2. 使用webuploader实现单文件,多文件上传 3. 使用webuploader实现大文件的分段上传. 4. 使用webuploa ...

  2. try throw catch typeid

    QString str = ui.ll->text(); try { if (str == NULL) { throw 1; } else { throw 1.2; } } catch (int ...

  3. 简单易用的分页类实例代码PHP

    <?php /*********************************************** * @类名: page * @参数: $myde_total - 总记录数 * $m ...

  4. jQuery实际案例②——三层轮播图

    1.如图,这种轮播图需要实现的是,当鼠标移到2上时,第二张图片从右侧过来 2.需要注意的:①很明显这是通过改变z-index与left值来实现的:  ②整体布局需注意,图与数值(1,2,3,4,5)两 ...

  5. 【程序员笔试面试必会——排序①】Python实现 冒泡排序、选择排序、插入排序、归并排序、快速排序、堆排序、希尔排序

    最近在准备笔试题和面试题,把学到的东西整理出来,一来是给自己留个笔记,二来是帮助大家学习. 题目: 给定一个int数组A及数组的大小n,请返回排序后的数组. 测试样例:  输入:[1,2,3,5,2, ...

  6. centos双机热备份

    centos双机热备份 本机没有用到F5硬件,用到的是radware. 现在有2台服务器:192.168.2.66, 192.168.2.67 有一个公网ip:xxx.xxx.xx.203 将67上冷 ...

  7. jshint options

    jshint -W032 忽略if代码块后有多余的分号的提示 地址:jslinterrors.com/unnecessary-semicolon asi       忽略函数定义后必须加分号的提示 c ...

  8. 1-18 编译安装内核支持ntfs文件系统

    大纲: 源码编译Linux内核 使用Linux内核模块 实战:编译一个NTFS内核模块,实现Linux挂载NTFS文件系统并实现读写功能 =============================== ...

  9. Dir命令

    注: 此系列为自己之前所搭建网站内容. 其实python的os模块能够很好的完成此任务.改天总结下. 之前在处理气象数据时,十几个文件,文件名比较长,需要自己处理变动的年份找出地址的规律再进行文件的读 ...

  10. 【hive】多表插入

    from or_table insert overwrite table1 name1 select … insert into table2 name2 select … 注意:select 后边不 ...