当前位置: 首页 > 编程日记 > 正文

Uva 3767 Dynamic len(set(a[L:R])) 树套树

Dynamic len(set(a[L:R]))

Time Limit: 20 Sec

Memory Limit: 256 MB

题目连接

https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3767

Description

给你n个数,m次操作

Q x y 询问[x+1,y]有多少个不同的数

M x y 将第x+1个数修改成y

Input

n,50000 询问50000次,修改的y的数最大1e6

Output

Sample Input

7 4
1 2 1 3 2 1 4
Q 1 6
M 3 2
Q 1 6
Q 3 5

Sample Output

3
2
1

HINT

题意

题解:

树套树

首先我们对于每个元素,将这个数的值修改成 这个数前面离最近的数,在哪儿

比如样例 1 2 1 3 2 1 4

我们可以看出 0 0 1 0 2 3 0

然后我们每次的询问操作就是查询区间有多少个数小于l,这个就是平衡树或者主席树来解决就好了(划分树已经成为了时代的眼泪

修改的话,就得树套树,然后我们再用set维护一下这个数后面的数是什么,前面的数是什么就好了

注意,修改会修改3个数哦~

代码:

#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<map>
#include<cstring>
#include<set>
#include<ctime>
using namespace std;
inline long long read()
{long long x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;
}
#define maxn 1500005
int tmp=0;
int a[maxn];
int c[maxn];
int b[maxn];
int n,m;
set<int> H[maxn];
////treap
struct Treap
{int root[maxn],sz,s[maxn],ls[maxn],rs[maxn],v[maxn],w[maxn],rnd[maxn];void init(){memset(root,0,sizeof(root));sz=0;}void Updata(int k){s[k]=s[ls[k]]+s[rs[k]]+w[k];}void Rturn(int &k){int t;t=ls[k],ls[k]=rs[t],rs[t]=k,s[t]=s[k];Updata(k);k=t;}void Lturn(int &k){int t;t=rs[k],rs[k]=ls[t],ls[t]=k,s[t]=s[k];Updata(k);k=t;}void Insert(int &k,int num){if(!k){k=++sz;s[k]=w[k]=1;ls[k]=rs[k]=0;rnd[k]=rand();v[k]=num;return;}s[k]++;if(v[k]==num)w[k]++;else if(num<v[k]){Insert(ls[k],num);if(rnd[ls[k]]<rnd[k])Rturn(k);}else{Insert(rs[k],num);if(rnd[rs[k]]<rnd[k])Lturn(k);}}void Del(int &k,int num){if(v[k]==num){if(w[k]>1){w[k]--;s[k]--;return;}if(ls[k]*rs[k]==0)k=ls[k]+rs[k];else if(rnd[ls[k]]<rnd[rs[k]])Rturn(k),Del(k,num);elseLturn(k),Del(k,num);}else if(num<v[k]){Del(ls[k],num);s[k]--;}else{Del(rs[k],num);s[k]--;}}void Find(int k,int num){if(!k)return;if(v[k]<=num){tmp+=s[ls[k]]+w[k];Find(rs[k],num);}else Find(ls[k],num);}
}Tr;//线段树
int lowbit(int x)
{return x&(-x);
}
void Bit_updata(int x,int v)
{if(x==0)return;for(;x<=n;x+=lowbit(x))Tr.Insert(Tr.root[x],v);
}
void Bit_change(int x,int v)
{if(x==0)return;for(;x<=n;x+=lowbit(x))Tr.Del(Tr.root[x],v);
}
void Bit_query(int x,int num)
{if(x<=0)return;for(;x;x-=lowbit(x))Tr.Find(Tr.root[x],num);
}
///

void change(int x,int y)
{Bit_change(x,a[x]);H[b[x]].erase(x);int T = *H[b[x]].upper_bound(x);if(T!=n+5){Bit_change(T,x);Bit_updata(T,a[x]);a[T]=a[x];}b[x]=y;T = *--H[b[x]].upper_bound(x);a[x]=T;int MM = T;Bit_updata(x,a[x]);H[y].insert(x);T = *H[b[x]].upper_bound(x);if(T!=n+5){Bit_change(T,MM);Bit_updata(T,x);a[T]=x;}
}
int main()
{scanf("%d%d",&n,&m);for(int i=0;i<1000005;i++)H[i].insert(0),H[i].insert(n+5);for(int i=1;i<=n;i++){scanf("%d",&b[i]);H[b[i]].insert(i);}for(int i=1;i<=n;i++){a[i]=c[b[i]];c[b[i]]=i;Bit_updata(i,a[i]);}char op[5];int x,y;for(int i=1;i<=m;i++){scanf("%s%d%d",op,&x,&y);x++;if(op[0]=='Q'){int Ans1,Ans2;tmp = 0,Bit_query(y,x-1),Ans1=tmp;tmp = 0,Bit_query(x-1,x-1),Ans2=tmp;printf("%d\n",Ans1-Ans2);}elsechange(x,y);}
}

转载于:https://www.cnblogs.com/qscqesze/p/5007267.html

相关文章:

2022-2028年中国锂电池设备行业深度调研及投资前景预测报告

【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新&#xff08;交付时间约3个工作日&#xff09; 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国锂电池设备行业市场行业相关概述、中国锂电池设备行业市场行业运行环境、分析了中国锂电池…

Cocos Studio的动画系统介绍

Cocos Studio介绍Cocos Studio是一套基于Cocos2D-x的免费游戏开发工具集&#xff0c;它能帮助开发者快速创建游戏资源&#xff0c;将大部分繁琐的游戏开发工作使用编辑器来快速制作&#xff0c;进一步帮助游戏开发者减短开发周期、提高开发效率。Cocos Studio本身不光只是针对[…

机器学习实战源码数据集

链接&#xff1a;https://pan.baidu.com/s/1Ss7x60VXdyQFYW9aiKS0Lg 提取码&#xff1a;9xj6 github下载地址&#xff1a; 转载于:https://www.cnblogs.com/YukiNote/p/11286106.html

blender硬表面建模渲染终极教程

blender硬表面建模渲染终极教程 Gumroad - The ULTIMATE Guide to Hard Ops and Boxcutter Gumroad-硬操作和切箱机的终极指南 教程大小 6G 1920X1080分辨率 语言:英语中文字幕 含案例源文件 云桥网络 平台获取教程 本教程共包含两大部分 第一部分 硬操作和Boxcutter菜单…

Java学习总结:26

线程与进程 进程是程序的一次动态执行过程&#xff0c;它经历了从代码加载、执行到执行完毕的一个完整过程&#xff0c;这个过程也是进程本身从产生、发展到最终消亡的过程。 线程是比进程更小的执行单位&#xff0c;线程是在进程的基础上进行的进一步划分&#xff0c;一个进程…

UINavigationController技巧一——修改返回按钮的标题

UINavigationController 一般push到另一界面后&#xff0c;返回按钮标题便是上一页面的title&#xff0c;但是对于push的第一页或者是上一页面没有title的&#xff0c;返回按钮标题便是默认back&#xff0c;如图所示 在本页面修改title没有用&#xff0c;试了很多办法终于找到 …

Idea groovy表生成实体类带注释

Idea groovy表生成实体类带注释 1.点开datasourse&#xff0c;打开idea带的数据库工具&#xff0c;具体添加数据库连接&#xff0c;这里不描述。 这时点击会生成一个poji 这时生成的pojo中是不带中文注释的&#xff0c;需要自己配置&#xff0c;往下&#xff1a; 3.根据图中的步…

fflush函数的深入理解

本人昵称sky&#xff0c;欢迎与各位多多交流学习 这样的c程序想必大家都不陌生&#xff0c;fflush()这个函数有清除输入输出缓存的功能&#xff0c;那很多人就会问了&#xff0c;什么是清除输入输出缓存呢&#xff1f; 其实就是我们在printf输出的时候&#xff0c;是先输出到一…

VS快捷键专题

如要初始化VS开发环境,使用如下命令:开始->运行->键入“devenv.exe /resetuserdata”。 ShiftAltEnter: 切换全屏编辑CtrlB,T / CtrlK,K: 切换书签开关CtrlB,N / CtrlK,N: 移动到下一书签CtrlB,P: 移动到上一书签CtrlB,C: 清除全部标签CtrlI: 渐进式搜索CtrlShiftI: 反向…

Maya阿诺德室外环境灯光照明和渲染技术学习视频教程

Maya阿诺德室外环境灯光照明和渲染技术学习视频教程 Maya and Arnold_ Exterior Lighting and Rendering 教程时长 1小时47分 大小 1.1G 1280X720分辨率 使用软件&#xff1a;Maya 、 Arnold、PS 共八大章 33小节 语言&#xff1a;英语机译中文字幕 作者推荐 翻译还算比较准确…

Java学习总结:27

多线程常用操作方法 线程的命名与取得 由于多线程的状态不确定&#xff0c;所以线程的名字就成为了唯一的分辨标记&#xff0c;则在定义线程名称时一定要在线程启动之前设置名字&#xff0c;尽量不要重名&#xff0c;且尽量不要为已经启动动的线程修改名字。 由于线程状态的不…

Routing

假如有一个请求&#xff1a;localhost/home/index&#xff0c;那么路由需要做的事情如下&#xff1a; &#xff08;1&#xff09;确定Controller &#xff08;2&#xff09;确定Action &#xff08;3&#xff09;确定其他参数 &#xff08;4&#xff09;根据识别出来的数据&…

2022-2028年中国锂电材料产业投资分析及前景预测报告

【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新&#xff08;交付时间约3个工作日&#xff09; 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国锂电材料行业市场行业相关概述、中国锂电材料行业市场行业运行环境、分析了中国锂电材料行…

专为物联网开发的开源操作系统Contiki(转)

专为物联网开发的开源操作系统Contiki(转) (2012-04-19 15:31:09)原文网址&#xff1a;http://blog.sina.com.cn/s/blog_6de000c201010z7n.htmlContiki 是一个小型的&#xff0c;开源的&#xff0c;极易移植的多任务电脑操作系统。它专门设计以适用于一系列的内存首先的网络…

【转】ASP.NET Page事件的执行顺序

Page 执行中将按照如下顺序激活事件&#xff1a;Page.PreInitPage.InitPage.InitComplitePage.PreLoadPage.LoadPage.LoadCompletePage.PreRenderPage.PreRenderComplete如果页面从令一个页面继承&#xff0c;如BasePage:System.Web.UI.Page&#xff0c;在BasePage中做了一些扩…

blender动画全面学习教程

大小解压后&#xff1a;31.8G 时长28小时 包含项目文件 1920X1080 MP4 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09; Gumroad——活着&#xff01;Blender中的动画课程 云桥网络 平台获取课程&#xff01; 信息: Alive&#xff01;是迄今…

Java学习总结:28

线程的同步和死锁 在程序开发中&#xff0c;所有程序都是通过主方法执行的&#xff0c;而主方法本身就属于一个主线程&#xff0c;所以通过主方法创建的新的线程对象都是子线程。 利用子线程可以进行异步的操作处理&#xff0c;这样可以在不影响主线程运行的前提下进行其他操作…

BZOJ1202: [HNOI2005]狡猾的商人

Description 刁姹接到一个任务&#xff0c;为税务部门调查一位商人的账本&#xff0c;看看账本是不是伪造的。账本上记录了n个月以来的收入情况&#xff0c;其中第i 个月的收入额为Ai(i1,2,3...n-1,n)&#xff0c; 。当 Ai大于0时表示这个月盈利Ai 元&#xff0c;当 Ai小于0时表…

导出swagger2生成的文档

百度了好多篇用法&#xff0c;没法用。特此记录一下 一、下载项目 下载https://github.com/Swagger2Markup/spring-swagger2markup-demo下的项目&#xff0c;保存&#xff0c;注意文件路径不要有中文。我们称这个项目为A项目。 没错这个项目就是专门根据json解析生成文档的。…

把三千行代码重构为15行

2019独角兽企业重金招聘Python工程师标准>>> 如果你认为这是一个标题党&#xff0c;那么我真诚的恳请你耐心的把文章的第一部分读完&#xff0c;然后再下结论。如果你认为能够戳中您的G点&#xff0c;那么请随手点个赞。 把三千行代码重构为15行 那年我刚毕业&#…

一起学WPF系列(2):第一个WPF应用程序

概述 Windows Presentation Foundation (WPF) 是下一代显示系统&#xff0c;用于生成能带给用户震撼视觉体验的 Windows 客户端应用程序。使用 WPF&#xff0c;您可以创建广泛的独立应用程序以及浏览器承载的应用程序。一直以来&#xff0c;我对界面的东西是不怎么感兴趣的&am…

Java学习总结:29

线程间的经典操作案例——生产者与消费者案例 程序基本模型&#xff1a; package Project.Study.Multithreading;class Message{private String title; //保存信息的标题private String content; //保存信息的内容public void setTitle(String title) {this.title title;}…

Blender终极角色创造:从初学者到专业人士

Ultimate character creation in Blender: From beginner to pro 流派:电子学习| MP4 |视频:h264&#xff0c;1280720 |音频:AAC&#xff0c;48.0 KHz 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09; |大小解压后:24.8 GB 含建模参考图 |时长…

2022-2028年中国离心机行业市场研究及前瞻分析报告

【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新&#xff08;交付时间约3个工作日&#xff09; 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国离心机行业市场行业相关概述、中国离心机行业市场行业运行环境、分析了中国离心机行业市场…

Shell 十三问 的学习记录

在 BBS上看到了Shell十三问的帖子&#xff0c;由于比较就远了&#xff0c;怕以后再也找不到了&#xff0c;就把笔记贴过来了&#xff0c; 原帖地址&#xff1a; shell 十三问http://bbs.chinaunix.net/thread-2033675-1-1.html 贴出我做的笔记&#xff1a; <一>、为何叫做…

图解八大排序算法——我见过的最详细的讲解(转)

一、分类 1.内部排序和外部排序  内部排序&#xff1a;待排序记录存放在计算机随机存储器中&#xff08;说简单点&#xff0c;就是内存&#xff09;进行的排序过程。外部排序&#xff1a;待排序记录的数量很大&#xff0c;以致于内存不能一次容纳全部记录&#xff0c;所以在排…

UE4创建第一人称射击游戏学习教程 Unreal Engine 4: Create Your Own First-Person Shooter

UE4创建第一人称射击游戏学习教程本课程包含38节视频课&#xff0c;将逐步指导您完成以下主题: 云桥网络 平台获取课程&#xff01; 如何创建6种可定制的武器(包括手枪、突击步枪、猎枪、狙击枪、榴弹发射器和火箭发射器) 如何制作基于命中扫描和投射的武器 如何制作第一人…

PS多形式的部分之间复制“笨办法”

PS剪切页面&#xff0c;有时候你可能会遇到这样的情况&#xff1a;设计改进&#xff0c;但是&#xff0c;我们要具有相同的切片。 在此假设&#xff0c;可以直接用于切割片。我们可以节省大量的时间&#xff0c;又分为片。 但是&#xff0c;人们一般不会在你的上跨片设计PSD在变…

Java学习总结:30

线程的生命周期 suspend()方法&#xff1a;暂时挂起线程&#xff1b; resume()方法&#xff1a;恢复挂起的线程&#xff1b; stop()方法&#xff1a;停止线程。 对于以上三个方法不推荐使用&#xff0c;它们已经被慢慢废除掉了&#xff0c;主要原因是这三个方法在使用时容易产…

SVN优化(一) SVN忽略maven项目的target

SVN优化(一) SVN忽略maven项目的target 一 eclipse刚开始导入的项目: 二 解决办法 方式一&#xff1a; 在项目代码路径,如: F:\xyx\sl 鼠标右键,“TortoiseSVN”-- >“Settings” -->"Subversion"-->"Global ignore pattern" 添加:target *.…