龙月语

各种模板

2018-12-29起,将各类模板都保存至此处,各位可以对着这里背板子(有些代码可能借鉴了其他blog,请见谅)

目前已借鉴的博客:(大为感谢)

1. https://www.cnblogs.com/TheRoadToTheGold/p/6254255.html

2. https://www.cnblogs.com/chinhhh/p/7965433.html

3. https://www.luogu.org/blog/41868/soutionp2142

(有错的话请各路神犇指教)

1. 平衡树treap:

  1 #include <cstdio>
  2 #include <cstdlib>
  3 const int maxn = 100005;
  4 struct node
  5 {
  6     node *s[2];
  7     int k, f, siz;
  8     node() {}
  9     node(int w, node *son)
 10     {
 11         s[0] = s[1] = son;
 12         k = w;
 13         f = rand();
 14         siz = 1;
 15     }
 16     void pushup()
 17     {
 18         siz = s[0]->siz + s[1]->siz + 1;
 19     }
 20 } nil, base[maxn];
 21 typedef node *P_node;
 22 P_node null, len, Root;
 23 void treap_init()
 24 {
 25     nil = node(0, NULL);
 26     null = &nil;
 27     null->s[0] = null->s[1] = null;
 28     null->siz = 0;
 29     len = base;
 30     Root = null;
 31 }
 32 P_node newnode(int x)
 33 {
 34     *len = node(x, null);
 35     return len++;
 36 }
 37 P_node merge(P_node a, P_node b)
 38 {
 39     if (a == null)
 40         return b;
 41     if (b == null)
 42         return a;
 43     if (a->f > b->f) {
 44         a->s[1] = merge(a->s[1], b);
 45         a->pushup();
 46         return a;
 47     }
 48     b->s[0] = merge(a, b->s[0]);
 49     b->pushup();
 50     return b;
 51 }
 52 void split(P_node x, int k, P_node &l, P_node &r)
 53 {
 54     if (x == null)
 55     {
 56         l = r = null;
 57         return;
 58     }
 59     if (x->k <= k)
 60     {
 61         l = x;
 62         split(l->s[1], k, l->s[1], r);
 63     }
 64     else
 65     {
 66         r = x;
 67         split(r->s[0], k, l, r->s[0]);
 68     }
 69     x->pushup();
 70 }
 71 void Insert(int k)
 72 {
 73     P_node l, r;
 74     split(Root, k, l, r);
 75     Root = merge(merge(l, newnode(k)), r);
 76 }
 77 void Erase(int k)
 78 {
 79     P_node l, mid, r;
 80     split(Root, k - 1, l, r);
 81     split(r, k, mid, r);
 82     Root = merge(l, merge(merge(mid->s[0], mid->s[1]), r));
 83 }
 84 int Kth(P_node x, int k)
 85 {
 86     if (k <= x->s[0]->siz)
 87         return Kth(x->s[0], k);
 88     else if (k > x->s[0]->siz + 1)
 89         return Kth(x->s[1], k - x->s[0]->siz - 1);
 90     return x->k;
 91 }
 92 int get_edge(P_node x, int d)
 93 {
 94     while (x->s[d] != null) x = x->s[d];
 95     return x->k;
 96 }
 97 int q;
 98 inline int red()
 99 {
100     int tot = 0, f = 1;
101     char ch = getchar();
102     while (ch < '0' || '9' < ch)
103     {
104         if (ch == '-')
105             f = -f;
106         ch = getchar();
107     }
108     while ('0' <= ch && ch <= '9') tot = tot * 10 + ch - 48, ch = getchar();
109     return tot * f;
110 }
111 int main()
112 {
113     treap_init();
114     q = red();
115     while (q--)
116     {
117         int c = red();
118         if (c == 1)
119             Insert(red());
120         else if (c == 2)
121             Erase(red());
122         else if (c == 3)
123         {
124             int k = red();
125             P_node l, r;
126             split(Root, k - 1, l, r);
127             printf("%d\n", l->siz + 1);
128             Root = merge(l, r);
129         }
130         else if (c == 4)
131             printf("%d\n", Kth(Root, red()));
132         else if (c == 5)
133         {
134             int k = red();
135             P_node l, r;
136             split(Root, k - 1, l, r);
137             printf("%d\n", get_edge(l, 1));
138             Root = merge(l, r);
139         }
140         else
141         {
142             int k = red();
143             P_node l, r;
144             split(Root, k, l, r);
145             printf("%d\n", get_edge(r, 0));
146             Root = merge(l, r);
147         }
148     }
149     return 0;
150 }

