传送门

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

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

#include<cstdio>
#include<algorithm>
using namespace std;
#define MAXN 500005
#define LL long long
LL a[MAXN], pre, tm, b, lst, n, m, sm[MAXN];
struct node {
LL sum, lazy, v, dt; //dt -> delta_time
node(){lazy = -1;}
} t[MAXN<<1];
#define idx(l, r) (l+r)|(l!=r)
inline void GET(LL &n) {
char c; n = 0;
do c = getchar(); while('0' > c || c > '9');
do n = n*10+c-'0', c=getchar(); while('0' <= c && c <= '9');
}
inline void fz(int l, int r, LL dt) {
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;
}
inline void pd(int l, int r) {
int mid = (l + r) >> 1, i = idx(l, r);
if(~t[i].lazy) {
t[idx((mid+1), r)].lazy = t[idx(l,mid)].lazy = t[i].lazy;
t[idx((mid+1), r)].dt = t[idx(l,mid)].dt = 0;
t[idx((mid+1), r)].v = t[idx(l,mid)].v = t[i].lazy;
t[idx((mid+1), r)].sum = (r-mid)*t[i].lazy; t[idx(l,mid)].sum = (mid-l+1)*t[i].lazy;
t[i].lazy = -1;
}
if(t[i].dt) {
fz(l, mid, t[i].dt); fz(mid+1, r, t[i].dt); t[i].dt = 0;
}
}
inline void pu(int l, int r) {
int mid = (l + r) >> 1;
t[idx(l, r)].sum = t[idx(l, mid)].sum + t[idx((mid+1), r)].sum;
t[idx(l, r)].v = t[idx((mid+1), r)].v;
}
int Find(int l, int r) {
if(l == r) return l;
int mid = (l + r) >> 1;
pd(l, r);
if(t[idx(l, mid)].v >= b) return Find(l, mid);
return Find(mid+1, r);
}
int L;
LL Modify(int l, int r) {
if(r < L) return 0;
int mid = (l + r) >> 1; LL ans;
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; }
pd(l, r); ans = Modify(l, mid) + Modify(mid+1, r);
pu(l, r); return ans;
}
int main() {
GET(n); GET(m);
for(int i = 1; i <= n; ++ i) GET(a[i]);
sort(a+1, a+n+1); for(int i = 1; i <= n; ++ i) sm[i] = sm[i-1] + a[i];
for(int i = 1; i <= m; ++ i) {
GET(tm); GET(b); fz(1, n, tm-lst); lst = tm;
if (t[idx(1, n)].v < b){ puts("0"); continue; }
L = Find(1, n); printf("%lld\n", Modify(1, n)-b*(n-L+1));
}
return 0;
}

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. out参数,ref参数,params参数数组

    params参数数组 params关键字可以为方法指定数目可变的参数.params关键字修饰的参数,可以传入任意数目的同类型参数,甚至可以不传入参数. 不过params修饰的参数必须是方法的最后一个参 ...

  2. iOS开发中的4种数据持久化方式【二、数据库 SQLite3、Core Data 的运用】

                   在上文,我们介绍了ios开发中的其中2种数据持久化方式:属性列表.归档解档.本节将继续介绍另外2种iOS持久化数据的方法:数据库 SQLite3.Core Data 的运 ...

  3. django(五)

    URLs 当一个用户请求一个页面时,Django将按照顺序去匹配每一个模式,并停在第一个匹配请求的URL上. 如果你的url多个正则表达式都能匹配上咋弄?小心出错,这个是按照顺序匹配的 url(r'^ ...

  4. Entity Framwork(EF) 7——在现在数据库的甚而上开发MVC 新项目

    一.开发背景: 由于老系统已经无法满足实际业务需求,需在现有数据库的甚而上开发新的项目. 二.困难点: 而EF默认情况下是要删除现有数据库表格后重新创建,这是不允许的.当你创建数据库对象时系统会提示“ ...

  5. phpexcel简单用法

    <?php /*php生成excel完整实例代码现求:php生成excel完整实例代码最好能说明如何调用!谢谢java_sunhui4 | 浏览 8131 次 2014-09-24 14:502 ...

  6. boost compile

    pushd E:\boost\boost_1_59_0 b2 stage --toolset=msvc-12.0 --without-python --stagedir="E:\boost\ ...

  7. Repeater控件 ---表格展示数据

    简介: Repeater控件是Web 服务器控件中的一个容器控件,它使您可以从页的任何可用数据中创建出自定义列表. Repeater 控件不具备内置的呈现功能,这表示用户必须通过创建模板为 Repea ...

  8. Android菜鸟成长记2-内部类

    Java内部类 内部类是指在一个外部类的内部再定义一个类.类名不需要和文件夹相同.       内部类可以是静态static的,也可用public,default,protected和private修 ...

  9. 在Eclipse上操作Hive-0.13.1-JDBC端口

    fesh个人实践,欢迎经验交流!本文Blog地址:http://www.cnblogs.com/fesh/p/3877740.html 完成<在Hadoop-2.2.0集群上安装 Hive-0. ...

  10. 自动获取socket链接状态

    C# TcpClient在连接成功后无法检测连接状态,即使对方关闭了网络连接.以下扩展可检测连接状态: static class TcpClientEx { public static bool Is ...