2025-11-7 10:20:00 TOP-BOTTOM-THEME
Enable/Disable Transition
Copyright © 2023 ~ 2025 Sinktank - 1328312655@qq.com
Illustration from 稲葉曇『リレイアウター/Relayouter/中继输出者』,by ぬくぬくにぎりめし.

工具

VsCode 缺省源
{
	"FRZ": {
		"prefix": "FRZ",
		"body": [
			"#include <bits/stdc++.h>",
			"",
			"using namespace std;",
			"",
			"using i64 = long long;",
			"",
			"void read() {}",
			"template<typename T, typename ...U> void read(T &x, U& ...arg) {",
			"  x = 0; int f = 1; char ch = getchar();",
			"  while (ch > '9' || ch < '0') { if (ch == '-') f = -1; ch = getchar(); }",
			"  while (ch >= '0' && ch <= '9') x = x * 10 + ch - '0', ch = getchar();",
			"  x *= f; read(arg...);",
			"}",
			"",
			"void write() {}",
			"template<typename T> void write(T x) {",
			"  if (x < 0) { putchar('-'), x = -x; }",
			"  if (x > 9) write(x / 10);",
			"  putchar(x % 10 + '0');",
			"}",
			"",
			"template<typename T, typename U> void write(T x, U y) {",
			"  write(x); putchar(y);",
			"}",
			"",
			"template<typename T> void chkmin(T &a, T b) { a = min(a, b); }",
			"template<typename T> void chkmax(T &a, T b) { a = max(a, b); }",
			"",
			"#define rep(i, a, b) for (int i = (a); i <= (b); i++)",
			"#define per(i, a, b) for (int i = (a); i >= (b); i--)",
			"",
			"int main() {",
			"#ifdef LOCAL",
			"  freopen(\"code.in\", \"r\", stdin);",
			"  freopen(\"code.out\", \"w\", stdout);",
			"  auto start_time = chrono::high_resolution_clock::now();",
			"#endif",
			"",
			"",
			"",
			"#ifdef LOCAL",
			"  auto end_time = chrono::high_resolution_clock::now();",
			"  auto duration = chrono::duration_cast<chrono::milliseconds>(end_time - start_time);",
			"  cerr << \"Time cost \" << duration.count() << \" ms\" << endl; ",
			"#endif",
			"  return 0;",
			"}",
			"",
			"// START AT ${CURRENT_YEAR} / ${CURRENT_MONTH} / ${CURRENT_DATE} ${CURRENT_HOUR} : ${CURRENT_MINUTE} : ${CURRENT_SECOND}"
		],
		"description": "FRZ"
	}
}
对拍
#include <iostream>
#include <cstdio>
#include <ctime>

using namespace std;

int main() {
  int id = 0;
  while (true) {
    system("random.exe");
    time_t st = clock();
    system("A.exe");
    time_t ed = clock();
    system("bf.exe");

    if (system("fc bf.out A.out")) {
      printf("Case:%d, Wrong Answer, time is %.lfs\n", ++id, ed - st);
      return 0;
    } else {
      printf("Case:%d, Accept Answer, time is %.lfs\n", ++id, ed - st);
    }
  }
}
数据生成基础
#include <bits/stdc++.h>

using namespace std;

int random(int n) { // 生成 [1, n] 中的数。
  return (rand() * rand() % n) + 1;
}

int random_R(int n) { // 生成 [-n, n] 中的数
  return (rand() * rand() % (2 * n) + 1) - n;
}

int main() {
  freopen("z_example.in", "w", stdout);
  srand(chrono::system_clock::now().time_since_epoch().count()); // 毫秒级别的随机生成种子
  return 0;
}
生成一颗以 1 为根,父节点比子节点小的树
#include <bits/stdc++.h>
 
using namespace std;
 
int random(int n) { // 生成 [1, n] 中的数。
    return (rand() * rand() % n) + 1;
}
 
int random_R(int n) { // 生成 [-n, n] 中的数
    return ((long long)rand() * rand() % (2 * n) + 1) - n;
}

