正题

题目连接:https://codeforces.com/contest/1556/problem/E


题目大意

两个长度为\(n\)的序列\(a,b\),\(q\)次询问一个区间\([l,r]\)。

在这个区间中你每次可以选择一个长度为偶数的下标递增的序列,让奇数位置的\(a\)加一,偶数位置的\(b\)加\(1\)。

求最少操作次数使得每个\(a_i=b_i\)。

\(n,q\leq 10^5\)


解题思路

视为一个减一个加的话,令\(x_i=b_i-a_i\)这样就变成了每个需要加/减的次数。

可以视为每个减后面需要跟一个加,加前面需要跟一个减,而加后面可以免费跟一个减。

把需要减的看成\((\),需要加的看成\()\)的话就能看出来无论什么区间的情况下每个\((\)都是和同一个\()\)匹配或者无法匹配。

离线询问,开两个栈分别存\((\)和\()\),然后一个树状数组用来记录每个位置需要的左端点位置上限,另一个记录每个左端点对应的权值即可。

时间复杂度\(O(n\log n+q\log n)\)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stack>
#define ll long long
#define lowbit(x) (x&-x)
using namespace std;
const ll N=1e5+10;
struct node{
ll l,r,id;
}q[N];
ll n,m,a[N],c[N],d[N],t[N],s[N],ans[N];
stack<int> S,T;
void Change(ll x,ll val){
x=n-x+1;
while(x<=n){
t[x]+=val;
x+=lowbit(x);
}
return;
}
ll Ask(ll x){
ll ans=0;x=n-x+1;
while(x){
ans+=t[x];
x-=lowbit(x);
}
return ans;
}
void Dhange(ll x,ll val){
x=n-x+1;
while(x<=n){
s[x]=min(s[x],val);
x+=lowbit(x);
}
return;
}
ll Bsk(ll x){
ll ans=n+1;x=n-x+1;
while(x){
ans=min(ans,s[x]);
x-=lowbit(x);
}
return ans;
}
bool cmp(node x,node y)
{return x.r<y.r;}
signed main()
{
scanf("%lld%lld",&n,&m);
for(ll i=1;i<=n;i++)
scanf("%lld",&a[i]);
for(ll i=1,x;i<=n;i++)
scanf("%lld",&x),a[i]=x-a[i];
for(ll i=1;i<=m;i++)
scanf("%lld%lld",&q[i].l,&q[i].r),q[i].id=i;
sort(q+1,q+1+m,cmp);
memset(s,0x3f,sizeof(s));
c[0]=1e18;S.push(0);
for(ll i=1,z=1;i<=n;i++){
if(a[i]>0){
ll x=a[i];Change(i,x);
while(!T.empty()&&d[T.top()]<x)
x-=d[T.top()],Change(T.top(),-d[T.top()]),T.pop();
if(!T.empty())d[T.top()]-=x,Change(T.top(),-x);
S.push(i);c[i]=a[i];
}
if(a[i]<0){
ll x=-a[i];
while(c[S.top()]<x)
x-=c[S.top()],S.pop();
c[S.top()]-=x;Dhange(i,S.top());
if(c[S.top()]==0)S.pop();
T.push(i);d[i]=-a[i];
}
while(z<=m&&q[z].r==i){
if(q[z].l<=S.top()||q[z].l>Bsk(q[z].l))ans[q[z].id]=-1;
else ans[q[z].id]=Ask(q[z].l);
z++;
}
if(z>m)break;
}
for(ll i=1;i<=m;i++)
printf("%lld\n",ans[i]);
return 0;
}

