離線做法:
列舉右端點r,右端點固定時,記錄最右邊第一次出現的數字為1,比如1 2 1 2 3,0 0 1 1 1 .給定l,那麼l-r區間數字種類的結果是:sum[r]-sum[l-1].
把詢問按r從小到大排序,我們r+1時,維護的陣列只改變r+1為1,和r+1的數之前出現的位置變為0即可。
//kx
#include using namespace std;
typedef long long ll;
typedef double db;
//unordered_mapmp;
const int m= 1e5+7;
int a[m];
int root[m*26],st[m*26];
int ls[m*26],rs[m*26];
int cnt;
void up(int pre,int &o,int l,int r,int x,int d)
int qu(int o,int l,int r,int x)
int m=(l+r)/2;
if(x<=m)return qu(ls[o],l,m,x)+qu(rs[o],m+1,r,x);
else return qu(rs[o],m+1,r,x);
}mapmp;
int main()
else
mp[a[i]]=i;
} scanf("%d",&q);
for(int i=1;i<=q;i++)
} return 0;
}
(線段樹統計區間種類)
第14屆中北大學程式設計競賽來了,集訓隊新買了一大堆氣球,氣球一共有k種顏色 1 k 256 氣球的顏色從1 k編號。zbt童心未泯,他發明了一種擺放氣球的遊戲,規則如下。一排有n個桌子,每張桌子上只有乙個氣球插孔,即每張桌子最多只能放乙個氣球。編號分別為1 n 1 n 100000 每張桌子一開始...
SPOJ DQUERY 區間數字統計
鏈結 我是鏈結,點我呀 題意 題意 題解 因為區間的端點移動乙個單位的話,只會涉及到乙個元素的增多或減少。因此可以用莫隊演算法來解決。只需要開乙個陣列 大小1百萬 用下標來快速檢索元素的個數即可。include define ll long long using namespace std stru...
SPOJ DQUERY 線段樹查詢區間不同值
題意 給定乙個序列,和許多區間,查詢不同區間內不同數的個數。include include include include using namespace std const int maxn 30005 const int maxq 2e5 5 struct nnode maxq bool cmp...