传送门

这Seg确实不好写,不过因为它与ai的相对顺序无关,所以,我们在对ai排序之后,就可做了。维护一个区间最大值,维护一个和,维护一个区间赋值的懒标记,再维护一个时间变化的标记就可以了。

因为不论怎样在排序过后的序列里面右边的一定不小于左边的,所以我们可以在线段树里面二分来找到每一次操作的开始位置,然后就可以区间修改了。

  1. #include<cstdio>
  2. #include<algorithm>
  3. using namespace std;
  4. #define MAXN 500005
  5. #define LL long long
  6. LL a[MAXN], pre, tm, b, lst, n, m, sm[MAXN];
  7. struct node {
  8. LL sum, lazy, v, dt; //dt -> delta_time
  9. node(){lazy = -1;}
  10. } t[MAXN<<1];
  11. #define idx(l, r) (l+r)|(l!=r)
  12. inline void GET(LL &n) {
  13. char c; n = 0;
  14. do c = getchar(); while('0' > c || c > '9');
  15. do n = n*10+c-'0', c=getchar(); while('0' <= c && c <= '9');
  16. }
  17. inline void fz(int l, int r, LL dt) {
  18. t[idx(l, r)].v += dt*a[r]; t[idx(l, r)].sum += (sm[r]-sm[l-1]) * dt; t[idx(l, r)].dt += dt;
  19. }
  20. inline void pd(int l, int r) {
  21. int mid = (l + r) >> 1, i = idx(l, r);
  22. if(~t[i].lazy) {
  23. t[idx((mid+1), r)].lazy = t[idx(l,mid)].lazy = t[i].lazy;
  24. t[idx((mid+1), r)].dt = t[idx(l,mid)].dt = 0;
  25. t[idx((mid+1), r)].v = t[idx(l,mid)].v = t[i].lazy;
  26. t[idx((mid+1), r)].sum = (r-mid)*t[i].lazy; t[idx(l,mid)].sum = (mid-l+1)*t[i].lazy;
  27. t[i].lazy = -1;
  28. }
  29. if(t[i].dt) {
  30. fz(l, mid, t[i].dt); fz(mid+1, r, t[i].dt); t[i].dt = 0;
  31. }
  32. }
  33. inline void pu(int l, int r) {
  34. int mid = (l + r) >> 1;
  35. t[idx(l, r)].sum = t[idx(l, mid)].sum + t[idx((mid+1), r)].sum;
  36. t[idx(l, r)].v = t[idx((mid+1), r)].v;
  37. }
  38. int Find(int l, int r) {
  39. if(l == r) return l;
  40. int mid = (l + r) >> 1;
  41. pd(l, r);
  42. if(t[idx(l, mid)].v >= b) return Find(l, mid);
  43. return Find(mid+1, r);
  44. }
  45. int L;
  46. LL Modify(int l, int r) {
  47. if(r < L) return 0;
  48. int mid = (l + r) >> 1; LL ans;
  49. if(L <= l) { ans = t[idx(l, r)].sum; t[idx(l, r)].dt = 0; t[idx(l, r)].sum = (r-l+1)*b; t[idx(l, r)].v = b; t[idx(l, r)].lazy = b; return ans; }
  50. pd(l, r); ans = Modify(l, mid) + Modify(mid+1, r);
  51. pu(l, r); return ans;
  52. }
  53. int main() {
  54. GET(n); GET(m);
  55. for(int i = 1; i <= n; ++ i) GET(a[i]);
  56. sort(a+1, a+n+1); for(int i = 1; i <= n; ++ i) sm[i] = sm[i-1] + a[i];
  57. for(int i = 1; i <= m; ++ i) {
  58. GET(tm); GET(b); fz(1, n, tm-lst); lst = tm;
  59. if (t[idx(1, n)].v < b){ puts("0"); continue; }
  60. L = Find(1, n); printf("%lld\n", Modify(1, n)-b*(n-L+1));
  61. }
  62. return 0;
  63. }

