买礼物(线段树+set维护)
原题
题意:有两种操作
1 x 表示删去x位置的数
2 l r 表示查询l到r区间是否存在两个数相同。
题解:
w[i]表示i前面与a[i]相同的数a[j]且下标最大的j。w[i]表示i前面与a[i]相同的数a[j]且下标最大的j。w[i]表示i前面与a[i]相同的数a[j]且下标最大的j。
为什么要下标最大的?
因为比如1 4 3 4 4 5
查询区间4到5 存在4相同。那么查询区间2到5 一样会存在4相同,只要记录离自己最近的就可以
rw[i]表示i后面与a[i]相同的数a[j]且下标最小的j。rw[i]表示i后面与a[i]相同的数a[j]且下标最小的j。rw[i]表示i后面与a[i]相同的数a[j]且下标最小的j。
存rw是为了后面修改某个点需要用到,因为修改这个点会影响到后面的那个点。
求w和rw的过程可以用set维护每个值出现的位置。然后正向和反向求一次就可以了
如果不存在这样的数那么w[i]=0,rw[i]=n+1w[i]=0 , rw[i]=n+1w[i]=0,rw[i]=n+1
然后对w[i]建一个最大值线段树
查询时:若区间l到r的最大值大于等于l,说明存在。
修改时:
update(1,l,0);if(rw[l]<=n)update(1,rw[l],w[l]);w[rw[l]]=w[l];rw[w[l]]=rw[l];w[l]=0;rw[l]=n+1;update(1,l,0);\\ if(rw[l]<=n)update(1,rw[l],w[l]);\\ w[rw[l]]=w[l];\\ rw[w[l]]=rw[l];\\ w[l]=0;\\ rw[l]=n+1;\\ update(1,l,0);if(rw[l]<=n)update(1,rw[l],w[l]);w[rw[l]]=w[l];rw[w[l]]=rw[l];w[l]=0;rw[l]=n+1;
跟链表差不多。
#pragma GCC optimize(2)
#include<bits/stdc++.h>
using namespace std;
#define pii pair<int,int>
typedef long long ll;
const int N=5e5+10,G=1e6+10;
int w[N],n,q,k;
struct node
{int l,r;int v;
} tr[4*N];
inline void pushup(int u)
{tr[u].v=max(tr[u<<1].v,tr[u<<1|1].v);
}
void build(int u,int l,int r)
{if(l==r){tr[u]= {l,l,w[l]};return ;}tr[u]= {l,r};int mid=l+r>>1;build(u<<1,l,mid),build(u<<1|1,mid+1,r);pushup(u);
}
int query(int u,int l,int r)
{if(tr[u].l>=l&&tr[u].r<=r)return tr[u].v;int mid=tr[u].l+tr[u].r>>1;int v=0;if(l<=mid)v=query(u<<1,l,r);if(r>mid)v=max(query(u<<1|1,l,r),v);return v;
}
void update(int u,int x,int v)
{if(tr[u].l==x&&tr[u].r==x){tr[u].v=v;}else{int mid=tr[u].l+tr[u].r>>1;if(x<=mid)update(u<<1,x,v);else update(u<<1|1,x,v);pushup(u);}}
int main()
{scanf("%d%d",&n,&q);for(int i=1; i<=n; i++){scanf("%d",&a[i]);if(s[a[i]].size())w[i]=*(--s[a[i]].end());s[a[i]].insert(i);}for(int i=n; i>=1; i--){rw[i]=n+1;if(suf[a[i]].size())rw[i]=*(suf[a[i]].begin());suf[a[i]].insert(i);}build(1,1,n);while(q--){int op,l,r;scanf("%d%d",&op,&l);if(op==1){update(1,l,0);if(rw[l]<=n)update(1,rw[l],w[l]);w[rw[l]]=w[l];rw[w[l]]=rw[l]; w[l]=0;rw[l]=n+1; }else{scanf("%d",&r);if(query(1,l,r)>=l)cout<<1<<'\n';else cout<<0<<'\n';}}return 0;
}
/*
5 5
1 2 3 4 5
1 1
*/
买礼物(线段树+set维护)相关推荐
- 牛客 - 求函数(线段树+区间合并/线段树+矩阵维护)
题目链接:点击查看 题目大意:现在有 n 个函数,每个函数都是诸如 f( x ) = k * x + b 的形式,只是每个函数的 k 和 b 都是相互独立的,现在给出两个操作: 1 pos k b:将 ...
- 【BZOJ2653】middle,主席树(非权值线段树)维护序列和信息+二分答案
传送门 写在前面:虽然这是一道我再也不想写的题目,但很好很有价值 思路: cxlove大神: 要求中位数最大,首先二分中位数,然后判断可行不可行. 判断X可行不可行,对于区间内的数,凡是>=X的 ...
- 时空旅行[线段树分治][维护凸壳]
文章目录 前言 题目 思路 代码 前言 肝了一上午-这是我才学线段树分治的例题-真舒服 题目 温馨提示:首先在UOJ做,LOJ挖数据,BZOJ终极评测... UOJ198 二手剽- 思路 为什么不能用 ...
- HDU 5454 Excited Database 线段树的维护
传送门:HDU5454 Excited Database Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 65535/102400 K ...
- TZOJ 3315 买火车票(线段树区间最小值)
描述 Byteotian州铁道部决定赶上时代,为此他们引进了城市联网.假设城市联网顺次连接着n 个市从1 到n 编号(起始城市编号为1,终止城市编号为n).每辆火车有m个座位且在任何两个运送更多的乘客 ...
- 2019牛客暑期多校训练营(第一场场)_I题Points Division(线段树+DP维护区间最大值)
题目链接: https://ac.nowcoder.com/acm/contest/881/I 题意: 给你n个点,每个点的坐标为(xi,yi),有两个权值ai,bi. 现在要你将它分成A,B两部分, ...
- [HNOIAHOI2018] 转盘(线段树维护单调栈)
problem 洛谷链接 solution 结论:最优方案中一定有一种是全程不停的. 断环成链,接一个 [1,n][1,n][1,n] 在后面形成 2n2n2n 的序列,同时将时间戳逆过来. 转化成: ...
- [NOI2018] 归程(线段树维护并查集的可持久化/kruskal重构树,倍增+dijkstra最短路)
[NOI2018] 归程 description solution1 code1 solution2 code description 题目描述 本题的故事发生在魔力之都,在这里我们将为你介绍一些必要 ...
- [BZOJ 2957]楼房重建(THU2013集训)(线段树维护单调栈)
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2957 分析: 根据题意,就是比较斜率大小 只看一段区间的话,那么这段区间能看见的楼房数量就是这 ...
最新文章
- flutter中的生命周期函数
- ESP32移植wolfssl方法
- centos6.2 64位LNMP(linux+nginx+mysql+php)实现
- BZOJ 4002--有意义的字符串(矩阵乘法)
- Ocelot简易教程(五)之集成IdentityServer认证以及授权
- c语言函数大全语法下载,C语言函数大全(语法).doc
- C#总结(四)调用C++动态库
- mac xcode c++ cin cout注意细节一
- PHP类中Static方法效率测试
- 华为十年架构师实战经验总结:大规模分布式系统架构与设计实战
- 喜讯!云效度量能力获信通院先进级评估
- WordPress多功能主题 The7 更新至 v10.4.3 – 已激活汉化版
- 关于使用联盟链建立本地p2p可插电式混合动力车的智能电网交易的想法
- 中兴--维克多博士问题(背包问题升级版)
- php手机号正则替换中间四位
- 基于MATLAB的特殊函数积分
- js如何判断变量的数据类型
- 北科计算机研究生导师推荐,北京科技大学计算机与通信工程学院-【喜报】我院班晓娟老师荣获第三届“研师亦友——我最喜爱的导师”称号...
- tosmana使用教程_20款最流行的免费定性数据分析工具
- 如何处理多重共线性问题
热门文章
- vue 大量图片展示_Ant Design of Vue 展示多张图片
- 网站 xjjdog.cn,敬请惠存
- 1149:最长单词2
- 显卡刷bios变砖怎么办--关于矿卡,一些惊呆我的骚操作
- PT100热电阻温度阻值对应表
- 键盘移动小div(js原生)
- C语言编译发现注释错误,在对C语言程序进行编译时,可以发现注释行中的拼写错误。...
- 福建省一级计算机考试文字录入,2015福建省机关事业工勤人员计算机文字录入员工作总结.doc...
- Java简单实现猜拳游戏
- python爬取lol所有英雄信息