2. 线段树(带lazy标记)

 1 #include<iostream>
 2 #include<cstdio>
 3 #define MAXN 1000001
 4 #define ll long long
 5 using namespace std;
 6 unsigned ll n, m, a[MAXN], ans[MAXN << 2], tag[MAXN << 2];
 7 inline ll ls(ll x)
 8 {
 9     return x << 1;
10 }
11 inline ll rs(ll x)
12 {
13     return x << 1 | 1;
14 }
15 void scan()
16 {
17     cin >> n >> m;
18     for (ll i = 1; i <= n; i++)
19         scanf("%lld", &a[i]);
20 }
21 inline void push_up(ll p)
22 {
23     ans[p] = ans[ls(p)] + ans[rs(p)];
24 }
25 void build(ll p, ll l, ll r)
26 {
27     tag[p] = 0;
28     if (l == r) { ans[p] = a[l]; return; }
29     ll mid = (l + r) >> 1;
30     build(ls(p), l, mid);
31     build(rs(p), mid + 1, r);
32     push_up(p);
33 }
34 inline void f(ll p, ll l, ll r, ll k)
35 {
36     tag[p] = tag[p] + k;
37     ans[p] = ans[p] + k * (r - l + 1);
38 }
39 inline void push_down(ll p, ll l, ll r)
40 {
41     ll mid = (l + r) >> 1;
42     f(ls(p), l, mid, tag[p]);
43     f(rs(p), mid + 1, r, tag[p]);
44     tag[p] = 0;
45 }
46 inline void update(ll nl, ll nr, ll l, ll r, ll p, ll k)
47 {
48     if (nl <= l && r <= nr)
49     {
50         ans[p] += k * (r - l + 1);
51         tag[p] += k;
52         return;
53     }
54     push_down(p, l, r);
55     ll mid = (l + r) >> 1;
56     if (nl <= mid)update(nl, nr, l, mid, ls(p), k);
57     if (nr > mid) update(nl, nr, mid + 1, r, rs(p), k);
58     push_up(p);
59 }
60 ll query(ll q_x, ll q_y, ll l, ll r, ll p)
61 {
62     ll res = 0;
63     if (q_x <= l && r <= q_y)return ans[p];
64     ll mid = (l + r) >> 1;
65     push_down(p, l, r);
66     if (q_x <= mid)res += query(q_x, q_y, l, mid, ls(p));
67     if (q_y > mid) res += query(q_x, q_y, mid + 1, r, rs(p));
68     return res;
69 }
70 int main()
71 {
72     ll a1, b, c, d, e, f;
73     scan();
74     build(1, 1, n);
75     while (m--)
76     {
77         scanf("%lld", &a1);
78         switch (a1)
79         {
80         case 1: {
81             scanf("%lld%lld%lld", &b, &c, &d);
82             update(b, c, 1, n, 1, d);
83             break;
84         }
85         case 2: {
86             scanf("%lld%lld", &e, &f);
87             printf("%lld\n", query(e, f, 1, n, 1));
88             break;
89         }
90         }
91     }
92     return 0;
93 }

 

3. 并查集

#include<iostream>
using namespace std;
const int N = 10000;
int n, m;
int fa[N], size[N];
inline void init()
{
    for (int i = 1; i <= n; i++)fa[i] = i, size[i] = 1;
}
inline int find(int x)
{
    return x == fa[x] ? x : fa[x] = find(fa[x]);
}
inline void merge(int x, int y)
{
    int xx = find(x), yy = find(y);
    if (size[xx] < size[yy])swap(xx, yy);
    fa[yy] = xx; size[xx] += size[yy];
}
inline bool both(int x, int y)
{
    if (find(x) == find(y))
        return 1;
    else return 0;
}
int main()
{
    cin >> n >> m;
    init();
    for (int i = 1; i <= m; i++)
    {
        int a, b, tmp;
        cin >> tmp;
        if (tmp == 1)
        {
            cin >> a >> b;
            merge(a, b);
        }
        if (tmp == 2)
        {
            cin >> a >> b;
            if (both(a, b))
                cout << 'Y' << endl;
            else cout << 'N' << endl;
        }
    }
    return 0;
}

4. 快速排序(sort也不错)

#include<bits/stdc++.h>
using namespace std;
void qsort(int, int);
int a[100001], sum;
int main()
{
    int n, i;
    cin >> n;
    for (i = 1; i <= n; i++)
        cin >> a[i];
    qsort(1, n);
    for (i = 1; i <= n; i++)
        cout << a[i] << " ";
    cout << endl;
}
void qsort(int l, int r)
{
    int i, j, mid, p;
    i = l; j = r;
    mid = a[(l + r) / 2];
    do
    {
        while (a[i] < mid) i++;
        while (a[j] > mid) j--;
        if (i <= j)
        {
            p = a[i]; a[i] = a[j]; a[j] = p;
            sum++;
            i++; j--;
        }
    } while (i <= j);
    if (l < j) qsort(l, j);
    if (i < r) qsort(i, r);
}

5. 树剖

