
知识
zzuli_zyl
这个作者很懒,什么都没留下…
展开
-
HDU 6214-求最小割的最小边数
HDU 6214求最小割的最小边数题目:给出一张有向图,求出最小割的最小边数解法: ①:建边时边权设成 d * (较大的数x),然后最小割就是 最大流 / (较大的数x),最小割的最小边数就是 最大流 % (较大的数x) ②:跑一遍 dinic 然后把满流的边边权设为 1 ,不满流的设为 inf 或 0 ,再跑 dinic 就是答案 ③:跑一遍 dinic 然后将所有点分为两个集合(S,T),然后枚举每条满流的边,如果这条边的一点在S集合里另一个点在T集合里就是割边,我们发现分集合原创 2021-11-09 17:04:19 · 295 阅读 · 0 评论 -
E2 - Array Optimization by Deque
题意:给你一个数组,然后给一个双端队列,数组从1~n,你每次可以将ai,放到队列后面或前面,问最后的最小逆序对是多少思路:假如枚举到第i个数,那么放置的最优方法就是:比较之前放过的数里比他大和比他小个数,如果比他大的个数多,那么放前面,否则放后面;那么重点就是如何求比他大和比他小的个数,这里就用到了树状数组,我们先将a数组离散化,枚举每个ai,算出它的离散坐标ax,那么比他小的个数就是sum[1~ax - 1],比他大的就是sum[n] - sum[ax]。#include<bits/stdc++原创 2021-09-29 12:12:24 · 311 阅读 · 0 评论 -
网络流之最大流学习总结
网络流之最大流学习总结Acwing-2171-EK求最大流该算发可用于求流网络的最大流,大致过程就是每次找一条路径,然后这条路径上面的容量都减去这条路径里的容量最小值,由于每次找一条,所以复杂度较高AcWing 2172. Dinic/ISAP求最大流这里使用了Dinic,并没有用ISAP,两者掌握一种即可。Dinic利用了分层思路,每次BFS进行分层,然后DFS,这样一次BFS可以找到多条路径。算法中利用了两种优化: ①优先弧优化:某个节点的某条出边流量已经满了,那么下次DFS就不必再原创 2021-08-30 17:56:22 · 363 阅读 · 0 评论 -
有上下界的网络流
这位大佬写的太好了,收藏!有上下界的网络流转载 2021-08-18 21:14:19 · 71 阅读 · 0 评论 -
树链剖分(模板)
#include<bits/stdc++.h>using namespace std;#define inf 0x3f3f3f3f#define IO ios::sync_with_stdio(false)#define bug cout << "-----\n"typedef long long ll;const int N = 100010;const int M = 500010;int cnt , ans , Mod;int a[N],f[N],d[N],s原创 2021-08-16 17:07:49 · 97 阅读 · 0 评论 -
折半枚举、二进制枚举——AtCoder - agc026_c
折半枚举对于许多题目,可能暴力搜索1 ~ n 是超时的,但是搜索1 ~ n/2 和n/2 ~ n就不会超时,此时我们可以考虑折半枚举的做法题目:AtCoder - agc026_c题意:给一个长为2n的字符串,问能找到从前往后读和从后往前读的这两个字符串相同的个数(从前往后的字符串与从后往前的字符串不能有公用)n<18思路:由于n<18,所以2n会到36,直接暴力搜索会超时(试过了=.=);观察题目的第一个样例我们发现:我们把字符串从中间分开,前半部分红的和后半部分蓝的相同并且前半部分蓝原创 2021-08-16 13:07:37 · 186 阅读 · 0 评论 -
ST表及其应用
背景我们在求区间最大最小值时,可以暴力从l到r,也可以用线段树、树状数组,但是都没有ST表的O(logn)建立,O(1)查询快思路对于一个数组,我们首先知道Max[1,1],Max[2,2],Max[3,3]…Max[n,n],是不是就进一步知道了Max[1,2],Max[2,3],Max[3,4]…,然后就可以知道Max[1,4],Max[2,5],Max[3,6],Max[4,7],Max[5,8]…然后就可以知道Max[1,8],Max[9,16]…建表ST表用的就是一个倍增思想,所以建表时原创 2021-08-01 10:46:28 · 188 阅读 · 0 评论 -
C++中STL库中map和pair和联用(无限套娃)!
map和pair数据类型定义:当我们用map<int,int>时,可以当作映射数组当我们用map<pair<int,int>,int>时,可以当作斜率数量计算当我们用map<pair<pair<int,int>,int>,int>时,可以…(自行发挥想象)上述的int类型可以更换其他类型数据插入(make_pair()的使用):假如我们定义了map<string,int> mp;那么我们可以mp[“zyl”]原创 2021-07-27 20:55:45 · 3290 阅读 · 0 评论 -
在数组中选取连续一段元素,长度大于等于k,找出平均值最大是多少
在数组中选取连续一段元素,长度大于等于k,找出平均值最大是多少思路:二分答案我们在0~最大可能值中二分答案,将答案传入check函数,用check函数判断当前答案是否可以找到一段区间其平均值大于等于当前答案,如果大于等于,那么真正答案一定大于等于当前二分答案。check函数:先将整个数组减去二分的答案res,然后求一个前缀和,从前缀和中找是否有某个长度大于等于k的区间和大于等于0,如果大于等于0代表一定存在另外一个区间,使得答案大于此二分答案resint n,kdouble eps = 1e-1原创 2021-07-26 20:33:33 · 651 阅读 · 0 评论 -
多维空间中求一个点相对一条线的对称点
Codeforces Round #734 (Div. 3)A. Polycarp and Coins题意:n块钱,只有两种硬币——价值为1的和价值为2的,要求用x枚1元和y枚2元组成n元,要求|x-y|最小思路:直接除3,得x = y = res = n/3,判断余数,如果余1,x++;如果余2,y++核心代码:int main() { ll T,i,j,n,m; cin >> T; while(T--) { cin >> n; ll x = n/3;原创 2021-07-24 10:31:40 · 861 阅读 · 4 评论 -
KMP算法
KMP算法算法用途:用于两个字符串的匹配,称为字符串匹配。例如母串"ABCDEF"与子串"BCD",因为子串可以在母串中找到,所以他们是匹配上了的。算法思想利用子串的Next数组(下面会详细讲),在匹配时若匹配不上,无需从子串的头部开始,可以直接从Next[i]开始匹配,大大减小了原本暴力的做法。Next数组Next[i]表示在子串中(0~i-1)中的前缀和后缀的最长长度。 我们的Next[0] = -1是因为S1[0]前无元素,为了方便后续代码编写,特殊赋值为-1。匹配过程我们已经原创 2021-03-31 09:04:06 · 128 阅读 · 0 评论 -
匈牙利算法
匈牙利算法算法用途:用于求最大匹配数,比如n个男生和m个女生,每个人都有暗恋的对象(一个人可能暗恋多个人)求能凑够的情侣的数量。算法思想:主要利用深度优先搜索(DFS)来实现。比如男生A喜欢女生B,但是女生B已经有了男朋友C。那就在男生C的暗恋对象中找到一个女生D,让C与D成为情侣,那么这样女生B就没有男朋友了,于是A和B就可以成为情侣。在本图中,A<->B、A<->C、B<->E、C<->G,他们相互喜欢。我们先匹配A,发现A可以与B组成情侣;我们继续原创 2021-03-27 21:50:43 · 124 阅读 · 0 评论 -
求n的阶乘后面有几个零
对于n=10;ans = 12345678910,其中要想产生零,就需要一个2和一个5,可以知道,每个数的阶乘里的因子中2的个数一定多于5的个数,所以就是求1~n里所有数中含有5的因子个数另外,对于n=25,其含有两个5,也就是25=55,所以24的阶乘后面有四个零,而25的阶乘后面有六个零。所以当n=150时求其阶乘后面0的个数就是sum+=n/5;sum+=n/25;sum+=n/125…所以可以写出程序int n,x=5;while(n>=x){ sum+=n/x; x原创 2020-11-11 21:40:21 · 1242 阅读 · 0 评论 -
读入字符串的几种方法
一:使用scanf读入,遇到空格、tab、回车就结束;但是可以使用scanf("%[^c]“)这个c就是遇到这个字符就结束。或者使用scanf(“%[a-zA-Z0-9&*!@#$()&",s);表示如果遇到里面没有的字符就直接结束。二:使用cin,遇到空格回车结束。三:gets,遇到回车就结束四:cin.get(s,strlen(s)),与gets一样后面是他的大小;五:getline,需要#include<string头文件,getlin(cin,s);...原创 2020-11-07 15:07:09 · 7247 阅读 · 0 评论 -
c++中的默认类型装换检测
进行short和char和float与其他类型计算时,先变为int或double然后在变回来。而进行纵向的计算时,低层的数据会被默认转化为高层的数据。数据类型的检测:#include <iostream>#include <typeinfo>using namespace std;main(){int a = 33;double b = 333;long int c = 3;unsigned d = 3333;b += a;a *= b;std::cout.原创 2020-10-18 21:52:12 · 85 阅读 · 0 评论 -
UVA - 11624(简单bfs+初始化)
UVA题目链接VJ题目衔接题目大意:火每次四个方向延伸,问人能否跑出这个迷宫,也就是人能走的格子必须在火延伸到那里之前。注意:Fire火堆并不是只有一个,可以有多个Fire。但J只有一个。思路:广搜每个F,初始化Time数组,也就是为后面J是否可以走到这个格子上做准备(也就是stemp[x][y]<Time[x][y]),然后从J开始再走一遍广搜,如果可以走到边界,就算出去了。本来用纯粹的从每个F进行BFS,发现超时的,这也是必然的,毕竟RC是1000;然后看其他人写的,可以不用for从每个原创 2020-09-14 18:45:11 · 226 阅读 · 1 评论 -
二叉搜索树的建立与前中后序遍历
二叉搜索树的建立与前中后序遍历#include<iostream>#include<cstdlib>#include<malloc.h>using namespace std;typedef struct node{ int data; struct node *left; struct node *right;}Tree;typedef struct{ Tree *root;}g_tree;void insert(g_tree *t原创 2020-06-03 20:35:08 · 142 阅读 · 0 评论 -
c++优先队列中重载用算符
c++优先队列中重载用算符上代码:#include<queue>#include<iostream>using namespace std;struct node //对结构体进行队列运算符重载。{ int x,y; bool operator < (const node& a)const{ return x>...原创 2020-04-19 11:37:49 · 337 阅读 · 0 评论