原题
题意:有两种操作
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维护)相关推荐

  1. 牛客 - 求函数(线段树+区间合并/线段树+矩阵维护)

    题目链接:点击查看 题目大意:现在有 n 个函数,每个函数都是诸如 f( x ) = k * x + b 的形式,只是每个函数的 k 和 b 都是相互独立的,现在给出两个操作: 1 pos k b:将 ...

  2. 【BZOJ2653】middle,主席树(非权值线段树)维护序列和信息+二分答案

    传送门 写在前面:虽然这是一道我再也不想写的题目,但很好很有价值 思路: cxlove大神: 要求中位数最大,首先二分中位数,然后判断可行不可行. 判断X可行不可行,对于区间内的数,凡是>=X的 ...

  3. 时空旅行[线段树分治][维护凸壳]

    文章目录 前言 题目 思路 代码 前言 肝了一上午-这是我才学线段树分治的例题-真舒服 题目 温馨提示:首先在UOJ做,LOJ挖数据,BZOJ终极评测... UOJ198 二手剽- 思路 为什么不能用 ...

  4. HDU 5454 Excited Database 线段树的维护

    传送门:HDU5454 Excited Database Time Limit: 1500/1000 MS (Java/Others)    Memory Limit: 65535/102400 K ...

  5. TZOJ 3315 买火车票(线段树区间最小值)

    描述 Byteotian州铁道部决定赶上时代,为此他们引进了城市联网.假设城市联网顺次连接着n 个市从1 到n 编号(起始城市编号为1,终止城市编号为n).每辆火车有m个座位且在任何两个运送更多的乘客 ...

  6. 2019牛客暑期多校训练营(第一场场)_I题Points Division(线段树+DP维护区间最大值)

    题目链接: https://ac.nowcoder.com/acm/contest/881/I 题意: 给你n个点,每个点的坐标为(xi,yi),有两个权值ai,bi. 现在要你将它分成A,B两部分, ...

  7. [HNOIAHOI2018] 转盘(线段树维护单调栈)

    problem 洛谷链接 solution 结论:最优方案中一定有一种是全程不停的. 断环成链,接一个 [1,n][1,n][1,n] 在后面形成 2n2n2n 的序列,同时将时间戳逆过来. 转化成: ...

  8. [NOI2018] 归程(线段树维护并查集的可持久化/kruskal重构树,倍增+dijkstra最短路)

    [NOI2018] 归程 description solution1 code1 solution2 code description 题目描述 本题的故事发生在魔力之都,在这里我们将为你介绍一些必要 ...

  9. [BZOJ 2957]楼房重建(THU2013集训)(线段树维护单调栈)

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2957 分析: 根据题意,就是比较斜率大小 只看一段区间的话,那么这段区间能看见的楼房数量就是这 ...

最新文章

  1. flutter中的生命周期函数
  2. ESP32移植wolfssl方法
  3. centos6.2 64位LNMP(linux+nginx+mysql+php)实现
  4. BZOJ 4002--有意义的字符串(矩阵乘法)
  5. Ocelot简易教程(五)之集成IdentityServer认证以及授权
  6. c语言函数大全语法下载,C语言函数大全(语法).doc
  7. C#总结(四)调用C++动态库
  8. mac xcode c++ cin cout注意细节一
  9. PHP类中Static方法效率测试
  10. 华为十年架构师实战经验总结:大规模分布式系统架构与设计实战
  11. 喜讯!云效度量能力获信通院先进级评估
  12. WordPress多功能主题 The7 更新至 v10.4.3 – 已激活汉化版
  13. 关于使用联盟链建立本地p2p可插电式混合动力车的智能电网交易的想法
  14. 中兴--维克多博士问题(背包问题升级版)
  15. php手机号正则替换中间四位
  16. 基于MATLAB的特殊函数积分
  17. js如何判断变量的数据类型
  18. 北科计算机研究生导师推荐,北京科技大学计算机与通信工程学院-【喜报】我院班晓娟老师荣获第三届“研师亦友——我最喜爱的导师”称号...
  19. tosmana使用教程_20款最流行的免费定性数据分析工具
  20. 如何处理多重共线性问题

热门文章

  1. vue 大量图片展示_Ant Design of Vue 展示多张图片
  2. 网站 xjjdog.cn,敬请惠存
  3. 1149:最长单词2
  4. 显卡刷bios变砖怎么办--关于矿卡,一些惊呆我的骚操作
  5. PT100热电阻温度阻值对应表
  6. 键盘移动小div(js原生)
  7. C语言编译发现注释错误,在对C语言程序进行编译时,可以发现注释行中的拼写错误。...
  8. 福建省一级计算机考试文字录入,2015福建省机关事业工勤人员计算机文字录入员工作总结.doc...
  9. Java简单实现猜拳游戏
  10. python爬取lol所有英雄信息