CF1556E-Equilibrium【栈,树状数组】的更多相关文章

  1. 牛客小白月赛13-H(单调栈+树状数组)

    题目链接:https://ac.nowcoder.com/acm/contest/549/H 题意:给一个柱状图,包括每个矩阵的宽度和高度,求能组成的最大矩阵的面积. 思路:显然最大矩阵的高一定为n个 ...

  2. bzoj 4826: [Hnoi2017]影魔【单调栈+树状数组+扫描线】

    参考:https://www.cnblogs.com/lcf-2000/p/6789680.html 这是一个相对码量少的做法,用到了区间修改区间查询的树状数组,详见:www.cnblogs.com/ ...

  3. BZOJ.4826.[AHOI/HNOI2017]影魔(树状数组/莫队 单调栈)

    BZOJ LOJ 洛谷 之前看\(mjt\)用莫队写了,以为是一种正解,码了3h结果在LOJ T了没A= = 心态爆炸(upd:发现是用C++11(NOI)交的,用C++11交就快一倍了...) 深刻 ...

  4. BZOJ1146[CTSC2008]网络管理——出栈入栈序+树状数组套主席树

    题目描述 M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个 部门之间协同工作,公司搭建了一个连接整个公司的通信网络.该网络的结构由N个路由器和N-1条 ...

  5. Bzoj4237 cdq分治+树状数组+单调栈

    二维平面在某区域内点的问题,要么树套树,kdtree,要么就是cdq分治了.然而这题树套树和kdtree都不是很好搞的样子,于是我们就只能cdq分治了.首先把点按照横坐标x排序,在每一层我们需要算出右 ...

  6. 【bzoj4540】[Hnoi2016]序列 单调栈+离线+扫描线+树状数组区间修改区间查询

    题目描述 给出一个序列,多次询问一个区间的所有子区间最小值之和. 输入 输入文件的第一行包含两个整数n和q,分别代表序列长度和询问数.接下来一行,包含n个整数,以空格隔开,第i个整数为ai,即序列第i ...

  7. BZOJ4237 稻草人(分治+树状数组+单调栈)

    如果要询问的某个纵坐标为inf的点左边是否有点能与其构成所要求的矩形,只要用个单调栈就可以了.可以想到用分治来制造单调性. 按横坐标排序,每次考虑跨过分治中心的矩形.考虑右边的每个点能与左边的哪些点构 ...

  8. 【手动开栈】【dfs序】【树状数组】【Tarjan】bzoj2819 Nim

    考虑树状数组区间修改(只对其子树的答案有影响)点查询,每个点记录的是它到根路径上的权值异或和. 答案时query(L)^query(R)^a[lca]. 这种方法在支持区间加法.减法的树上询问的时候可 ...

  9. 大视野 1012: [JSOI2008]最大数maxnumber(线段树/ 树状数组/ 单调队列/ 单调栈/ rmq)

    1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 9851  Solved: 4318[Submi ...

随机推荐

  1. Quartz任务调度(4)JobListener分版本超详细解析

    JobListener 我们的jobListener实现类必须实现其以下方法: 方法 说明 getName() getName() 方法返回一个字符串用以说明 JobListener 的名称.对于注册 ...

  2. mycat《对应关系》

  3. tensorflow 单机多卡 官方cifar10例程

    测试了官方历程,看没有问题,加上时间紧任务重,就不深究了. 官方tutorials:https://www.tensorflow.org/tutorials/images/deep_cnn githu ...

  4. 八款优秀Linux浏览器推荐

    #1.Firefox:互联网革命的新典范   众所周知,Firefox最大的优点就是拥有数以千计的插件,能够使得用户个性化自己的浏览器.与此同时,Firefox还是一款时尚.快捷.创新.高效的浏览器, ...

  5. canal数据同步

    前面提到数据库缓存不一致的几种解决方案,但是在不同的场景下各有利弊,而今天我们使用的canal进行缓存与数据同步的方案是最好的,但是也有一个缺点,就是相对前面几种解决方案会引入阿里巴巴的canal组件 ...

  6. python类、继承

    Python 是一种面向对象的编程语言.Python 中的几乎所有东西都是对象,拥有属性和方法.类(Class)类似对象构造函数,或者是用于创建对象的"蓝图". 一.python ...

  7. QT开发实战一:图片显示

    测试平台 宿主机平台:Ubuntu 12.04.4 LTS 目标机:Easy-ARM IMX283 目标机内核:Linux 2.6.35.3 QT版本:Qt-4.7.3 Tslib版本:tslib-1 ...

  8. Python - repr()、str() 的区别

    总的来说 str():将传入的值转换为适合人阅读的字符串形式 repr():将传入的值转换为 Python 解释器可读取的字符串形式 传入整型 # number resp = str(1) print ...

  9. Python 高级特性(5)- 迭代器 Iterator

    前言 迭代器貌似是 Python3 才有的(猜的),在廖雪峰大神的网站中 Python2 是没有迭代器一栏的 可 for 循环的对象 常见集合数据类型(迭代对象):list.tuple.dict.se ...

  10. Appium问题解决方案(4)- Error while obtaining UI hierarchy XML file: com.android.ddmlib.SyncException

    背景 操作步骤 运行 uiautomatorviewer.bat 点击左上角的 Device ScreensShot 报错 截图 解决方法 网上还是有很多方法的,可能造成的原因不同,我是第六种方法解决 ...