#include <cstdio>
#include <algorithm>
#include <cctype>
using namespace std;
#define rint register int
#define mem(a,b) memset(a,(b),sizeof(a))
#define temp template<typename T>
typedef long long LL;
temp inline void read(T &x)
{
    x = 0;
    T w = 1, ch = getchar();
    while (!isdigit(ch) && ch != '-') ch = getchar();
    if (ch == '-') w = -1, ch = getchar();
    while (isdigit(ch))
    {
        x = (x << 3) + (x << 1) + (ch^'0');
        ch = getchar();
    }
    x = x * w;
}
#define mid ((l+r)>>1)
#define lson rt<<1,l,mid
#define rson rt<<1|1,mid+1,r
#define len (r-l+1)
const int maxn = 200000 + 10;
int n, m, r, mod;
int e, beg[maxn], nex[maxn], to[maxn], w[maxn], wt[maxn];
int a[maxn << 2], laz[maxn << 2];
int son[maxn], id[maxn], fa[maxn], cnt, dep[maxn], siz[maxn], top[maxn];
int res = 0;
inline void add(int x, int y)
{
    to[++e] = y;
    nex[e] = beg[x];
    beg[x] = e;
}
inline void pushdown(int rt, int lenn)
{
    laz[rt << 1] += laz[rt];
    laz[rt << 1 | 1] += laz[rt];
    a[rt << 1] += laz[rt] * (lenn - (lenn >> 1));
    a[rt << 1 | 1] += laz[rt] * (lenn >> 1);
    a[rt << 1] %= mod;
    a[rt << 1 | 1] %= mod;
    laz[rt] = 0;
}
inline void build(int rt, int l, int r)
{
    if (l == r)
    {
        a[rt] = wt[l];
        if (a[rt] > mod) a[rt] %= mod;
        return;
    }
    build(lson);
    build(rson);
    a[rt] = (a[rt << 1] + a[rt << 1 | 1]) % mod;
}
inline void query(int rt, int l, int r, int L, int R)
{
    if (L <= l && r <= R)
    {
        res += a[rt];
        res %= mod;
        return;
    }
    else
    {
        if (laz[rt]) pushdown(rt, len);
        if (L <= mid) query(lson, L, R);
        if (R > mid) query(rson, L, R);
    }
}
inline void update(int rt, int l, int r, int L, int R, int k)
{
    if (L <= l && r <= R)
    {
        laz[rt] += k;
        a[rt] += k * len;
    }
    else
    {
        if (laz[rt]) pushdown(rt, len);
        if (L <= mid) update(lson, L, R, k);
        if (R > mid) update(rson, L, R, k);
        a[rt] = (a[rt << 1] + a[rt << 1 | 1]) % mod;
    }
}
inline int qrange(int x, int y)
{
    int ans = 0;
    while (top[x] != top[y])
    {
        if (dep[top[x]] < dep[top[y]]) swap(x, y);
        res = 0;
        query(1, 1, n, id[top[x]], id[x]);
        ans += res;
        ans %= mod;
        x = fa[top[x]];
    }
    if (dep[x] > dep[y]) swap(x, y);
    res = 0;
    query(1, 1, n, id[x], id[y]);
    ans += res;
    return ans %= mod;
}
inline void updrange(int x, int y, int k)
{
    k %= mod;
    while (top[x] != top[y])
    {
        if (dep[top[x]] < dep[top[y]]) swap(x, y);
        update(1, 1, n, id[top[x]], id[x], k);
        x = fa[top[x]];
    }
    if (dep[x] > dep[y]) swap(x, y);
    update(1, 1, n, id[x], id[y], k);
}
inline int qson(int x)
{
    res = 0;
    query(1, 1, n, id[x], id[x] + siz[x] - 1);
    return res;
}
inline void updson(int x, int k)
{
    update(1, 1, n, id[x], id[x] + siz[x] - 1, k);
}
inline void dfs1(int x, int f, int deep)
{
    dep[x] = deep;
    fa[x] = f;
    siz[x] = 1;
    int maxson = -1;
    for (rint i = beg[x]; i; i = nex[i])
    {
        int y = to[i];
        if (y == f) continue;
        dfs1(y, x, deep + 1);
        siz[x] += siz[y];
        if (siz[x] > maxson) son[x] = y, maxson = siz[y];
    }
}
inline void dfs2(int x, int topf)
{
    id[x] = ++cnt;
    wt[cnt] = w[x];
    top[x] = topf;
    if (!son[x]) return;
    dfs2(son[x], topf);
    for (rint i = beg[x]; i; i = nex[i])
    {
        int y = to[i];
        if (y == fa[x] || y == son[x]) continue;
        dfs2(y, y);
    }
}
int main()
{
    read(n); read(m); read(r); read(mod);
    for (rint i = 1; i <= n; i++)
        read(w[i]);
    for (rint i = 1; i < n; i++)
    {
        int a, b;
        read(a); read(b);
        add(a, b); add(b, a);
    }
    dfs1(r, 0, 1);
    dfs2(r, r);
    build(1, 1, n);
    while (m--)
    {
        int k, x, y, z;
        read(k);
        if (k == 1)
        {
            read(x);
            read(y);
            read(z);
            updrange(x, y, z);
        }
        else if (k == 2)
        {
            read(x);
            read(y);
            printf("%d\n", qrange(x, y));
        }
        else if (k == 3)
        {
            read(x);
            read(y);
            updson(x, y);
        }
        else
        {
            read(x);
            printf("%d\n", qson(x));
        }
    }
    //    getchar();
    //    getchar();
}

 6. tarjan强联通分量

 1 #include <cstdio>
 2 #include <algorithm>
 3 #include <cstring>
 4 #include <iostream>
 5 using namespace std;
 6 struct node
 7 {
 8     int v, next;
 9 }edge[1001];
