#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 空間複...