int main() {
    freopen("z_example.in", "w", stdout);
    srand(chrono::system_clock::now().time_since_epoch().count()); // 毫秒级别的随机生成种子
    int n = random(100);
    printf("%d\n", n);

    // 点权
    // for (int i = 1; i <= n; i++) printf("%d ", random_R(1000));
    // puts("");
    for (int i = 2; i <= n; i++) {
        int fa = random(i - 1);
        printf("%d %d\n", fa, i);
    }

    return 0;
}
代码模版
  • FHQ Treap基础
    struct FHQ_Treap {
        int rd[N], ls[N], rs[N], val[N], sz[N], node, R;
        mt19937 rnd;
    
        FHQ_Treap() { rnd.seed(chrono::system_clock::now().time_since_epoch().count()); }
    
        int nd(int v) {
            int x = ++node;
            return rd[x] = rand(), sz[x] = 1, val[x] = v, x;
        }
    
        void up(int rt) {
            sz[rt] = sz[ls[rt]] + sz[rs[rt]] + 1;
        }
    
        int mer(int p, int q) {
            if (!p || !q) return p | q;
            if (rd[p] > rd[q]) return rs[p] = mer(rs[p], q), up(p), p;
            else return ls[q] = mer(p, ls[q]), up(q), q;
        }
    
        void spl(int rt, int v, int &p, int &q) {
            if (!rt) return p = q = 0, void();
            if (val[rt] <= v) spl(rs[rt], v, rs[p = rt], q), up(p);
            else spl(ls[rt], v, p, ls[q = rt]), up(q);
        }
    } t;
    
  • 线段树基础
    struct Segment {
        #define ls (rt << 1)
        #define rs (rt << 1 | 1)
        #define mid (l + r >> 1)
    
        int sum[N << 2], tag[N << 2], a[N];
    
        void up(int rt) {
            sum[rt] = sum[ls] + sum[rs];
        }
    
        void down(int rt, int l, int r) {
            sum[ls] += tag[rt] * (mid - l + 1);
            sum[rs] += tag[rt] * (r - mid);
            tag[ls] += tag[rt]; tag[rs] += tag[rt];
            tag[rt] = 0;
        }
    
        void build(int rt, int l, int r) {
            if (l == r) {
                sum[rt] = a[l];
                return;
            }
    
            build(ls, l, mid); build(rs, mid + 1, r);
            up(rt);
        }
    
        void upd(int rt, int l, int r, int L, int R, int v) {
            lf (L <= l && r <= R) {
                sum[rt] += v * (r - l + 1);
                tag[rt] += v; return;
            }
    
            down(rt, l, r);
            if (mid >= l) upd(ls, l, mid, L, R, v);
            if (mid < r) upd(rs, mid + 1, r, L, R, v);
            up(rt);   
        }
    
        int query(int rt, int l, int r, int L, int R) {
            if (L <= l && r <= R) return sum[rt];
            down(rt, l, r);
            int ans = 0;
            if (mid <= l) ans += query(ls, l, mid, L, R);
            if (mid > r) ans += query(rs, mid + 1, r, L, R);
            return ans;
        }
    } t;
    
  • 最大流
    int head[N], ver[M << 1], edge[M << 1], Next[M << 1], tot = 1;
    int d[N], now[N];
    int n, m, s, t;
    queue<int> que;
    
    void add(int u, int v, int w) {
      ver[++tot] = v, edge[tot] = w;
      Next[tot] = head[u], head[u] = tot;
    }
    
    bool bfs() {
      memset(d, 0, sizeof(d));
      while (que.size()) que.pop();
      d[s] = 1, que.push(s), now[s] = head[s];
    
      while (que.size()) {
        int u = que.front(); que.pop();
    
        for (int i = head[u]; i; i = Next[i]) {
          if (edge[i] && !d[ver[i]]) {
            d[ver[i]] = d[u] + 1;
            now[ver[i]] = head[ver[i]];
            que.push(ver[i]);
            if (ver[i] == t) return 1;
          }
        }
      }
    
      return 0;
    }
    
    int dfs(int u, int f) {
      if (u == t || !f) return f;
      int ans = 0;
    
      for (int &i = now[u]; i; i = Next[i]) {
        if (edge[i] && d[ver[i]] == d[u] + 1) {
          int k = dfs(ver[i], min(f, edge[i]));
          if (!k) d[ver[i]] = 0;
          edge[i] -= k, edge[i ^ 1] += k;
          ans += k, f -= k;
          if (f <= 0) break;
        }
      }
    
      return ans;
    }
    
    int dinic() {
      int ans = 0;
      while (bfs()) ans += dfs(s, inf);
      return ans;
    }
    
FastIO

void read() {}
template<typename T, typename... U> void read(T &x, U&...arg) {
  x = 0; int f = 1; char ch = getchar();
  while (ch > '9' || ch < '0') { if (ch == '-') f = -1; ch = getchar(); }
  while (ch >= '0' && ch <= '9') x = x * 10 + ch - '0', ch = getchar();
  x *= f; read(arg...);
}

void write() {}
template<typename T> void write(T x) {
  if (x < 0) { putchar('-'), x = -x; }
  if (x > 9) write(x / 10);
  putchar(x % 10 + '0');
}

void lwrite() {}
template<typename T, typename... U> void lwrite(T x, U ...arg) {
  write(x); putchar(' '); lwrite(arg...);
}

void nwrite() {}
template<typename T, typename... U> void nwrite(T x, U ...arg) {
  write(x); puts(""); nwrite(arg...);
}
posted @ 2024-12-01 12:52  FRZ_29  阅读(52)  评论(0)    收藏  举报