语法保单合集
语法菜狗自我修养。
struct A { int i; int j; A() : j(0), i(j) { } };
这个代码,由于定义和声明初值的顺序不一样,所以会寄,也就是 i 的取值是未定义行为。
正确写法:
struct A { int j,i; A() : j(0), i(j) { } };
或者
struct A { int i; int j; A() : j(0), i(0) { } };
这个在定义
struct A { Vi f,g A(int n) : g(n), f(g) { } };
我的时候可能会直接 RE,所以还是声明长度好啊。
#define For(i, x, y) for (auto i = (x); i <= (y); i++)
#define int long long
For(i,1,n)ans+=i*i;
此时 \(1\) 是 int 类型,因此 i 是 int,不会被转成 long long,因此直接爆了。
tree<int, null_type, less<int>, rb_tree_tag,
tree_order_statistics_node_update> a,b;
此时 swap(a,b)
是 \(O(n)\) 的,而 a.swap(b)
是 \(O(1)\) 的。
vector 可以 swap
是因为 stl 的容器都特化过了,可以交换,但是 pbds 就不行。
ios::sync_with_stdio(0);
不解释。
长剖传指针,直接 &f[1]
就行,然后可以正常使用。
线段树传 merge
需要定义一个 template
。
static Vi dis(n + 5, Inf);
struct cmp {
bool operator()(int x, int y) { return dis[x] < dis[y]; }
};
priority_queue<int, Vi, cmp> QQ;
pbds::priority_queue<Int, greater<Int>> q;
V<decltype(q)::point_iterator> pos(n + 5);
Vi dis(n + 5, Inf), vis(n + 5);
For(i, 1, n) pos[i] = q.push({Inf, i});
q.modify(pos[sta], {dis[sta] = 0, sta});
while (!q.empty()) {
int x = q.top().se;
q.pop();
if (vis[x]) continue;
vis[x] = 1;
for (auto i : e[x]) {
int y = i.fi, z = i.se;
if (dis[y] > dis[x] + z) q.modify(pos[y], {dis[y] = dis[x] + z, y});
}
}
{&v[0],&v[n+1]}
这句会调用构造函数,复杂度 \(O(n)\)。
正确写法是直接传两个指针,或者干脆直接传下标。