10 int DFN[1001], LOW[1001];
11 int stack[1001], heads[1001], visit[1001], cnt, tot, index;
12 void add(int x, int y)
13 {
14     edge[++cnt].next = heads[x];
15     edge[cnt].v = y;
16     heads[x] = cnt;
17     return;
18 }
19 void tarjan(int x)
20 {
21     DFN[x] = LOW[x] = ++tot;
22     stack[++index] = x;
23     visit[x] = 1;
24     for (int i = heads[x]; i != -1; i = edge[i].next)
25     {
26         if (!DFN[edge[i].v])
27         {
28             tarjan(edge[i].v);
29             LOW[x] = min(LOW[x], LOW[edge[i].v]);
30         }
31         else if (visit[edge[i].v])
32         {
33             LOW[x] = min(LOW[x], DFN[edge[i].v]);
34         }
35     }
36     if (LOW[x] == DFN[x])
37     {
38         do
39         {
40             printf("%d ", stack[index]);
41             visit[stack[index]] = 0;
42             index--;
43         } while (x != stack[index + 1]);
44         printf("\n");
45     }
46     return;
47 }
48 int main()
49 {
50     memset(heads, -1, sizeof(heads));
51     int n, m;
52     cin >> n >> m;
53     int x, y;
54     for (int i = 1; i <= m; i++)
55     {
56         cin >> x >> y;
57         add(x, y);
58     }
59     for (int i = 1; i <= n; i++)
60         if (!DFN[i])  tarjan(i);
61     //getchar();
62     //getchar();
63     //getchar();
64     return 0;
65 }

