【bzoj4293】【PA2015】Siano
如题,首先可以考虑相对大小是不变的。
那么先sort,之后每次在线段树上二分即可。
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
const int N=;
int n,m;
ll a[N],d[N],b[N];
struct Segment_Tree{
#define lson (o<<1)
#define rson (o<<1|1)
ll addv[N<<],sumv[N<<],suma[N<<],maxv[N<<],setv[N<<];
inline void pushup(int o){
sumv[o]=sumv[lson]+sumv[rson];
maxv[o]=max(maxv[lson],maxv[rson]);
}
inline void pushdown(int o,int l,int r){
int mid=(l+r)>>;
if(setv[o]!=-){
maxv[lson]=setv[o];maxv[rson]=setv[o];
setv[lson]=setv[o];setv[rson]=setv[o];
sumv[lson]=1LL*setv[o]*(mid-l+);
sumv[rson]=1LL*setv[o]*(r-mid);
addv[lson]=;addv[rson]=;setv[o]=-;
}
if(addv[o]){
sumv[lson]+=addv[o]*suma[lson];sumv[rson]+=addv[o]*suma[rson];
maxv[lson]+=1LL*a[mid]*addv[o];maxv[rson]+=1LL*a[r]*addv[o];
addv[lson]+=addv[o];addv[rson]+=addv[o];
addv[o]=;
}
}
inline void build(int o,int l,int r){
setv[o]=-;
if(l==r){suma[o]=a[l];return;}
int mid=(l+r)>>;
build(lson,l,mid);build(rson,mid+,r);
suma[o]=suma[lson]+suma[rson];
}
ll find(int o,int l,int r,ll v){
if(l==r){if(maxv[o]>=v)return l;else return -;}
pushdown(o,l,r);
int mid=(l+r)>>;
if(maxv[lson]>=v)return find(lson,l,mid,v);else return find(rson,mid+,r,v);
}
ll querysum(int o,int l,int r,int ql,int qr){
if(ql<=l&&r<=qr)return sumv[o];
pushdown(o,l,r);int mid=(l+r)>>;;ll ans=;
if(ql<=mid)ans+=querysum(lson,l,mid,ql,qr);
if(qr>mid)ans+=querysum(rson,mid+,r,ql,qr);
return ans;
}
inline void change(int o,int l,int r,int ql,int qr,ll v){
if(ql<=l&&r<=qr){
maxv[o]=setv[o]=v;sumv[o]=1LL*v*(r-l+);
addv[o]=;return;
}
pushdown(o,l,r);int mid=(l+r)>>;
if(ql<=mid)change(lson,l,mid,ql,qr,v);
if(qr>mid)change(rson,mid+,r,ql,qr,v);
pushup(o);
}
}T;
inline ll read(){
ll f=,x=;char ch;
do{ch=getchar();if(ch=='-')f=-;}while(ch<''||ch>'');
do{x=x*+ch-'';ch=getchar();}while(ch>=''&&ch<='');
return f*x;
}
int main(){
n=read();m=read();
for(int i=;i<=n;i++)a[i]=read();
sort(a+,a+n+);
T.build(,,n);
for(int i=;i<=m;i++){
d[i]=read();b[i]=read();
T.sumv[]+=T.suma[]*(d[i]-d[i-]);T.maxv[]+=1LL*a[n]*(d[i]-d[i-]);
T.addv[]=d[i]-d[i-];ll t=T.find(,,n,b[i]);
if(t==-){puts("");continue;}
ll ans1=T.querysum(,,n,t,n);T.change(,,n,t,n,b[i]);
ll ans2=T.querysum(,,n,t,n);printf("%lld\n",ans1-ans2);
}
}
【bzoj4293】【PA2015】Siano的更多相关文章
- 【BZOJ4293】[PA2015]Siano 线段树
[BZOJ4293][PA2015]Siano Description 农夫Byteasar买了一片n亩的土地,他要在这上面种草. 他在每一亩土地上都种植了一种独一无二的草,其中,第i亩土地的草每天会 ...
- 【疯狂造轮子-iOS】JSON转Model系列之二
[疯狂造轮子-iOS]JSON转Model系列之二 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇<[疯狂造轮子-iOS]JSON转Model系列之一> ...
- 【疯狂造轮子-iOS】JSON转Model系列之一
[疯狂造轮子-iOS]JSON转Model系列之一 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 之前一直看别人的源码,虽然对自己提升比较大,但毕竟不是自己写的,很容易遗 ...
- 【原创分享·支付宝支付】HBuilder打包APP调用支付宝客户端支付
前言 最近有点空余时间,所以,就研究了一下APP支付.前面很早就搞完APP的微信支付了,但是由于时间上和应用上的情况,支付宝一直没空去研究.然后等我空了的时候,发现支付宝居然升级了支付逻辑,虽然目前还 ...
- 【AutoMapper官方文档】DTO与Domin Model相互转换(上)
写在前面 AutoMapper目录: [AutoMapper官方文档]DTO与Domin Model相互转换(上) [AutoMapper官方文档]DTO与Domin Model相互转换(中) [Au ...
- 【Win 10 应用开发】应用预启动
所谓预启动,其实你一看那名字就知道是啥意思了,这是直接译,也找不到比这个叫法更简练的词了.在系统资源允许的情况下(比如电池电量充足,有足够的内存空间),系统会把用户常用的应用程序在后台启动,但不会显示 ...
- 【Win 10 应用开发】启动远程设备上的应用
这个功能必须在“红石-1”(build 14393)以上的系统版中才能使用,运行在一台设备上的应用,可以通过URI来启动另一台设备上的应用.激活远程应用需要以下前提: 系统必须是build 14393 ...
- 【开源】分享2011-2015年全国城市历史天气数据库【Sqlite+C#访问程序】
由于个人研究需要,需要采集天气历史数据,前一篇文章:C#+HtmlAgilityPack+XPath带你采集数据(以采集天气数据为例子),介绍了基本的采集思路和核心代码,经过1个星期的采集,历史数据库 ...
- 【原创分享·微信支付】C# MVC 微信支付教程系列之现金红包
微信支付教程系列之现金红包 最近最弄这个微信支付的功能,然后扫码.公众号支付,这些都做了,闲着无聊,就看了看微信支付的其他功能,发现还有一个叫“现金红包”的玩意,想 ...
- 【原创分享·微信支付】 C# MVC 微信支付教程系列之扫码支付
微信支付教程系列之扫码支付 今天,我们来一起探讨一下这个微信扫码支付.何为扫码支付呢?这里面,扫的码就是二维码了,就是我们经常扫一扫的那种二维码图片,例如,我们自己添 ...
随机推荐
- 洛谷P1345 [USACO5.4]奶牛的电信(最小割)
题目描述 农夫约翰的奶牛们喜欢通过电邮保持联系,于是她们建立了一个奶牛电脑网络,以便互相交流.这些机器用如下的方式发送电邮:如果存在一个由c台电脑组成的序列a1,a2,...,a(c),且a1与a2相 ...
- Eclipse如何将代码变成大写/小写
代码变小写:选中要换的代码,操作Ctrl+Shift+y即可将大写变小写 代码变大写:选中要换的代码,操作Ctrl+Shift+x即可将小写变大写
- Closest Number in Sorted Array
Given a target number and an integer array A sorted in ascending order, find the index i in A such t ...
- listen() 函数
声明:本文来自网络博文的合并,文后有链接. 一.listen函数仅由TCP服务器调用 它做两件事: 1.当socket函数创建一个套接字时,它被假设为一个主动套接字,也就是说,它是一个将调用conne ...
- (转载)Cobalt Strike tutorial下针对CVE-2017-0199利用
CVE-2017-0199利用OLE对象嵌入Word / RTF文档的方式,使得可以在没有用户交互的情况下执行其内容.OLE由许多不同的程序支持,OLE通常用于使在另一个程序中可用的程序中创建的内容. ...
- Python多线程、进程、协程
本节内容 操作系统发展史介绍 进程.与线程区别 python GIL全局解释器锁 线程 语法 join 线程锁之Lock\Rlock\信号量 将线程变为守护进程 Event事件 queue队列 生产者 ...
- thinkphp框架中Model对象$origin对象的作用
在Model的构造函数中,$origin的初始化方式如下 if (is_object($data)) { $this->data = get_object_vars($data); } else ...
- 「Python」python与微信
pip3 install itchat 主要用到的方法: itchat.login() 微信扫描二维码登录 itchat.get_friends() 返回完整的好友列表,每个好友为一个字典, 其中第一 ...
- C#微信开发系列笔记(1)入门指引
(1)基本配置 这节具体的详情请看官方文档,我只提示一点,非常重要,非常容易忽视的,我是吃了苦头的... 在“修改配置”这个地方,如下图: 在URL处,一定要填写http://www.xxx.com/ ...
- JS自学大全
JS是从上往下执行的 console.log();输出语句console.warn();错误提示语句 黄色三角形感叹号console.error();错误提示 红色圆Xalert();弹窗docume ...