求區間不同數的個數【主席樹求解】
線上
模板
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=100010;
int a[N],b[N],rt[N*20],ls[N*20],rs[N*20],sum[N*20],vis[N*20];
int id;
void build(int &o,int l,int r)
{
o=++id;
sum[o]=0;
if(l==r) return;
int m=(l+r)>>1;
build(ls[o],l,m);
build(rs[o],m+1,r);
}
void update(int &o,int l,int r,int last,int pos,int val)
{
o=++id;
ls[o]=ls[last];
rs[o]=rs[last];
sum[o]=sum[last]+val;
if(l==r) return;
int m=(l+r)>>1;
if(pos<=m)
update(ls[o],l,m,ls[last],pos,val);
else
update(rs[o],m+1,r,rs[last],pos,val);
}
//查詢區間[L,R]內小於等於k的個數
int query(int pos,int root,int l,int r)
{
if(l==r)
return sum[root];
int m=(l+r)>>1;
if(m>=pos)
return sum[rs[root]]+query(pos,ls[root],l,m);
else
return query(pos,rs[root],m+1,r);
}
int main()
{
int T,n,q,l,r,k;
scanf("%d",&T);
for(int t=1;t<=T;t++){
memset(vis,0,sizeof(vis));
scanf("%d%d",&n,&q);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
id=0;
build(rt[0],1,n);
for(int i=1;i<=n;i++){
if(!vis[a[i]])//如果a[i]還未出現過
update(rt[i],1,n,rt[i-1],i,1);
else{//如果a[i]已經出現了
int pos=vis[a[i]];
int temp;
update(temp,1,n,rt[i-1],pos,-1);
update(rt[i],1,n,temp,i,1);
}
vis[a[i]]=i;
}
while(q--){
scanf("%d%d",&l,&r);
int num=query(l,rt[r],1,n);
printf("%d\n",num);
}
}
return 0;
}
相關文章
- 求區間不同數的個數【樹狀陣列求解】陣列
- HDU-4348 - To the moon (主席樹+區間修改)
- 洛谷 - P6292 區間本質不同子串個數(SAM+LCT+線段樹)
- 【主席數】可持續化線段樹
- 【Leetcode每日一題】327. 區間和的個數(線段樹/樹狀陣列)LeetCode每日一題陣列
- 輸出一個區間內的質數(素數)
- 線段樹維護區間等差數列
- 快速求完全二叉樹的節點個數二叉樹
- [leetCode]327. 區間和的個數LeetCode
- 求完全數個數
- 主席樹
- Leetcode 327. 區間和的個數 (字首和 + 離散化 + 樹狀陣列)LeetCode陣列
- 求解數獨
- 求三個數的最小公倍數
- 引數為二叉樹和一個整數,求所有和為該整數的路徑二叉樹
- 327. 區間和的個數 (歸併排序)排序
- bzoj3110: [Zjoi2013]K大數查詢(主席樹+樹狀陣列)陣列
- 主席樹模板
- 統計整數區間[N,M](N,M<100000)中所以非偶數的合數個數,並輸出這個數。
- 求最小k個數
- [演算法] 兩個質數的乘積是707829217,求解該質數演算法
- 輸入10個整數,求最大數
- 用一個巨集實現求兩個數中的最大數
- 3069 求n個整數的和
- 斯特林數求解
- (40/60)整數拆分、不同的二叉搜尋樹
- 伯努利數,求解自然數冪和的關鍵係數
- 求下一個大數
- 區間眾數(分塊)
- 靜態主席樹模板
- 動態主席樹模板
- 杭電OJ 2028求n個數的最小公倍數
- Python求10個數的平均數實戰案例講解!Python
- 梯度下降法中導數的求解梯度
- Python求一個數的平方根Python
- JavaScript 獲取指定區間的數字JavaScript
- 生成指定區間的隨機小數隨機
- 大數翻倍法求解CRT