7. 最大流(Ford,EK,Dinic,ISAP)

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <cstring>
  4 #include <vector>
  5 #include <queue>
  6 using namespace std;
  7 struct edge
  8 {
  9     int to, cap, rev;
 10 };
 11 const int maxn = 10001, INF = 0x7F7F7F7F;
 12 int n, m;
 13 vector <edge> G[maxn + 1];
 14 edge make_edge(int to, int cap, int rev)
 15 {
 16     edge x;
 17     x.to = to, x.cap = cap, x.rev = rev;
 18     return x;
 19 }
 20 void add_edge(int from, int to, int cap)
 21 {
 22     G[from].push_back(make_edge(to, cap, G[to].size()));
 23     G[to].push_back(make_edge(from, 0, G[from].size() - 1));
 24 }
 25 void init()
 26 {
 27     for (int i = 1; i <= m; i++)
 28     {
 29         int u, v, w;
 30         scanf("%d%d%d", &u, &v, &w);
 31         add_edge(u, v, w);
 32     }
 33 }
 34 namespace Ford_Fulkerson
 35 {
 36     bool used[maxn + 1];
 37     int dfs(int x, int t, int f)
 38     {
 39         if (x == t) return f;
 40         used[x] = true;
 41         for (int i = 0; i < G[x].size(); i++)
 42         {
 43             edge &e = G[x][i];
 44             if (!used[e.to] && e.cap > 0)
 45             {
 46                 int d = dfs(e.to, t, min(f, e.cap));
 47                 if (d > 0)
 48                 {
 49                     e.cap -= d;
 50                     G[e.to][e.rev].cap += d;
 51                     return d;
 52                 }
 53             }
 54         }
 55         return 0;
 56     }
 57     int max_flow(int s, int t)
 58     {
 59         int flow = 0;
 60         for (;;)
 61         {
 62             memset(used, 0, sizeof(used));
 63             int f = dfs(s, t, INF);
 64             if (f == 0) return flow;
 65             flow += f;
 66         }
 67     }
 68 }
 69 namespace Edmond_Karp
 70 {
 71     bool vis[maxn + 1];
 72     int prev[maxn + 1];
 73     int pree[maxn + 1];
 74     void bfs(int s)
 75     {
 76         memset(vis, 0, sizeof(vis));
 77         memset(prev, -1, sizeof(prev));
 78         memset(pree, -1, sizeof(prev));
 79         queue <int> q;
 80         vis[s] = true;
 81         q.push(s);
 82         while (!q.empty())
 83         {
 84             int x = q.front();
 85             q.pop();
 86             for (int i = 0; i < G[x].size(); i++)
 87             {
 88                 edge &e = G[x][i];
 89                 if (e.cap > 0 && !vis[e.to])
 90                 {
 91                     prev[e.to] = x;
 92                     pree[e.to] = i;
 93                     vis[e.to] = true;
 94                     q.push(e.to);
 95                 }
 96             }
 97         }
 98     }
 99 
100     int max_flow(int s, int t)
101     {
102         int flow = 0;
103         for (;;)
104         {
105             bfs(s);
106             if (!vis[t]) return flow;
107             int d = INF;
108             for (int i = t; prev[i] != -1; i = prev[i])
109                 d = min(d, G[prev[i]][pree[i]].cap);
110             for (int i = t; prev[i] != -1; i = prev[i])
111             {
112                 edge &e = G[prev[i]][pree[i]];
113                 e.cap -= d;
114                 G[e.to][e.rev].cap += d;
115             }
116             flow += d;
117         }
118     }
119 }
120 namespace Dinic
121 {
122     int level[maxn + 1];
123     int iter[maxn + 1];
124     void bfs(int s)
125     {
126         memset(level, -1, sizeof(level));
127         queue <int> q;
128         level[s] = 0;
129         q.push(s);
130         while (!q.empty())
131         {
132             int x = q.front();
133             q.pop();
134             for (int i = 0; i < G[x].size(); i++)
135             {
136                 edge &e = G[x][i];
137                 if (e.cap > 0 && level[e.to] < 0)
138                 {
139                     level[e.to] = level[x] + 1;
140                     q.push(e.to);
141                 }
142             }
143         }
144     }
145     int dfs(int x, int t, int f)
146     {
147         if (x == t) return f;
148         for (int &i = iter[x]; i < G[x].size(); i++)
149         {
150             edge &e = G[x][i];
151             if (e.cap > 0 && level[e.to] > level[x])
152             {
153                 int d = dfs(e.to, t, min(f, e.cap));
154                 if (d > 0)
155                 {
156                     e.cap -= d;
157                     G[e.to][e.rev].cap += d;
158                     return d;
159                 }
160             }
161         }
162         return 0;
163     }
164     int max_flow(int s, int t)
165     {
166         int flow = 0;
167         for (;;)
168         {
169             bfs(s);
170             if (level[t] < 0) return flow;
171             memset(iter, 0, sizeof(iter));
172             int f;
173             while ((f = dfs(s, t, INF)) > 0)
174                 flow += f;
175         }
176     }
177 }
178 namespace ISAP
179 {
180     int gap[maxn + 1];
181     int iter[maxn + 1];
182     int level[maxn + 1];
183     void bfs(int t)
184     {
185         memset(gap, 0, sizeof(gap));
186         memset(level, -1, sizeof(level));
187         queue <int> q;
188         level[t] = 1;
189         gap[level[t]] = 1;
190         q.push(t);
191         while (!q.empty())
192         {
193             int x = q.front();
194             q.pop();
195             for (int i = 0; i < G[x].size(); i++)
196             {
197                 edge &e = G[x][i];
198                 if (level[e.to] < 0) {
199                     level[e.to] = level[x] + 1;
200                     gap[level[e.to]]++;
201                     q.push(e.to);
202                 }
203             }
204         }
205     }
206 
207     int dfs(int x, int s, int t, int f)
208     {
209         if (x == t) return f;
210         int flow = 0;
211         for (int &i = iter[x]; i < G[x].size(); i++)
212         {
213             edge &e = G[x][i];
214             if (e.cap > 0 && level[x] == level[e.to] + 1)
215             {
216                 int d = dfs(e.to, s, t, min(f - flow, e.cap));
217                 e.cap -= d;
218                 G[e.to][e.rev].cap += d;
219                 flow += d;
220                 if (f == flow) return f;
221             }
222         }
223 
224         gap[level[x]]--;
225         if (gap[level[x]] == 0)
226             level[s] = n + 1;
227         iter[x] = 0;
228         gap[++level[x]]++;
229         return flow;
230     }
231     int max_flow(int s, int t)
232     {
233         int flow = 0;
234         bfs(t);
235         memset(iter, 0, sizeof(iter));
236         while (level[s] <= n)
237             flow += dfs(s, s, t, INF);
238         return flow;
239     }
240 }
241 int main()
242 {
243     int s, t;
244     scanf("%d%d%d%d", &n, &m, &s, &t);
245     init();
246     printf("%d\n", ISAP::max_flow(s, t));
247     return 0;
248 }

8. 筛法(伪筛)

 1 #include <cstdio>
 2 #include <cmath>
 3 #include <cstdlib>
 4 #include <algorithm>
 5 #include <cstring>
 6 using namespace std;
 7 #define maxn 1000000+10
 8 bool a[maxn];
 9 int n;
10 inline void cal_prime()
11 {
12     memset(a, true, sizeof(a));
13     for (int i = 2; i <= n; i++)
14     {
15         if (!a[i]) continue;
16         for (int j = i * 2; j <= n; j += i)
17             a[j] = false;
18     }
19 }
20 int main()
21 {
22     scanf("%d", &n);
23     int num;
24     scanf("%d", &num);
25     cal_prime();
26     a[0] = false;
27     a[1] = false;
28     for (int i = 1; i <= num; i++)
29     {
30         int cmp;
31         scanf("%d", &cmp);
32         if (a[cmp]) printf("Yes\n");
33         else printf("No\n");
34     }
35     printf("no");
36     return 0;
37 }

