正题

题目链接:https://www.luogu.com.cn/problem/P5579


题目大意

nnn个树,第iii个每天长高aia_iai​米。

mmm次修剪,第iii次在did_idi​天,将高度为bib_ibi​的部分修剪掉

求每次修剪掉的高度


解题思路

按照aia_iai​排序后我们知道每次修改的一定是一个后缀,所以我们先考虑如何计算修改的位置。首先我们可想到类似二分的方法,为了方便维护,我们使用一个线段树,记录每个区间内最左边的树的情况,然后左右走动即可。询问时我们需要知道这个修改区间内的高度和

考虑如何储存情况,首先我们需要知道这个区间内所有树一天的成长和记为wiw_iwi​,然后上次修改的时间tit_iti​和上次修改后的高度hih_ihi​,那么我们就可以用hi∗(r−l+1)+(T−ti)∗wih_i*(r-l+1)+(T-t_i)*w_ihi​∗(r−l+1)+(T−ti​)∗wi​表示现在的高度和。同理最左边的树也可以这样来计算

时间复杂度O(nlog⁡n)O(n\log n)O(nlogn)


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=5e5+10,M=4*N;
ll n,m,a[N],d[N],b[N],T,answer;
ll w[M],t[M],h[M],lazy[M],ans[M];
void Build(ll x,ll l,ll r){if(l==r){w[x]=a[l];return;}ll mid=(l+r)>>1;Build(x*2,l,mid);Build(x*2+1,mid+1,r);w[x]=w[x*2]+w[x*2+1];
}
void updata(ll x,ll l,ll r,ll T){t[x]=d[T];h[x]=b[T];lazy[x]=T;ans[x]=h[x]*(r-l+1)-w[x]*t[x];
}
void Change(ll x,ll l,ll r){if(l==r){if(h[x]+(d[T]-t[x])*a[r]>b[T]){answer+=h[x]+(d[T]-t[x])*a[r]-b[T];updata(x,l,r,T);}return;}ll mid=(l+r)>>1;if(lazy[x]){updata(x*2,l,mid,lazy[x]);updata(x*2+1,mid+1,r,lazy[x]);lazy[x]=0;}if(h[x*2+1]+(d[T]-t[x*2+1])*a[mid+1]>b[T]){ll z=x*2+1;Change(x*2,l,mid);answer+=d[T]*w[x*2+1]+ans[x*2+1]-(r-mid)*b[T];updata(x*2+1,mid+1,r,T);}else Change(x*2+1,mid+1,r);ans[x]=ans[x*2]+ans[x*2+1];h[x]=h[x*2];t[x]=t[x*2];return;
}
int main()
{scanf("%lld%lld",&n,&m);for(ll i=1;i<=n;i++)scanf("%lld",&a[i]);sort(a+1,a+1+n);Build(1,1,n);for(T=1;T<=m;T++){answer=0;scanf("%lld%lld",&d[T],&b[T]);Change(1,1,n);printf("%lld\n",answer); }
}

