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=,f=;char ch=getchar();
- while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
- while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
- return x*f;
- }
- #define maxn 1500005
- int tmp=;
- 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,,sizeof(root));
- sz=;
- }
- 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]=;ls[k]=rs[k]=;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]>){
- w[k]--;
- s[k]--;
- return;
- }
- if(ls[k]*rs[k]==)
- k=ls[k]+rs[k];
- else if(rnd[ls[k]]<rnd[rs[k]])
- Rturn(k),Del(k,num);
- else
- Lturn(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==)return;
- for(;x<=n;x+=lowbit(x))
- Tr.Insert(Tr.root[x],v);
- }
- void Bit_change(int x,int v)
- {
- if(x==)return;
- for(;x<=n;x+=lowbit(x))
- Tr.Del(Tr.root[x],v);
- }
- void Bit_query(int x,int num)
- {
- if(x<=)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+)
- {
- 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+)
- {
- Bit_change(T,MM);
- Bit_updata(T,x);
- a[T]=x;
- }
- }
- int main()
- {
- scanf("%d%d",&n,&m);
- for(int i=;i<;i++)
- H[i].insert(),H[i].insert(n+);
- for(int i=;i<=n;i++)
- {
- scanf("%d",&b[i]);
- H[b[i]].insert(i);
- }
- for(int i=;i<=n;i++)
- {
- a[i]=c[b[i]];
- c[b[i]]=i;
- Bit_updata(i,a[i]);
- }
- char op[];int x,y;
- for(int i=;i<=m;i++)
- {
- scanf("%s%d%d",op,&x,&y);x++;
- if(op[]=='Q')
- {
- int Ans1,Ans2;
- tmp = ,Bit_query(y,x-),Ans1=tmp;
- tmp = ,Bit_query(x-,x-),Ans2=tmp;
- printf("%d\n",Ans1-Ans2);
- }
- else
- change(x,y);
- }
- }
Uva 3767 Dynamic len(set(a[L:R])) 树套树的更多相关文章
- (待修莫队 没过! 抽空在检查)Dynamic len(set(a[L:R])) UVA - 12345
#include <iostream> #include <cstdio> #include <sstream> #include <cstring> ...
- Dynamic len(set(a[L:R])) UVA - 12345(这么过分一定要写博客)
给出一个有n个元素的数组,有以下两种操作:Q x y,求出区间[x,y)内不同元素的个数, M x y,把第x个元素的值修改为y.注意题目中的下标是从0开始的 这题超级超级坑 妈的一个水题找了几个小时 ...
- 【题解】Luogu UVA12345 Dynamic len(set(a[L:R]))
原题传送门 这题要用动态莫队,我博客里有介绍 这道题和luogu P1903 [国家集训队]数颜色 / 维护队列差不多,解法就在上面那篇博客里qaq 主要的问题是如何排序? 排序有三个关键字: 1.左 ...
- 【BZOJ1901】 Zju2112 Dynamic Rankings(树套树)
[题意] 给定一个含有n个数的序列a[1],a[2],a[3]--a[n], 程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+2]--a[j]中第k小的数是多少(1≤k ...
- bzoj 1901: Zju2112 Dynamic Rankings(树套树)
1901: Zju2112 Dynamic Rankings 经典的带改动求区间第k小值问题 树套树模板,我是用的线段树套splay实现的,并且用的数组模拟的,所以可能空间略大,bzoj过了,zoj过 ...
- zoj2112 Dynamic Rankings (主席树 || 树套树)
The Company Dynamic Rankings has developed a new kind of computer that is no longer satisfied with t ...
- 【BZOJ】1901: Zju2112 Dynamic Rankings(区间第k小+树套树)
http://www.lydsy.com/JudgeOnline/problem.php?id=1901 这题调了我相当长的时间,1wa1a,我是第一次写树套树,这个是树状数组套splay,在每个区间 ...
- [luogu2617][bzoj1901][Zju2112]Dynamic Rankings【树套树+树状数组+主席树】
题目网址 [传送门] 题目大意 请你设计一个数据结构,支持单点修改,区间查询排名k. 感想(以下省略脏话inf个字) 真的强力吹爆洛谷数据,一般的树套树还给我T了一般的点,加强的待修主席树还给我卡了几 ...
- 【bzoj1901】dynamic ranking(带修改主席树/树套树)
题面地址(权限题) 不用权限题的地址 首先说说怎么搞带修改主席树? 回忆一般的kth问题,我们的主席树求的是前缀和,这样我们在目标区间的左右端点的主席树差分下就能求出kth. 那么我们如何支持修改操作 ...
随机推荐
- 转载RabbitMQ入门(4)--路由
路由 (使用Java客户端) 在先前的指南中,我们建立了一个简单的日志系统.我们可以将我们的日志信息广播到多个接收者. 在这部分的指南中,我们将要往其中添加一个功能-让仅仅订阅一个消息的子集成为可能. ...
- 【转】Masonry介绍与使用实践(快速上手Autolayout)
原文网址:http://adad184.com/2014/09/28/use-masonry-to-quick-solve-autolayout/ 前言 1 MagicNumber -> aut ...
- 【转】iOS 通过xib自定义UITableViewCell【原创】
原文网址:http://blog.it985.com/9683.html 在使用tableView的时候,如果cell的布局过于复杂,通过代码搭建的话不够直观.并且要不停的调整位置,字体什么的.这时, ...
- 组以逗号分隔的子串及跨平update join
下列语句可以对组以逗号分隔的子串 set @device_cd_array += ', ' set @device_cd_array += @nodeid ,, '') update时要join表要先 ...
- linux中waitpid及wait的用法
wait(等待子进程中断或结束) 表头文件 #include<sys/types.h> #include<sys/wait.h> 定义函数 pid_t wa ...
- Android WindowManager 监听返回键及home键
一.监听home键盘,Android Home键系统负责监听,捕获后系统自动处理.有时候,我们需要监听home键处理自己的逻辑,监听方法如下: /** * 监听home键广播 */ private f ...
- 如何解决Rally模板提示angular js加载错误
[前言] Rally是一个开源测试工具,用于测试openstack各个组件的性能 在使用Rally测试完毕后,一般会生成测试报告,这点很重要.但是原生态的Rally报告模板angular js框架是从 ...
- angular form-data文件上传
前言:很久没更新博客,最近公司pc端技术选型用angular,这几天就赶鸭子上架,硬着头皮直接上手angular.其中有许多小坑陆陆续续踩起走.今天就遇到一个比较常见的问题:图片上传. 主题:图片上传 ...
- mysql_connect v/s mysql_pconnect
原文:mysql_connect v/s mysql_pconnect 译文:mysql_connect v/s mysql_pconnect 译者:dwqs 当需要使用PHP连接MySQL数据库的时 ...
- 大连网络赛 1006 Football Games
//大连网络赛 1006 // 吐槽:数据比较水.下面代码可以AC // 但是正解好像是:排序后,前i项的和大于等于i*(i-1) #include <bits/stdc++.h> usi ...