9. 可并堆

 1 #include <cstdio>
 2 #include <algorithm>
 3 using namespace std;
 4 const int maxn = 100000 + 5;
 5 int read()
 6 {
 7     int x = 0, f = 1;
 8     char ch = getchar();
 9     while ((ch < '0') || (ch > '9'))
10     {
11         if (ch == '-')
12             f = -f;
13         ch = getchar();
14     }
15     while ((ch >= '0') && (ch <= '9'))
16     {
17         x = x * 10 + ch - '0';
18         ch = getchar();
19     }
20     return x * f;
21 }
22 struct node
23 {
24     node* son[2];
25     node* fa;
26     int val, dist, pos;
27 };
28 node tnode[maxn + 10];
29 node *p[maxn + 10];
30 int n, m;
31 inline int upd_dist(node* now)
32 {
33     if (now->son[1] != NULL)
34         now->dist = now->son[1]->dist + 1;
35     else
36         now->dist = 0;
37     return 0;
38 }
39 node *merge(node *a, node *b)
40 {
41     if (a == NULL) return b;
42     if (b == NULL) return a;
43     if ((a->val >= b->val) && (a->pos > b->pos))
44         swap(a, b);
45     a->son[1] = merge(a->son[1], b);
46     a->son[1]->fa = a;
47     if ((a->son[0] != NULL) && (a->son[1] != NULL) && (a->son[0]->dist < a->son[1]->dist))
48         swap(a->son[0], a->son[1]);
49     else if ((a->son[0] == NULL) && (a->son[1] != NULL))
50     {
51         a->son[0] = a->son[1];
52         a->son[1] = NULL;
53     }
54     upd_dist(a);
55     return a;
56 }
57 node* getf(node *x)
58 {
59     if (x->fa == NULL) return x;
60     return getf(x->fa);
61 }
62 int getmin_pop(node *x)
63 {
64     node *f = getf(x);
65     int v = f->val;
66     node* s = merge(f->son[0], f->son[1]);
67     if (s != NULL) s->fa = NULL;
68     f->pos = -1;
69     return v;
70 }
71 int main()
72 {
73     n = read(); m = read();
74     for (register int i = 1; i <= n; i++)
75     {
76         p[i] = &tnode[i];
77         p[i]->son[0] = p[i]->son[1] = p[i]->fa = NULL;
78         p[i]->val = read();
79         p[i]->dist = 0;
80         p[i]->pos = i;
81     }
82     while (m--)
83     {
84         int op = read(), a = read();
85         if (op == 1)
86         {
87             int b = read();
88             if (p[a]->pos == -1 || p[b]->pos == -1) continue;
89             node *fa = getf(p[a]);
90             node *fb = getf(p[b]);
91             if (fa == fb) continue;
92             merge(fa, fb);
93         }
94         else
95             if (p[a]->pos == -1) puts("-1");
96             else printf("%d\n", getmin_pop(p[a]));
97     }
98     return 0;
99 }

10. 快速幂

 1 #include<cstdio>
 2 int b,k;
 3 int f(int p){
 4     if(p==0) return 1%k;
 5     int tmp=f(p>>1);
 6     tmp=tmp*tmp%k;
 7     if(p&1) tmp=(tmp*b)%k;
 8     return tmp;
 9 }
10 int main(){
11     int p;
12     scanf("%d%d%d",&b,&p,&k);
13     printf("%d",b);
14     b%=k;
15     printf("^%d mod %d=%d\n",p,k,f(p));
16     return 0;
17 }

11. spfa最短路

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int inf = 2147483647;
 4 const int maxn = 10005;
 5 int n, m, b, e = 0, i, j;
 6 int dis[maxn], head[500005];
 7 bool vis[maxn];
 8 struct node
 9 {
10     int next, to, dis;
11 }edge[500005];
12 
13 queue<int> q;
14 void addedge(int from, int to, int dis)
15 {
16     edge[++e].next = head[from];
17     edge[e].dis = dis;
18     edge[e].to = to;
19     head[from] = e;
20 }
21 
22 void spfa()
23 {
24     for (i = 1; i <= n; i++) dis[i] = inf;
25     dis[b] = 0;
26     q.push(b), vis[b] = 1;
27     while (!q.empty())
28     {
29         int begin = q.front();
30         q.pop();
31         for (i = head[begin]; i; i = edge[i].next)
32         {
33             if (dis[edge[i].to] > dis[begin] + edge[i].dis)
34             {
35                 dis[edge[i].to] = dis[begin] + edge[i].dis;
36                 if (!vis[edge[i].to])
37                 {
38                     vis[edge[i].to] = 1;
39                     q.push(edge[i].to);
40                 }
41             }
42         }
43         vis[begin] = 0;
44     }
45 }
46 int main()
47 {
48     cin >> n >> m >> b;
49     for (int i = 1; i <= m; i++)
50     {
51         int f, t, d;
52         cin >> f >> t >> d;
53         addedge(f, t, d);
54     }
55     spfa();
56     for (int i = 1; i <= n; i++)
57         if (b == i) cout << 0 << ' ';
58         else cout << dis[i] << ' ';
59     return 0;
60 }

