BZOJ4293 [PA2015]Siano(线段树)
传送门
这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(线段树)的更多相关文章
- 【BZOJ4293】[PA2015]Siano 线段树
[BZOJ4293][PA2015]Siano Description 农夫Byteasar买了一片n亩的土地,他要在这上面种草. 他在每一亩土地上都种植了一种独一无二的草,其中,第i亩土地的草每天会 ...
- BZOJ.4293.[PA2015]Siano(线段树)
题目链接 \(Description\) 有一片n亩的土地,要在这上面种草. 在每一亩土地上都种植了一种独一无二的草,其中,第\(i\)亩土地的草每天会长高\(a[i]\)厘米. 一共会进行\(m\) ...
- BZOJ4293: [PA2015]Siano
Description 农夫Byteasar买了一片n亩的土地,他要在这上面种草. 他在每一亩土地上都种植了一种独一无二的草,其中,第i亩土地的草每天会长高a[i]厘米. Byteasar一共会进行m ...
- 【BZOJ】4293: [PA2015]Siano 线段树上二分
[题意]给定n棵高度初始为0的草,每天每棵草会长高a[i],m次收割,每次在d[i]天将所有>b[i]的草收割到b[i],求每次收割量.n<=500000. [算法]线段树上二分 [题解] ...
- 2018.07.23[PA2015]Siano(线段树)
[PA2015]Siano 描述 Description 农夫Byteasar买了一片n亩的土地,他要在这上面种草. 他在每一亩土地上都种植了一种独一无二的草,其中,第i亩土地的草每天会长高a[i]厘 ...
- [火星补锅] siano 神奇的线段树
前言: 本来以为很难打的,没想到主干一次就打对了,然而把输入的b和d弄混了,这sb错误调了两个小时... 解析: 神奇的线段树.注意到有一个性质,无论怎么割草,生长速度快的一定不会比生长速度慢的矮.因 ...
- 2018.07.25 bzoj3878: [Ahoi2014&Jsoi2014]奇怪的计算器(线段树)
传送门 线段树综合. 让我想起一道叫做siano" role="presentation" style="position: relative;"&g ...
- bzoj3932--可持久化线段树
题目大意: 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第 ...
- codevs 1082 线段树练习 3(区间维护)
codevs 1082 线段树练习 3 时间限制: 3 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...
随机推荐
- RNN神经网络和英中机器翻译的实现
本文系qitta的文章翻译而成,由renzhe0009实现.转载请注明以上信息,谢谢合作. 本文主要讲解以recurrent neural network为主,以及使用Chainer和自然语言处理其中 ...
- starUML 建模
1. starUML 序列图建模 参考: [1]. starUML 序列图建模. http://blog.csdn.net/u013474104/article/details/43818691
- Home not found. Define system property "openfireHome" or create and add the openfire_init.xml file to the classpath
启动openfire后出现这个错误,貌似什么配置没对吧.网上搜索了下,找到解决办法, $ vi /etc/profile在里面加入:export openfireHome=/opt/openfire ...
- jquery 选择器汇总
jQueryAPI_1.7.1_CN.chm下载地址http://download.csdn.net/detail/zhai123_/6459563 jquery 选择器大体上可分为4 类: 1.基本 ...
- 有了第一台自己开发的pro,开心,明天分享最近整理逆向分析ios的一些东西
最近都在忙于ios深入研究,研究别人的代码,别人的app.然后顺藤摸瓜的找到了关键:逆向,动态特性等. 相关工具:reveal, cycript等. 特别感谢前人的分享,为了打开学习ios的另外一扇大 ...
- vim总结
1.vim基础用法 注:该思维导图来自笔者<Linux就该这么学>读书笔记. 移动光标: 命令 描述 k 向上移动光标(移动一行) j 向下移动光标(移动一行) h 向左移动光标(移动一个 ...
- CAPI学习心得
比较有意义资料 Education .ppt User-guide Coherent Accelerator Interface Architecture.pdf ------------------ ...
- 关于delphi 中 Sender的学习
sender是 事件的触发者,我发现所有的组件的事件 基本上都是 传Sender. 示例效果图: 代码: 接着来,既然TButton是个类,且publish哪里有事件,我们也可以看看这个事件的原型.
- Android之使用Android-AQuery异步加载图片(一)
第一节:转载地址(http://www.cnblogs.com/lee0oo0/archive/2012/10/25/2738299.html) // 必须实现AQuery这个类 AQuery aq ...
- Linux_05------Linux之vim编辑器
行 * -/xxx 向后搜索 * -?xxx 向前搜索 * 命令模式下: * -h: 光标左移 * -j: 光标下移 * -k: 光标上移 * -l: 光标右移 * -ctrl+f: 向下翻页(fro ...