template<typename T>
struct Bit {
inline int lowbit(int i) { return i & (-i); }
T dat[N];
void clear(int n) {
memset(dat, 0, sizeof(T) * (n + 1));
}
inline void add(int i, T x) {
for (; i<N; i+=lowbit(i))
dat[i] += x;
}
inline T sum(int i) {
T res = 0;
for (; i; i-=lowbit(i))
res += dat[i];
return res;
}
};
- 注意把骚操作去掉
template<typename T>
struct node {
int id;
T v;
node(int id=-1, T v=-0x3f3f3f3f) :id(id), v(v) {}
bool operator < (const node &other) const {
return v < other.v;
}
};
template<typename T>
struct segT {
node<T> dat[M << 2];
int nn;
inline void pu(int rt) {
dat[rt] = max(dat[rt << 1], dat[rt << 1 | 1]);
}
void init(int n) {
nn = 1;
while (nn < n) nn <<= 1;
for (int i=1; i<=n; ++i)
dat[i + nn - 1] = node<T>(i);
for (int i=nn+n; i<2*nn; ++i)
dat[i] = node<T>();
for (int i=nn-1; i>=1; --i)
pu(i);
}
inline void u(int i, T x) {
i += nn;
if (dat[i].v >= x)
return;
dat[i].v = x;
for (i>>=1; i; i>>=1)
pu(i);
}
int L, R;
node<T> q(int l, int r, int rt) {
// dbg(l, r, rt, L, R, dat[rt].v);
if (L <= l && r <= R)
return dat[rt];
int m = (l+r) >> 1;
node<T> v1, v2;
if (L <= m) v1 = q(l, m, rt<<1);
if (m+1<=R) v2 = q(m+1, r, rt<<1|1);
return max(v1, v2);
}
inline node<T> q(int l, int r) {
++l; ++r;
if (l > r)
return node<T>();
L = l; R = r;
return q(1, nn, 1);
}
};
template<typename T>
struct snode {
int id;
T v;
snode (int id=0, T v=0):id(id), v(v) {}
bool operator < (const snode &other) const {
if (v != other.v) return v < other.v;
else return id < other.id;
}
};
// template<typename T>
// typedef snode T;
template<typename T>
struct segT {
T dat[N << 2];
LL lazy[N << 2];
int nn;
void init(int n) {
nn = 1;
while (nn < n)
nn <<= 1;
for (int i=1; i<=n; ++i)
dat[i+nn-1] = snode<int>(i, 0);
for (int i=nn+n; i<2*nn; ++i)
dat[i] = snode<int>(-1, -INF);
for (int i=nn-1; i>=0; --i)
pu(i);
}
inline void pd(int rt) {
if (lazy[rt]) {
int ls = rt << 1, rs = rt << 1 | 1;
dat[ls].v = dat[rs].v = lazy[ls] = lazy[rs] = lazy[rt];
lazy[rt] = 0;
}
}
inline void pu(int rt) {
dat[rt] = max(dat[rt<<1], dat[rt<<1|1]);
}
int L, R;
void u(int l, int r, int rt, int v) {
if (L <= l && r <= R) {
dat[rt].v = lazy[rt] = v;
return;
}
int m = (l+r) >> 1;
pd(rt);
if (L <= m) u(l, m, rt<<1, v);
if (m+1<=R) u(m+1, r, rt<<1|1, v);
pu(rt);
}
T q(int l, int r, int rt) {
// dbg(l, r, rt, dat[rt].v);
if (L <= l && r <= R) {
return dat[rt];
}
int m = (l + r) >> 1; pd(rt);
T v1 = snode<int>(-1, -INF), v2 = snode<int>(-1, -INF);
if (L <= m) v1 = q(l, m, rt<<1);
if (m+1<=R) v2 = q(m+1, r, rt<<1|1);
pu(rt);
return max(v1, v2);
}
void u(int l, int r, int x) {
// dbg(l, r, x);
L = l;
R = r;
u(1, nn, 1, x);
}
T q(int l, int r) {
L = l;
R = r;
return q(1, nn, 1);
}
};
segT<snode<int>> seg;
头文件:
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/hash_policy.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#include <ext/pb_ds/priority_queue.hpp>
#include <ext/pb_ds/trie_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
用于替代 unordered_map
整数插入操作 stl 3.6s, pbds 探测法 2s
gp_hash_table<int, int> mp;
cc_hash_table<int, int> mp2;
- 用来替代
map
,第二个类型填null_type
就是set
- key 会 自动去重
example:
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/hash_policy.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
tree<int, int, greater<int>, rb_tree_tag, tree_order_statistics_node_update> tr;
/*
int key 类型 int value 类型,可用 null_type 替代
less<int> 表示 key 从小到大,对应 greater<int>
rb_tree_tag 红黑树,可用 splay_tree_tag 替代
insert erase order_by_key find_by_order
lower_bound upper_bound
a.join(b) 将 b 并入 a
a.split(v, b) 将 key <= v 保留给 a,其他给 b
*/
int main(int argc, char const *argv[])
{
tr.insert(make_pair(2, 2));
tr.insert(make_pair(1, 1));
tr.find(1)->second ++;
for (auto x : tr)
cout << x.first << ' ' << x.second << endl;
puts("===");
tr.insert(make_pair(1, 3));
for (auto x : tr)
cout << x.first << ' ' << x.second << endl;
puts("===");
tr.erase(1);
for (int i=0; i<tr.size(); ++i)
{
auto p = tr.find_by_order(i);
cout << p->first << ' ' << p->second << ' ' << tr.order_of_key(p->first) << endl;
}
puts("===");
auto x = tr.lower_bound(1);
cout << (x == tr.end()) << endl;
return 0;
}
/* outcome
2 2
1 2
===
2 2
1 2
===
2 2 0
===
1
*/
int p2[10], Log[N];
struct ST {
static const int SP = 10;
int dat[SP][N];
void init() {
p2[0] = 1;
for (int i=1; i<SP; ++i)
p2[i] = p2[i-1] << 1;
Log[1] = 0;
for (int i=2; i<N; ++i)
Log[i] = Log[i >> 1] + 1;
}
void init(int a[], int n)
{
for (int i=1; i<=n; ++i)
dat[0][i] = a[i];
for (int i=1; i<SP; ++i)
for (int j=1; j<=n; ++j)
dat[i][j] = min(dat[i-1][j], dat[i-1][j + p2[i-1]]);
}
int q(int l, int r) {
int Lg = Log[r-l+1];
return min(dat[Lg][l], dat[Lg][r-p2[Lg]+1]);
}
} ds[N];