12. Floyd最短路

 1 #include <cstdio>
 2 int e[1005][1005], k, i, j, n, m, t1, t2, t3;
 3 int main()
 4 {
 5     int inf = 99999999;
 6     scanf("%d %d", &n, &m);
 7     for (i = 1; i <= n; i++)
 8         for (j = 1; j <= n; j++)
 9             if (i == j) e[i][j] = 0;
10             else e[i][j] = inf;
11     for (i = 1; i <= m; i++)
12     {
13         scanf("%d %d %d", &t1, &t2, &t3);
14         e[t1][t2] = t3;
15     }
16     for (k = 1; k <= n; k++)
17         for (i = 1; i <= n; i++)
18             for (j = 1; j <= n; j++)
19                 if (e[i][j] > e[i][k] + e[k][j])
20                     e[i][j] = e[i][k] + e[k][j];
21     for (i = 1; i <= n; i++)
22     {
23         for (j = 1; j <= n; j++)
24             printf("%10d", e[i][j]);
25     }
26         printf("\n");
27 }

 13. 高精加减乘除

  1 #include<bits/stdc++.h>
  2 using namespace std;
  3 const int M=10,P=1; 
  4 
  5 struct BigNum
  6 {
  7        int n[100000],l,Y;
  8        BigNum(){l=1,memset(n,0,sizeof(n));}
  9        //----------------------------------
 10        void init()
 11        {
 12             string s;
 13             cin>>s;
 14             int now=0,ct=0,c1=1;
 15             for(int i=s.length()-1;i>=0;i--)
 16             {
 17              n[now]+=(s[i]-'0')*c1;
 18              c1*=10;
 19              ct++;
 20              if(ct==P&&i!=0)
 21              {
 22               now++;
 23               c1=1;
 24               ct=0;
 25              }        
 26             }
 27             l=now+1;     
 28        }
 29        //-----------------------------------
 30        void print()
 31        {
 32             printf("%d",n[l-1]);
 33             for(int i=l-2;i>=0;i--)
 34             printf("%0*d",P,n[i]);
 35             printf("\n");
 36        }
 37        //------------------------------------
 38        BigNum operator +(BigNum x)const
 39        {
 40               BigNum t=*this;
 41               if(x.l>t.l)t.l=x.l;
 42               for(int i=0;i<t.l;i++)
 43               {
 44                t.n[i]+=x.n[i];
 45                if(t.n[i]>=M)
 46                {
 47                    t.n[i+1]+=t.n[i]/M;
 48                    t.n[i]%=M;             
 49                }        
 50               }
 51               while(t.n[t.l])
 52               {
 53                   t.n[t.l+1]+=t.n[t.l]/M;
 54                   t.n[t.l++]%=M;               
 55               }     
 56               return t;  
 57        }
 58        //--------------------------------------
 59        bool operator < (BigNum x) const
 60        {
 61            BigNum t=*this;
 62            if(t.l!=x.l)return t.l<x.l;
 63            for(int i=t.l-1;i>=0;i--)
 64            {
 65               if(t.n[i]!=x.n[i])return t.n[i]<x.n[i];        
 66            }
 67            return 0;       
 68        }
 69        BigNum operator -(BigNum x)const
 70        {
 71            BigNum t=*this;
 72            if(t<x){printf("-");swap(t,x);} 
 73            for(int i=0;i<t.l;i++)
 74            {
 75             t.n[i]-=x.n[i];
 76             if(t.n[i]<0)
 77             {
 78                 t.n[i]+=M;
 79                 --t.n[i+1];            
 80             }        
 81            } 
 82            while(!t.n[t.l-1]&&t.l>1)t.l--;
 83            return t;     
 84        }
 85        //--------------------------------------------
 86        BigNum operator * (BigNum x) const//提供了2种*运算
 87        {
 88               BigNum c,t=*this;
 89               c.l=t.l+x.l-1;
 90               for(int i=0;i<t.l;i++)
 91               for(int j=0;j<x.l;j++)
 92               {
 93                   c.n[i+j]+=t.n[i]*x.n[j];
 94                   if(c.n[i+j]>=M)
 95                   {
 96                       c.n[i+j+1]+=c.n[i+j]/M;
 97                       c.n[i+j]%=M;               
 98                   }        
 99               }
100               while(c.n[c.l])
101               {
102                    c.n[c.l+1]+=c.n[c.l]/M;
103                    c.n[c.l++]%=M;               
104               }       
105               return c;
106        }
107        BigNum operator * (int x) const
108        {
109           BigNum t=*this,c;
110           c.l=t.l;
111           for(int i=0;i<t.l;i++)
112           {
113               c.n[i]+=t.n[i]*x;
114               if(c.n[i]>=M)
115               {
116                    c.n[i+1]+=c.n[i]/M;
117                    c.n[i]%=M;             
118               }        
119           }       
120           while(c.n[c.l])
121           {
122                  c.n[c.l+1]+=c.n[c.l]/M;
123                  c.n[c.l++]%=M;               
124           }
125           return c;
126        }
127        //--------------------------------------------
128     void Add(int x){if(x||l)n[l++]=x;}
129     void Re(){reverse(n,n+l);}
130     BigNum operator /(const BigNum &x)const//提供了2种/运算
131     {
132         BigNum t=*this,r,y;
133         y.l=0,r.l=t.l;
134         for(int i=t.l-1;i>=0;--i)
135         {
136             y.Add(t.n[i]);
137             y.Re();
138             while(!(y<x))y=y-x,r.n[i]++;
139             while(!y.n[y.l-1] && y.l>1)--y.l;
140             y.Re();
141         }
142         while(!r.n[r.l-1] && r.l>1)--r.l;
143         return r;
144     }
145     BigNum operator /(const int &x)const
146     {
147         BigNum t=*this,r;
148         r.l=t.l;
149         int tmp=0;
150         for(int i=t.l-1;i>=0;--i)
151         {
152             tmp+=t.n[i];
153             if(tmp>=x)
154                 r.n[i]+=tmp/x,tmp%=x;
155             tmp*=M;
156         }
157         while(!r.n[r.l-1] && r.l>1)--r.l;
158         return r;
159     }
160        //---------------------------------------
161 
162 }a,b,c;
163 
164 int main()
165 {
166     a.init();
167     b.init();
168 /*   
169     c=a+b;
170     c.print();
171 */ 
172     c=a-b;
173     c.print();
174 /*
175     c=a*b;
176     c.print();
177 
178     c=a/b;
179     c.print();
180 */
181     return 0;        
182 }

 14. 平衡树splay

  1 #include <cstdio>
  2 const int maxn=200020;
  3 int ch[maxn][2],par[maxn],val[maxn],cnt[maxn],size[maxn],rev[maxn],ncnt,root;
  4 bool chk(int x)
  5 {
  6     return ch[par[x]][1]==x;
  7 }
  8 void update(int x)
  9 {
 10     size[x]=size[ch[x][0]]+size[ch[x][1]]+cnt[x];
 11 }
 12 void rotate(int x)
 13 {
 14     int y=par[x],z=par[y],k=chk(x),w=ch[x][k^1];
 15     ch[y][k]=w,par[w]=y;
 16     ch[z][chk(y)]=x;par[x]=z;
 17     ch[x][k^1]=y;par[y]=x;
 18     update(y);update(x);
 19 }
 20 void splay(int x,int goal=0)
 21 {
 22     while (par[x]!=goal)
 23     {
 24         int y=par[x],z=par[y];
 25         if (z!=goal)
 26         {
 27             if (chk(x)==chk(y)) rotate(y);
 28             else rotate(x);
 29         }
 30         rotate(x);
 31     }
 32     if (!goal) root=x;
 33 }
 34 void insrt(int x)
 35 {
 36     int cur=root,p=0;
 37     while (cur&&val[cur]!=x)
 38     {
 39         p=cur;
 40         cur=ch[cur][x>val[cur]];
 41     }
 42     if (cur) cnt[cur]++;
 43     else
 44     {
 45         cur=++ncnt;
 46         if (p) ch[p][x>val[p]]=cur;
 47         ch[cur][0]=ch[cur][1]=0;
 48         par[cur]=p;val[cur]=x;
 49         cnt[cur]=size[cur]=1;
 50     }
 51     splay(cur);
 52 }
 53 void find(int x)
 54 {
 55     int cur=root;
 56     while (ch[cur][x>val[cur]]&&x!=val[cur]) cur=ch[cur][x>val[cur]];
 57     splay(cur);
 58 }
 59 int kth(int k)
 60 {
 61     int cur=root;
 62     while (1)
 63     {
 64         if (ch[cur][0]&&k<=size[ch[cur][0]]) cur=ch[cur][0];
 65         else if (k>size[ch[cur][0]]+cnt[cur]) k-=size[ch[cur][0]]+cnt[cur],cur=ch[cur][1];
 66         else return cur;
 67     }
 68 }
 69 int pre(int x)
 70 {
 71     find(x);
 72     if (val[root]<x) return root;
 73     int cur=ch[root][0];
 74     while (ch[cur][1]) cur=ch[cur][1];
 75     return cur;
 76 }
 77 int succ(int x)
 78 {
 79     find(x);
 80     if (val[root]>x) return root;
 81     int cur=ch[root][1];
 82     while (ch[cur][0]) cur=ch[cur][0];
 83     return cur;
 84 }
 85 void remove(int x)
 86 {
 87     int last=pre(x),next=succ(x);
 88     splay(last);splay(next,last);
 89     int del=ch[next][0];
 90     if (cnt[del]>1)
 91     {
 92         cnt[del]--;
 93         splay(del);
 94     }
 95     else ch[next][0]=0;
 96 }
 97 void reverse(int l,int r)
 98 {
 99     int x=kth(l),y=kth(r+2);
100     splay(x),splay(y,x);
101     rev[ch[y][0]]^=1;
102 }
103 int n,op,x;
104 int main()
105 {
106     scanf("%d",&n);
107     insrt(0x3f3f3f3f);
108     insrt(0xcfcfcfcf);
109     while (n--)
110     {
111         scanf("%d%d",&op,&x);
112         switch (op)
113         {
114             case 1: insrt(x); break;
115             case 2: remove(x); break;
116             case 3: find(x); printf("%d\n",size[ch[root][0]]); break;
117             case 4: printf("%d\n",val[kth(x+1)]); break;
118             case 5: printf("%d\n",val[pre(x)]); break;
119             case 6: printf("%d\n",val[succ(x)]); break;
120         }
121     }
122     return 0;
123 }

 

posted on 2019-01-02 13:54  龙月语  阅读(241)  评论(0编辑  收藏  举报

导航