CF1556E-Equilibrium【栈,树状数组】

1|0正题

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


1|1题目大意

两个长度为n的序列a,bq次询问一个区间[l,r]

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

求最少操作次数使得每个ai=bi

n,q105


1|2解题思路

视为一个减一个加的话,令xi=biai这样就变成了每个需要加/减的次数。

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

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

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

时间复杂度O(nlogn+qlogn)


1|3code

#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; }

__EOF__

本文作者QuantAsk
本文链接https://www.cnblogs.com/QuantAsk/p/15205641.html
关于博主:退役OIer,GD划水选手
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   QuantAsk  阅读(45)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示