BZOJ4293 [PA2015]Siano(线段树)的更多相关文章

  1. 【BZOJ4293】[PA2015]Siano 线段树

    [BZOJ4293][PA2015]Siano Description 农夫Byteasar买了一片n亩的土地,他要在这上面种草. 他在每一亩土地上都种植了一种独一无二的草,其中,第i亩土地的草每天会 ...

  2. BZOJ.4293.[PA2015]Siano(线段树)

    题目链接 \(Description\) 有一片n亩的土地,要在这上面种草. 在每一亩土地上都种植了一种独一无二的草,其中,第\(i\)亩土地的草每天会长高\(a[i]\)厘米. 一共会进行\(m\) ...

  3. BZOJ4293: [PA2015]Siano

    Description 农夫Byteasar买了一片n亩的土地,他要在这上面种草. 他在每一亩土地上都种植了一种独一无二的草,其中,第i亩土地的草每天会长高a[i]厘米. Byteasar一共会进行m ...

  4. 【BZOJ】4293: [PA2015]Siano 线段树上二分

    [题意]给定n棵高度初始为0的草,每天每棵草会长高a[i],m次收割,每次在d[i]天将所有>b[i]的草收割到b[i],求每次收割量.n<=500000. [算法]线段树上二分 [题解] ...

  5. 2018.07.23[PA2015]Siano(线段树)

    [PA2015]Siano 描述 Description 农夫Byteasar买了一片n亩的土地,他要在这上面种草. 他在每一亩土地上都种植了一种独一无二的草,其中,第i亩土地的草每天会长高a[i]厘 ...

  6. [火星补锅] siano 神奇的线段树

    前言: 本来以为很难打的,没想到主干一次就打对了,然而把输入的b和d弄混了,这sb错误调了两个小时... 解析: 神奇的线段树.注意到有一个性质,无论怎么割草,生长速度快的一定不会比生长速度慢的矮.因 ...

  7. 2018.07.25 bzoj3878: [Ahoi2014&Jsoi2014]奇怪的计算器(线段树)

    传送门 线段树综合. 让我想起一道叫做siano" role="presentation" style="position: relative;"&g ...

  8. bzoj3932--可持久化线段树

    题目大意: 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第 ...

  9. codevs 1082 线段树练习 3(区间维护)

    codevs 1082 线段树练习 3  时间限制: 3 s  空间限制: 128000 KB  题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...

随机推荐

  1. flex polygon 序列化为txt 文本

    当我们要把一个地块导出为txt的时候,应该怎么写,这是比较有用的这样可以帮助我们存档之类的,这里是基于某个地方的独立坐标系,是基于自己发布地图,如果是用百度地图或者其他网上的地图可能不适用. pack ...

  2. python基础07 函数

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 函数最重要的目的是方便我们重复使用相同的一段程序. 将一些操作隶属于一个函数,以后 ...

  3. 去除DEDECMS后台预览文章URL地址多余的数字信息

    在使用织梦模板时发现这样一个问题:在后台预览文章的时候,出现的文章网址尽管是静态URL,但是会在网址的尾部出现问号并跟随一个时间戳,在复制URL时就显得很不方便.那么如何解决这一问题呢? 经过查找资料 ...

  4. oracle 认证方式

    Oracle登录的时候有两种认证方式,一种是“操作系统认证”,一种是“口令文件认证”.1.当采取操作系统认证的时候,在本地用任何用户都可以以sysdba登陆:(默认方式)2.当采取口令文件认证的时候, ...

  5. mgo中DBRef-数据查询测试

    下午对数据查询进行了代码测试: package main import ( "crypto/rand" "encoding/hex" "fmt&quo ...

  6. archlinux pacman 常用选项

    pacman -S package_name #安装软件包pacman -R package_name #删除软件包 pacman -Rs package_name #顺便删除软件包相关依赖pacma ...

  7. A potentially dangerous Request.Form value was detected from the client

    提交表单中包含特殊字符如<script>可能被认为是跨站攻击代码:解决方法很多,如stackoverflow上的web.config中加设置的方法不中肯[如原贴中Jamie M所说],主要 ...

  8. Autofac 的构造函数注入方式

    介绍 该篇文章通过一个简单的 ASP.NET MVC 项目进行介绍如何使用 autofac 及 autofac 的 MVC 模块进行依赖注入.注入方式通过构造函数. 在编写 aufofac 的依赖注入 ...

  9. Java NIO教程 前言

    阅读本文前,建议你先了解 旧I/O NIO 是 New I/O 的缩写,要了解它真正的内涵,需要掌握的知识还是比较多的.我努力在这几篇笔记里,勾勒出整个io的面貌.为大家的深入学习铺路. I/O简史 ...

  10. delphi对象赋值

     Delphi的对象之间赋值主要要注意几个方面的问题:   1.对象之间的 :=赋值只是地址赋值,即是将当前对象的地址赋值到变量中,定义的变量可以是不用初始化的,在内存中两个变量指向的是同一地址空间: ...