P5579-[PA2015]Siano【线段树】相关推荐

  1. bzoj 4293: [PA2015]Siano(线段树)

    4293: [PA2015]Siano Time Limit: 30 Sec  Memory Limit: 256 MB Submit: 452  Solved: 159 [Submit][Statu ...

  2. 二逼平衡树——树套树(线段树套Splay平衡树)

    题面 Bzoj3196 解析 线段树和Splay两棵树套在一起,常数直逼inf,但最终侥幸过了 思路还是比较简单, 在原数组维护一个下标线段树,再在每一个线段树节点,维护一个对应区间的权值Splay. ...

  3. 线段树——HDU - 1698

    题目含义 就是初始化一堆数为1 可以经过操作把一个区间的数都改变 并求这堆数的总大小 题目分析 有一个 #include<iostream> #include<stdio.h> ...

  4. BZOJ.1558.[JSOI2009]等差数列(线段树 差分)

    BZOJ 洛谷 首先可以把原序列\(A_i\)转化成差分序列\(B_i\)去做. 这样对于区间加一个等差数列\((l,r,a_0,d)\),就可以转化为\(B_{l-1}\)+=\(a_0\),\(B ...

  5. 【线段树分治 线性基】luoguP3733 [HAOI2017]八纵八横

    不知道为什么bzoj没有HAOI2017 题目描述 Anihc国有n个城市,这n个城市从1~n编号,1号城市为首都.城市间初始时有m条高速公路,每条高速公路都有一个非负整数的经济影响因子,每条高速公路 ...

  6. [bzoj1582][Usaco2009 Hol]Holiday Painting 节日画画_线段树

    Holiday Painting 节日画画 bzoj-1582 Usaco-2009 Hol 题目大意:给定两个n*m的01网格图.q次操作,每次将第二个网格图的子矩阵全部变成0或1,问每一次操作后两 ...

  7. codefores 786B. Legacy(最短路,线段树优化拆点,好题)

    题目链接 B. Legacy time limit per test2 seconds memory limit per test256 megabytes inputstandard input o ...

  8. 【题解】BZOJ 3065: 带插入区间K小值——替罪羊树套线段树

    题目传送门 题解 orz vfk的题解 3065: 带插入区间K小值 系列题解 一 二 三 四 惨 一开始用了一种空间常数很大的方法,每次重构的时候merge两颗线段树,然后无限RE(其实是MLE). ...

  9. 树链剖分+线段树 HDOJ 4897 Little Devil I(小恶魔)

    题目链接 题意: 给定一棵树,每条边有黑白两种颜色,初始都是白色,现在有三种操作: 1 u v:u到v路径(最短)上的边都取成相反的颜色 2 u v:u到v路径上相邻的边都取成相反的颜色(相邻即仅有一 ...

最新文章

  1. 如何把class里的vector结构体memcpy出来_面试官:请说出线程安全的 ArrayList 有哪些,除了Vector...
  2. Java虚拟机结构分析
  3. 什么是数据的完整性约束
  4. 大数据 Spark :利用电影观看记录数据,进行电影推荐 | 原力计划
  5. 自学PHP有哪些书籍和教程值得推荐?
  6. 大数据学习笔记39:Hive - 内置函数(2)
  7. Javascript技术实现真正的网上试听
  8. mac用python爬虫下载图片_利用Python爬虫采集mac电脑皮肤|简明python教程|python入门|python教程...
  9. 10分钟装好宝塔面板,一键管理服务器
  10. vue-cli项目中单文件组件引入bootstrap.js异常的解决方案
  11. 重读领域驱动设计——如何说好一门通用语言
  12. 遥感植被指数128个
  13. 如何增加(软件测试)自动化测试面试成功率?只需学会主流设计模式PO+关键字驱动!
  14. 广东最美的历史古村落,再不去就没了
  15. Designing an Encoder for StyleGAN Image Manipulation论文解读
  16. Redis的运用(简单)
  17. 计算机配置打开命令行,win7开机f8进入修复计算机cmd装xp
  18. E+H超声波液位计变送器维修FMU90-R11CA111AA3A
  19. 山东大学nlp实验--词向量
  20. 如何构建一个在线绘图工具:Feakin 是如何设计与构建的?

热门文章

  1. 手把手教你java快速过滤关键词
  2. java web 测试类,构建一个容易单元测试的java–web系统-JSP教程,Java技巧及代码
  3. 刷新mac地址命令_配置好Cisco交换机需要熟悉IOS命令及相关的知识
  4. 网站logo放在服务器,自己建网站如何设计网站LOGO
  5. linux服务器查配置信息失败,查看Linux服务器的配置信息
  6. 双离合档把上按钮作用_英特尔展示双屏幕概念笔记本:带有双铰链
  7. leetcode150. 逆波兰表达式求值
  8. 455. 分发饼干001(贪心算法+详解)
  9. java当中递归打印目录树
  10. 卷不动也得继续学!紧跟vue3的步伐,再来get一波进阶新特性!