查詢任意區間內不同元素的個數

2022-06-27 03:27:12 字數 2730 閱讀 7909

#include using namespace std;

#define ll long long

const int maxn = 2e5+5;

const int mod = 1e9+7;

const double eps = 1e-9;

const double pi = acos(-1.0);

const int inf = 0x3f3f3f3f;

template inline void in(_t &_a)

while(_ch>='0' && _ch<='9')_a=(_a<<1)+(_a<<3)+_ch-'0',_ch=getchar();

if(_f)_a=-_a;

}int n, q;

int pre[maxn];

struct node

t[maxn*40];

int cnt;

int root[maxn];

void init()

int mp[maxn];

void update(int num, int &rt, int add, int l, int r)

int query(int pos, int rt, int l, int r)

int main()

n *= 2;

init();

for(int i = 1; i <= n; i++)

else

mp[pre[i]] = i;

}int jie = n/2;

while(q--)

}

return 0;

}

2 . 莫隊 (乙個好的輸入掛就可以了)

using namespace std;

#define ll long long

const int maxn = 2e5+5;

const int mod = 1e9+7;

const double eps = 1e-9;

const double pi = acos(-1.0);

const int inf = 0x3f3f3f3f;

int read()

while (ch >= '0'&&ch <= '9')

return x*f;

}int n, q;

int pre[maxn];

struct node

}a[maxn];

int cnt[maxn], num[maxn];

int ans;

inline void add(int x)

inline void remove(int x)

int main()

int uu = n;

n = n*2;

int unit = sqrt(n);

for(int i = 1; i <= q; i++)

sort(a+1, a+1+q);

int l=a[1].l, r= a[1].l-1;

ans=0;

for(int i = 1; i <= q; i++)

for(int i = 1; i <= q; i++)

}return 0;

}

3 . 樹狀陣列

樹狀陣列維護的是 i 這個位置對應的數出現在**, 當對應的數第一次出現時,直接將此位置新增到進去,當之前出現過時,先將上一次出現的位置處 -1 , 再將此位置 +1 。

再直觀的看一下就是 x1, x2, * , *, x5, x6。 * 表示此位置的元素在後面出現過,顧將其置 0 ,非 * 的位置表示的是此位置有乙個不同的元素,樹狀陣列內部維護的元素同時保證了唯一性,當要查詢某乙個區間時,只需要去計算一下 c[r] - c[l-1] 即可

**示例:

#include using namespace std;

#define ll long long

const int maxn = 2e5+5;

const int mod = 1e9+7;

const double eps = 1e-9;

const double pi = acos(-1.0);

const int inf = 0x3f3f3f3f;

int n, q;

int pre[maxn];

struct node

}arr[maxn];

int last[maxn];

int c[maxn], vis[maxn];

int lowbit(int k)

void add(int pos, int pt)

}int ans[maxn];

int getsum(int x)

return res;}

int main()

for(int i = 1; i <= q; i++);

}n = n*2;

sort(arr+1, arr+1+q);

int k = 1;

for(int i = 1; i <= n; i++)

else

vis[pre[i]] = 1;

while(i == arr[k].r)

last[pre[i]] = i;

}for(int i = 1; i <= q; i++)

}return 0;

}

判斷區間內的素數個數

package method public class stest package method 編寫乙個有兩個執行緒的程式,第乙個執行緒用來計算2 100000之間的素數的個數,第二個執行緒用來計算100000 200000之間的素數的個數,最後輸出結果 author administrator ...

查詢區間內等於x的數的個數(分塊)

問題 有乙個有n個數的陣列,q次查詢,每次查詢l,r x,查詢區間 l,r 內等於x的數的個數 思路 分塊。就把這題當成是分塊的入門題來講解一下分塊。分塊其實就是一種比較優美的暴力 我覺得 一般的分塊都是把長度為n的陣列分成每一塊為sqrt n 個數的多個塊。然後對於區間的操作就可以不再是乙個乙個數...

刪除區間內的元素(線性表)

time limit 1 sec memory limit 2 mb submit 95 solved 29 submit status web board 若乙個線性表l採用順序儲存結構,其中元素都為整數。設計乙個演算法,刪除元素值在 x,y 之間的所有元素,要求演算法的時間複雜度為o n 空間複...