语法保单合集

语法菜狗自我修养。


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)\)

正确写法是直接传两个指针,或者干脆直接传下标。

posted @ 2023-09-19 10:07  houzhiyuan  阅读(32)  评论(0编辑  收藏  举报