正题

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


题目大意

两个长度为nnn的序列a,ba,ba,b,qqq次询问一个区间[l,r][l,r][l,r]。

在这个区间中你每次可以选择一个长度为偶数的下标递增的序列,让奇数位置的aaa加一,偶数位置的bbb加111。

求最少操作次数使得每个ai=bia_i=b_iai​=bi​。

n,q≤105n,q\leq 10^5n,q≤105


解题思路

视为一个减一个加的话,令xi=bi−aix_i=b_i-a_ixi​=bi​−ai​这样就变成了每个需要加/减的次数。

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

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

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

时间复杂度O(nlog⁡n+qlog⁡n)O(n\log n+q\log n)O(nlogn+qlogn)


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. [NOI Online 2022 提高组] 丹钓战(单调栈 + 树状数组 / 主席树)

    problem luogu-P8251 solution 按照题意模拟单调栈. 求出对于 iii 而言,当时单调栈的栈顶元素记为 pip_ipi​. 如果到 iii 时,栈顶已经为 pip_ipi​ ...

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

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

  4. CF1621G Weighted Increasing Subsequences(离散化+树状数组优化dp+栈维护后缀最大值+计数)

    problem luogu-link solution 显然单独考虑每个 iii 的贡献,即被多少个合法上升子序列包含. 令 x=max⁡{j∣j>i∧aj>ai}x=\max\{j\ | ...

  5. **PAT_甲级_1057 Stack (30分) (C++)【字符串处理/栈的模拟/树状数组】

    目录 1,题目描述 题目大意 2,思路 数据结构 函数讲解 1,void update(int x, int v): 2,int getsum(int x): 3,void PeekMedian(): ...

  6. 【BZOJ2434】[NOI2011]阿狸的打字机 AC自动机+DFS序+树状数组

    [BZOJ2434][NOI2011]阿狸的打字机 Description 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P ...

  7. 最长上升子序列(LIS)/最长不上升子序列问题算法详解+例题(树状数组/二分优化,看不懂你来打我)

    目录 最长上升子序列 一.朴素做法O(2n)O(2^n)O(2n) 二.优化做法O(nlogn)O(nlogn)O(nlogn) 三.例题引入:P1020 导弹拦截(求最长上升子序列和最长不上升子序列 ...

  8. HDU 4358 树状数组+思路

    http://acm.hdu.edu.cn/showproblem.php?pid=4358 如图所示,当k==3时,如果我们扫描到红线所在的位置. 则符合条件的区间就是从红线到两条紫线所包含的区间( ...

  9. [算法学习] 线段树,树状数组,数堆,笛卡尔树

    都是树的变种,用途不同 [线段树 Interval Tree] 区间管理,是一种平衡树 可看做是对一维数组的索引进行管理.一维数组不需要是排序好的 深度不超过logL 任一个区间(线段)都分成不超过2 ...

最新文章

  1. 重磅图书——PHP MySQL开发新圣经
  2. Scala单例对象(伴生对象)
  3. Unity3D Image 组件附入图片问题
  4. 前端二十九:两个盒子居中的练习
  5. mysql sql语句大全
  6. redis+aop防重复提交
  7. C语言基础:C语言宏定义(4) - 多文件编译
  8. 网页设计的css样式,网页设计引入CSS样式的五种方式_css
  9. 计算机硬件系统的构成教学设计,2.1 计算机硬件系统教学设计思路
  10. Java-类加载内存分析
  11. Ruby 101:重用、隐藏和多态
  12. 在c语言中利用链表常见问题,C语言,链表中遇到棘手有关问题
  13. [其他]Ubuntu安装genymotion后unable to load VirtualBox engine
  14. 2. 创建多网站和商店(Creating Multiple Websites and Stores)
  15. maven helper解决依赖冲突问题
  16. echarts x轴文字个数太多_echartsX轴文本数据太长溢出问题
  17. “华为杯”中国研究生数学建模竞赛 记录
  18. 新能源汽车电池健康状态及能耗分析
  19. 商汤的AI伴游小精灵(2019 计蒜之道 初赛 第一场)
  20. 省份对应拼音(MicroStrategy)

热门文章

  1. e2200网卡驱动 linux,Linux驱动修炼之道-驱动中一些常见的宏
  2. sql 多表多行模糊查询_从零开始学习SQL(五)多表查询
  3. google的api key调用次数是多少_Sprint Boot如何基于Redis发布订阅实现异步消息系统的同步调用?...
  4. requestmapping注解访问404_【框架】127:几个非常重要的注解
  5. java基础代码下载_Java基础(一)(示例代码)
  6. 查询2021抚顺高考成绩,2021年抚顺高考状元是谁分数多少分,历年抚顺高考状元名单...
  7. 数据结构 - 二叉树
  8. 万字总结webpack实战案例配置
  9. [mybatis]Configuration XML_typeHandlers
  10. [C++11]弱引用智能指针weak_ptr初始化和相关的操作函数