博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
7.14的某毒瘤题 维护队列题解
阅读量:5022 次
发布时间:2019-06-12

本文共 1399 字,大约阅读时间需要 4 分钟。

思路by lyd,ych

我们参考选择客栈的思路,设pre[i]是i前面一个和i颜色相同的画笔,col[i]记录i的颜色

我们发现,当pre[i]<l<=i<=r时,col[i]第一次出现在区间[l,r]中

我们的问题是区间[l,r]中有多少不同的颜色,也就是统计区间[l,r]中有多少颜色是第一次出现

这样查询就被我们切掉了

然后就是令人崩溃的修改。

我们修改一个点i,需要知道pre[i],满足pre[j]=i的j,以及更改之后pre[i]是多少

我们可以对每一个颜色搞一个set(最多1e6颜色不会爆空间的)。在修改点i的时候,在set里面找到i的后继,令pre[i的后继]=i的前驱,然后把i从原来的set中删掉,更改col[i]。在新的set里面更新pre[i]。

注意:每个set要先插入0,inf以防找到一些神奇的玩意。

正解:带修莫队我不会

不会

差点T飞的代码

#include
using namespace std;inline int read(){ char ch=getchar(); int x=0;bool f=0; while(ch<'0'||ch>'9') { if(ch=='-')f=1; ch=getchar(); } while(ch>='0'&&ch<='9') { x=(x<<3)+(x<<1)+(ch^48); ch=getchar(); } return f?-x:x;}const int inf=214748364;set
qaq[1000009];set
::iterator qwq,www,owo;int n,m,col[500009],pre[500009],lst[500009];int main(){ n=read(); m=read(); for(int i=1;i<=n;i++) qaq[i].insert(0),qaq[i].insert(inf); for(int i=1;i<=n;i++) { col[i]=read(); pre[i]=lst[col[i]]; lst[col[i]]=i; qaq[col[i]].insert(i); } for(int i=1;i<=m;i++) { char cz=getchar(); while(cz!='Q'&&cz!='R')cz=getchar(); int gs1=read(),gs2=read();//搞事1,搞事2 if(cz=='Q') { int gs=0; for(int i=gs1;i<=gs2;i++) if(pre[i]

 

转载于:https://www.cnblogs.com/lcez56jsy/p/11232916.html

你可能感兴趣的文章
十大经典预测算法(六)---集成学习(模型融合算法)
查看>>
用php做一个简单的注册用户功能
查看>>
一款基于css3的3D图片翻页切换特效
查看>>
Feign使用Hystrix无效原因及解决方法
查看>>
Sizeof与Strlen的区别与联系
查看>>
hadoop2.2.0_hbase0.96_zookeeper3.4.5全分布式安装文档下载
查看>>
Flutter 贝塞尔曲线切割
查看>>
golang 的编译安装以及supervisord部署
查看>>
easyui源码翻译1.32--Dialog(对话框窗口)
查看>>
阿里架构师,讲述基于微服务的软件架构模式
查看>>
Eclipse导入maven项目时,Pom.xml文件报错处理方法
查看>>
01、JAVA开发准备
查看>>
asp.net mvc 错误处理 - 自定义报错处理,生成错误日志
查看>>
Linux centos ssh
查看>>
R语言之避免for循环示例
查看>>
[转]jQuery 选择器和dom操作
查看>>
Jenkins+Maven+SVN快速搭建持续集成环境(转)
查看>>
bootstrap 媒体查询
查看>>
杜教筛
查看>>
《Ext JS模板与组件基本知识框架图----模板》
查看>>