Comet OJ-栈的数据结构题【线段树】

正题

题目链接:https://cometoj.com/contest/79/problem/E?problem_id=4207


题目大意

nnn个栈,要求支持操作

  1. l∼rl\sim rlr区间内的栈压入一个数
  2. l∼rl\sim rlr区间内的栈弹出一个数
  3. 求第xxx个栈内第kkk个数

解题思路

对于每个询问我们其实就是要求在他之前的第一个位置使得栈内有t−kt-ktk个数的操作。

我们可以倒着跑,维护一个线段树表示每个询问的“倒计时”,如果是压入就对于所有询问−1-11,弹出就是+1+1+1,然后每次操作后0的询问答案就是该次操作。

这里可以先把没有接触到的询问都赋值为infinfinf,触碰到后再修改“倒计时”

时间复杂度O(nlog⁡n)O(n\log n)O(nlogn)


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
#define lowbit(x) (x&-x)
using namespace std;
const ll N=2e5+10,inf=1e9;
ll n,q,l[N],r[N],v[N];
ll cnt,p[N],L[N],R[N],ans[N];
ll w[N*4],num[N*4],lazy[N*4];
void Merge(ll x){w[x]=min(w[x*2],w[x*2+1]);if(w[x*2]<w[x*2+1])num[x]=num[x*2];else num[x]=num[x*2+1];return;
}
void Downdata(ll x){if(!lazy[x])return;w[x*2]+=lazy[x];w[x*2+1]+=lazy[x];lazy[x*2]+=lazy[x];lazy[x*2+1]+=lazy[x];lazy[x]=0;return;
}
void Build(ll x,ll l,ll r){if(l==r){w[x]=inf;num[x]=l;return;}ll mid=(l+r)>>1;Build(x*2,l,mid);Build(x*2+1,mid+1,r);Merge(x);return;
}
void Updata(ll x,ll L,ll R,ll pos,ll val){if(L==R)w[x]=val;if(L>=R)return;ll mid=(L+R)>>1;Downdata(x);if(pos<=mid)Updata(x*2,L,mid,pos,val);else if(pos>mid)Updata(x*2+1,mid+1,R,pos,val);Merge(x);return;
}
void Add(ll x,ll L,ll R,ll l,ll r,ll val){if(L>R||l>r)return;if(L<1||R>cnt)return;if(l<=L&&R<=r){w[x]+=val;lazy[x]+=val;return;}ll mid=(L+R)>>1;Downdata(x);if(r<=mid)Add(x*2,L,mid,l,r,val);else if(l>mid)Add(x*2+1,mid+1,R,l,r,val);else Add(x*2,L,mid,l,r,val),Add(x*2+1,mid+1,R,l,r,val);Merge(x);return;
}
bool cmp(ll x,ll y)
{return (l[x]==l[y])?(x<y):(l[x]<l[y]);}
int main()
{scanf("%lld%lld",&n,&q);for(ll i=1;i<=q;i++){char op[10];scanf("%s",op);if(op[1]=='u'){scanf("%lld%lld%lld",&l[i],&r[i],&v[i]);}if(op[1]=='o'){scanf("%lld%lld",&l[i],&r[i]);v[i]=-inf;}if(op[1]=='i'){scanf("%lld%lld",&l[i],&r[i]);p[++cnt]=i;}}sort(p+1,p+1+cnt,cmp);for(ll i=0;i<=n+1;i++)L[i]=cnt+1;for(ll i=1;i<=cnt;i++){v[p[i]]=-i;L[l[p[i]]]=min(L[l[p[i]]],i);R[l[p[i]]]=max(R[l[p[i]]],i);}for(ll i=n-1;i>=1;i--)L[i]=min(L[i],L[i+1]);for(ll i=2;i<=n;i++)R[i]=max(R[i],R[i-1]);if(!cnt)return 0;Build(1,1,cnt);for(ll i=q;i>=1;i--){if(v[i]>=0){Add(1,1,cnt,L[l[i]],R[r[i]],-1);while(w[1]<=0){ans[p[num[1]]]=v[i];Updata(1,1,cnt,num[1],inf);}}else if(v[i]<-cnt)Add(1,1,cnt,L[l[i]],R[r[i]],1);else{Updata(1,1,cnt,-v[i],r[i]);}}for(ll i=1;i<=q;i++)if(v[i]>=-cnt&&v[i]<0)printf("%lld\n",ans[i]);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/321228.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

codeforces gym-101755 I-Guess the Tree 交互题、分治、树的直径

题目 题目链接 题意 n2h−1&#xff0c;且1≤n≤1023n2h−1&#xff0c;且1≤n≤1023你可以最多询问2.5∗logn12∗n2.5∗log2n1∗n次&#xff0c;任意两点的距离&#xff0c;让你还原一颗完全二叉树。 题解 第一步、肯定要求整棵树的根节点。 由于这是一颗完全二叉树&…

【01背包】最大约数和(jzoj 2126)

最大约数和 题目大意&#xff1a; 选若干个正整数&#xff0c;和不小于S&#xff0c;使每个数的因数&#xff08;不包括本身&#xff09;之和最大 样例输入 11 样例输出 9 数据范围限制 对于30%的数据&#xff0c; S<10&#xff1b; 对于100%的数据&#xff0c; S …

微软75亿收购Github,微软以开发者为中心的初心不变

前天关于微软要收购 GitHub 的消息传出后&#xff0c;很多人都纷纷讨论&#xff0c;希望 GitHub 能够独立存在&#xff0c;不被任何大厂收购&#xff0c;可是 GitHub 也要生存啊。那又有人说&#xff1a;希望是 Google 来收购 GitHub &#xff0c;而不是微软&#xff0c;在大家…

nssl1476-联【线段树】

正题 题目大意 无限长的010101序列&#xff0c;每次进行一个操作 区间内赋值为000区间内赋值为111区间取反 求第一个000的位置 解题思路 离散化&#xff08;储存每个区间的左右端点和他们加一之后的值&#xff09;后可以用线段树储存第一个000和第一个111的位置。然后区间取…

洛谷-P3396 哈希冲突 分块

题目 题目链接 题意 给你个数列&#xff0c;编号为1…n1…n。 给出两种操作&#xff1a; 查询操作&#xff1a;查询所有编号模xx得y" role="presentation" style="position: relative;">yy的对应数字之和。修改操作&#xff1a;把编号为xx的数…

简明 ASP.NET Core 手册

编者&#xff1a;在4月份推送过这篇文章 简明 ASP.NET Core 手册 &#xff0c;今天再次推荐这篇文章&#xff0c;是因为原作者更新到了新版本1.1.0&#xff0c;改动很大&#xff0c;几乎所有章节都有很大程度的调整&#xff0c;这些调整都是根据读者的建议而做&#xff0c;而且…

【模拟】【递归】电子表格(jzoj 2127)

电子表格 题目大意&#xff1a; 有一个Excel文档&#xff0c;有4中操作&#xff1a;input输入一个格子的值&#xff0c;output输出一个格子的值&#xff0c;sum某个格子等于一块矩形中的总值&#xff08;矩形中的总值改变&#xff0c;这个格子也要改变&#xff09;&#xff0…

nssl1477-赛【对顶堆,贪心】

正题 题目大意 nnn个物品&#xff0c;有两个人&#xff0c;每个人有一些喜欢的物品。 选mmm个物品&#xff0c;至少选择kkk个第一个人喜欢的和kkk个第二个人喜欢的物品 解题思路 首先我们必定是选最小的 我们从小到大枚举选择多少两个人都喜欢的物品iii&#xff0c;然后每人选…

洛谷-P1903 数颜色 分块 bitset

题目 题目链接 题意 给你一个数列代表不同的颜色&#xff08;可以修改&#xff09;。 询问一段区间内有多少种颜色。 题解 很容易想到的就是线段树来维护bitset。 这里为了练习&#xff0c;使用分块维护bitset。 * 事实上线段树可以看成是无限分块。* 修改的时候直接暴…

《你必须掌握的Entity Framework 6.x与Core 2.0》正式出版感想

前言借书正式出版之际&#xff0c;完整回顾下从写博客到写书整个历程&#xff0c;也算是对自己近三年在技术上的一个总结&#xff0c;整个历程可通过三个万万没想到来概括&#xff0c;请耐心阅读。写博、写书完整历程回顾从2013年12月注册博客园账号&#xff0c;注册博客园账号…

2019.01.27【NOIP普及组】模拟赛C组总结

总结 这次比赛的得分是&#xff1a;1001001000300 这次比赛第一题推了一会&#xff0c;推出了公式&#xff0c;马上A掉了&#xff0c;第二题之前做过&#xff0c;当做复习&#xff0c;写了大概半小时&#xff0c;第三题打了一下表&#xff0c;又写了个01背包&#xff0c;A掉&a…

nssl1478-题【dp】

正题 题目大意 nnn个苹果&#xff0c;依次来mmm个人会在两个苹果(ui,vi)(u_i,v_i)(ui​,vi​)中选择一个吃&#xff08;如果都没了就不吃了&#xff09; 求有多少对苹果可以同时存活 解题思路 设gi,jg_{i,j}gi,j​表示iii不吃时jjj是否必吃&#xff0c;我们从后到前枚举边&…

Entity Framework Core 2.1带来更好的SQL语句生成方案

微软发布了Entity Framework Core2.1&#xff0c;为EF开发者带来了很多期待已久的特性。EF Core 2.1增加了对SQL GROUP BY的支持&#xff0c;支持延迟加载和数据种子等。EF Core 2.1的第一个重要新增特性是将GroupBy操作符翻译成包含GROUP BY子句的SQL。缺乏这种支持被认为是EF…

洛谷-P2801 教主的魔法 分块

题目 题目链接 题意 修改&#xff1a;将一个区间内所有的数C。查询&#xff1a;查询一个区间内>C的数字有多少个。 题解 很经典的分快算法题目。 将数列分块以后&#xff0c;对块内的元素进行排序。 当我们要做修改操作的时候&#xff1a;遇到要修改的完整的块的时候…

【枚举】数列(jzoj 1507)

数列 题目大意&#xff1a;给出一个等差数列的初始值和差值还有一个等比数列的处值和比值&#xff0c;问不大于n的数中&#xff0c;问这两个序列中&#xff0c;有多少个数小于n&#xff08;只要在一个序列中就行了&#xff0c;在两个序列中只记一次&#xff09; 样例输入 1 …

AT4352-[ARC101C] Ribbons on Tree【dp,容斥】

正题 题目链接: https://www.luogu.com.cn/problem/AT4352 https://atcoder.jp/contests/arc101/tasks/arc101_c 题目大意 nnn个点之间两两配对&#xff0c;要求配对点之间的路径覆盖整棵树&#xff0c;求方案数 解题思路 考虑容斥&#xff0c;我们钦定有lll条边没有路径覆盖…

洛谷-P3203 弹飞绵羊 分块

题目 题目链接 题意 据说这道题要用一道叫做LCT的数据结构&#xff0c;然而我不会。。。 一排有n个弹簧装置&#xff0c;从第ii个可一往后跳k[i]" role="presentation" style="position: relative;">k[i]k[i]步。 修改&#xff1a;修改某个位…

【模拟】蚂蚁(jzoj 1508)

蚂蚁 题目大意&#xff1a; 有n只蚂蚁&#xff0c;他们各往一个方向走&#xff08;上北&#xff0c;下南&#xff0c;左西和有东四个方向&#xff09;&#xff0c;他们如果撞到一起就会直接消失&#xff0c;每个单位时间走一格&#xff0c;但有一种情况&#xff1a;两只蚂蚁相…

P3302-[SDOI2013]森林【主席树,LCA,启发式合并】

正题 题目链接:https://www.luogu.com.cn/problem/P3302 题目大意 nnn个点的一个森林&#xff0c;要求支持以下操作 连接两个不连通的点询问两个点之间最短路径上第kkk大的数 解题思路 需要支持查询第kkk大&#xff0c;是必定使用主席树的&#xff0c;所以考虑如何合并两棵树…

codeforces gym-101741 Cover the Paths LCA、离线询问

题目 题目链接 题意 给出一棵树。 给出一堆路径&#xff0c;找出最少一个最少的点的集合&#xff0c;使得所有的路径都经过集合中的至少一个点。 题解 考虑一个路径的两个端点&#xff0c;从下往上最后一个能被经过的点就是这两点的LCA。 因此我们做整棵树dfs&#xff0…