- 博客(13)
- 收藏
- 关注
原创 网络流模板
最大流int head[N], ver[N], Next[N], edge[N];int tot, s, t, n, m;int d[N], now[N];void init() { memset(head, 0, sizeof head); tot = 1;}void add(int u, int v, int w) { ver[++tot] = v, edge[tot] = w, Next[tot] = head[u], head[u] = tot; ver[++tot] = u,
2021-08-11 19:20:21 56 3
转载 2021-08-06
割点:vector<long long>g[N];int dfn[N], low[N], cut[N], deep, tag[N], sz[N];//dfn记录深度,low记录最近的根节点的深度,cut保存割点,sz记录割点消失后其中一个子连通块的点数个数。// v:当前点 r:本次搜索树的rootvoid tarjan(ll u, ll r) { //u是遍历到的节点. dfn[u] = low[u] = ++deep; ll child = 0; for (
2021-08-06 10:30:52 55
原创 组合数(逆元)模板
const int maxn = 5555, inf = 0x3f3f3f3f, mod = 1e9 + 7;ll fac[maxn*3];ll inv[maxn*3];int C(int m, int n){ if (m > n) return -1; return fac[n] * inv[m] % mod * inv[n - m] % mod;}ll quick_mod(ll n, ll m){ ll tmp = n % mod;
2021-08-05 14:07:42 83
原创 MK算法bfs优化模板O(n3)
#pragma warning(disable:4996)#include<iostream>#include<string.h>#include<queue>#include<stack>#include<math.h>#include<map>#include<set>#include<algorithm>#include<sstream>#include<vector&
2021-07-22 19:52:45 177
原创 2021-04-11
L. Queries on a Stringtime limit per test2 secondsmemory limit per test256 megabytesinputstandard inputoutputstandard outputA string s is given. Also there is a string p, and initially it is empty. You need to perform q operations of kind «add a lette
2021-04-11 01:16:22 63
原创 并查集---删除集合中的某个元素
链接:https://ac.nowcoder.com/acm/problem/15696来源:牛客网It’s universally acknowledged that there’re innumerable trees in the campus of HUST.Thus a professional tree manager is needed. Your task is to write a program to help manage the trees.Initially, there
2021-04-02 23:35:09 235
原创 关押罪犯(分多个集合!!)
链接:https://ac.nowcoder.com/acm/problem/16591来源:牛客网S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N。他们之间的关系自然也极不和谐。很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突。我们用“怨气值”(一个正整数值)来表示某两名罪犯之间的仇恨程度,怨气值越大,则这两名罪犯之间的积怨越多。如果两名怨气值为c 的罪犯被关押在同一监狱,他们俩之间会发生摩擦,并造成影响力为c 的冲突事件。每年年末,警察局会将本年内监狱中的所有冲突事件按影响力
2021-04-02 15:32:02 82
原创 最短Hamilton距离(二进制压状dp)
描述:给定一张n(n<=20)个点的带权无向图,点从0~n-1标号,求起点0到终点n-1的最短Hamilton路径。Hamilton路径:从0~n-1重复不漏的经过每一个点恰好一次。暴力做法:O(nn!)二进制压状dp:O(nn*2^n).关键数组dp[1<<20][20];在数组dp[i,j]中i通过二进制表示。i上的每一位数为一个节点,每一位数的值为0或1,表示未经过该节点和经过该节点。j为在遍历时每个节点是时,当时处于该节点,数组的值为目前0~j的最短路径。例如:dp[1
2021-04-01 22:21:24 276
原创 Being a Good Boy in Spring Festival
题目:分析:所有堆的异或为0时,先手必败;某个堆取出多少个石子时可以让所有堆的石子数异或值为0让异或为0的方法:遍历每一堆,对于遍历到的某一个堆a[i],从a[i]中拿走每个堆的异或all^a[i]那么a[i]剩下的就是(a[i]-all异或a[i]),最后得到all=all异或(a[i]-all^a[i])=0。显然,如果最开始所有堆的异或不为0,那么就可以从某一堆中取一些石头,让所有堆异或为0,那么被拿石头的那一堆就得满足a[i]>all异或a[i]才能从a[i]中拿走all^a[i]个
2021-02-20 16:37:52 112
原创 2021-01-25
线段树求此类问题关键找到要维护什么!!建立树struct tree{ int l, r;//树节点的左端点和右端点。结构体中可能还包含节点的一些特性,如区间的和sum等等。}void build(int l, int r, int i) {//建立数据的左端点为l,右端点为r的节点。在main函数中第一次传入的i通常为1 node[i] = {l, r}; int mid = l + r >> 1; build(l, mid, i << 1); build
2021-01-25 22:22:16 59
原创 2021-01-22
二分求最值今日的二分求最值搞得我头有点大,主要题目都是英文的,都没怎么看明白题目(最小值最大&&最大值最小)。先来一波自己的理解23333:题目一般要求在一段长度上面取走某个点或者是添加某个点,然后求出剩下的点的最大值的最小情况或最小值的最大情况。要二分得先排个序,在进行二分,第一次对线段的头和尾进行二分,然后逐渐进行二分,每一次二分的时候都要判断二分得到的值是否符合条件,如果符合条件那么就让二分的值更小或更大(具体看题),否则反之。如何判断符合条件呢?就要在外面设置一个函数,设jud
2021-01-23 00:12:51 104 1
原创 2021-01-21
查并集(第二天集训时光结束了,小累小累)合并父节点:`void join(int x, int y) {//将x的父节点与y的父节点合并 if (cfind(x) != cfind(y)) { fa[cfind(x)] = cfind(y);//把x的最终父节点改为y的最终父节点,可实现将x路径与y路径合并。 }}找父亲:int cfind(int x) {//普通查找 int r = x; while (fa[r] != r) { r = fa[r]; } return r
2021-01-21 23:28:42 70
原创 2021-01-20
map题目:水果题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1263直接输出map中的元素通过:(begin()+n)->first或(begin()+n)->second(第一个键值与第二个键值)#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#include<string>#inc
2021-01-20 21:55:46 59
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人