
题解
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 评论 -
codeforces 700A(二分)
codeforces 700A题意:n个同学,要走长度为L的路到目的地,速度为v1,这条路上有公交车,速度为v2,公交车最多坐k人,问最短需要多少时间能让所有同学到目的地思路:首先这个公交车是可以不必须到目的地的,所有过程一定是公交车先送k人到a点,然后返回再送k人到b点,易知b > a是最优的,并且可以知道每个人坐车的时间是相同的情况下答案才会最优(有点难想到),故我们这题围绕着公交车来写。令p = n / k + (n % k != 0) , 设t1位每个人乘坐汽车的时间,t2为车子送到目的地原创 2021-10-17 17:27:55 · 228 阅读 · 0 评论 -
2021中国大学生程序设计竞赛(CCPC)- 网络选拔赛(重赛)F题
2021中国大学生程序设计竞赛(CCPC)- 网络选拔赛(重赛)F题题意:给S1 = “nunhehheh”,再给出一个串S,问S中有多少个子串S2,使得S2前缀为S1,后缀为若干个‘a’思路:DP,令dp[ i ] [ j ] = dp[i - 1] [j] + dp[i - 1] [j - 1] * (S1[j] == S[i]),特别注意j等0时dp[i - 1] [j - 1]会变成0;求出dp[ i ] [ 9 ]后,枚举i后面a的个数,找规律的C(n)(1) + C(n)(2) + C(n)原创 2021-10-11 21:24:00 · 559 阅读 · 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 382. K取方格数
思路:这里我们可以设一个源点S1和一个超级源点S,一个汇点T,每个点先拆点(容量为1,费用为aij)、向下和右建边(容量为1、费用为0)、S1向每个点建边(容量为1、费用为0)、每个点向T建边(容量为1、费用为0);最后,S向S1建边(容量为k、费用为0),这种建图方式也是本题的答案#include<bits/stdc++.h>using namespace std;#define inf 0x3f3f3f3f#define douinf 0x3f3f3f3f#define IO i原创 2021-09-26 15:24:26 · 102 阅读 · 0 评论 -
网络流之最小割学习总结
网络流之最小割学习总结AcWing 2173. Dinic/ISAP求最小割最小割是指将两点(我们这里定为S、T),分割在两个不同的集合中的最小花费。在前面学习最大流时,我们知道当达到最大流时残留网络中一定没有从S到T的路径了,也就是当达到了最大流,S和T就没有流量意味着分别在两个集合中了;反之,最小割也一定是最大流,因为当达到最小割,意味着S到不了T,也就是说S到T已经没有流量了,所以求出从S到T的最大流就求出了S到T的最小割AcWing 2279. 网络战争该题让求一个分数的最大值,一般这种形式原创 2021-09-17 15:58:23 · 227 阅读 · 0 评论 -
#AtCoder Beginner Contest 218——F-Blocked Roads
AtCoder Beginner Contest 218——F-Blocked Roads题意:给一个无向图,问对于每一条边,将其去除后的最短路是多少思路:我们先求一条最短路,这条最短路的边一定不会到400条,我们将在最短路里的边存下来(虽然最短路有多条,这里我们存一条即可),然后遍历每条边,如果该边在最短路里,那么把它去除跑dijstra,如果他不在最短路里,那么直接输出第一次跑的 dis[n] 即可,复杂度不会超过n*nlogm注意:存最短路时存的时边的编号,数组别开小,我是沙比(=-=)~#i原创 2021-09-14 11:01:33 · 209 阅读 · 0 评论 -
CodeForces - 102D(离散+线段树/树状数组)
CodeForces - 102D 题意:0 ~ n 一共n + 1个点,我们要从0称作一些汽车到达n,每辆汽车有一个S和一个T,代表起始站和终止站,你可以在S ~ T - 1 之间任一上这辆车,但是必须在到达终点站时下车,问我们有多少种方案能到达n思路: 由于坐标在1e9之内,所以用unique离散去重一下,我们先将每辆车的终点按从小到大排个序,那么对于每一辆车的T,它的方案就是在S ~ T - 1 之间上车的方案数,其实也就是前面的在S ~ T - 1下车方案数之和(当这辆车从0出发,再方案数++就原创 2021-09-09 14:54:41 · 159 阅读 · 1 评论 -
CodeForces - 1416C(字典树+贪心)
题意:给出数组a,让求一个数x,使得b数组(bi = ai ^ x)的逆序对最少,最小化逆序对数与x思路:分层考虑,我们将这n个数的每一位放到字典树里,对于字典树的每一层的每个节点,算出他两个儿子逆序对的数量,如果正序大于逆序,那么x的这一位为0,否则为1,这样是最优的,这题细节很重要,代码里注释的都是wa的点#include<bits/stdc++.h>using namespace std;#define inf 0x3f3f3f3f#define douinf 0x3f3f3f3原创 2021-09-08 15:09:10 · 200 阅读 · 0 评论 -
扩展欧几里得求多组解CodeForces - 1244C
扩展欧几里得求多组解扩展欧几里得可以求得满足ax+by = c的一组解(这里c%gcd(a,b)要等于0);假如求得的解为(x0 , y0),G = gcd(a , b),这时我们可以发现(x0 + k(b / G) , y0 - k(a / G))就是方程的通解,我们可以通过二分、取模求最小解等等CodeForces - 1244C 题意:给出两个方程 x + y + z = n x * w + y * d = p求解任一满足条件的x,y。思路:我们可以看出z与方程无关,只用原创 2021-09-01 11:12:40 · 176 阅读 · 0 评论 -
HDU - 6162(树链剖分+线段树)
题意:给一棵树,每个节点上有权值;m次询问,每次询问两点间最短距离经过的点中,权值>=a&&权值<=b的所有点的权值之和思路:赛中只知道是树剖+线段树,但是不知道如何处理这个区间ab,赛后才知道可以在线段树的节点中存下最大值Max和最小值Min,假如我们query到某个线段树节点x,如果该节点表示的线段中的Max < a || Min > b,那么表示这条线段中没有点在ab中,所以直接返回;如果Max <= b && Min >= a,直原创 2021-08-21 20:40:01 · 193 阅读 · 2 评论 -
Codeforces Round #739 (Div. 3)(补题)
A:直接暴力枚举const int N=1111122;const int M=200005;int ok(int x) { if(x%10==3)return 1; if(x%3==0)return 1; return 0;}int is(int n) { int x = 0; while(n) { x ++; if(!ok(x))n --; } return x;}int main() { int T,i,j,n,m; cin >> T; wh原创 2021-08-21 09:43:40 · 90 阅读 · 0 评论 -
6962-I love tree(待补)
#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 = 0,ans = 0;int id[N],ne[N],top[原创 2021-08-17 15:23:40 · 119 阅读 · 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 评论 -
CodeForces 1511D
CodeForces 1511D写在前面:这题四月份做了,当时没想出来,然后补出来了,今天又遇到了又没想到,真的对自己好无奈题意:给你k种字符,让你构造一个字符串,如果s[i] == s[j] && s[i+1] == s[j+1]就answer ++,问最少的answer构造出来的字符串思路:样例一其实就是构造方式,aa、ab、ac、ad、bb、bc、bd,这样构造看似最好,其实最前面的aa和bb、cc…什么的不需要,只需要一个即可,这样才是最优的,可能很大,所以可能会出现answ原创 2021-08-13 22:04:19 · 106 阅读 · 0 评论 -
LibreOJ - 2120
LibreOJ - 2120题意:一个数字的懒惰值定义为从最后一位删去0直到遇到非0,剩下的位数乘2就是懒惰值(如果剩下的位数最后一位是5,那就答案减一),给L到R,找到懒惰值最小的思路:肯定是考虑后面的0越多越好,假如给了我们[3152,4111],那么可以这么枚举:3152->3153->3154…->3159->3160->3170->3180->3190->3200->3300->3400->…->3900->4000原创 2021-08-13 21:56:11 · 139 阅读 · 0 评论 -
HDU-6968-I love exam
I love exam题意:有n门考试,剩余t天,m次辅导课,每次辅导课对应一门考试,每次辅导课要花费x天可以为这门课增加y分,问在挂科门数不超过p的情况下能得到的最高分思路:我们这里令A[i][j],表示第i门课花费j天最多获得多少分,得到之后,我们其实就知道了对于每一个门课,花费1天、2天、3天…t天最多能得多少分;B[i][j][k],表示前i门课花费j天还能挂k科最多能得多少分,所以我们在求B时,前两重循环还是前i门花费j天(代表01背包中的第一重物品价值与重量),后两重循环代表花费不超过该重量原创 2021-08-12 21:11:33 · 2641 阅读 · 0 评论 -
HDU-6959-zoto(莫队+分块)
HDU-6959题意:给一个f数组,f[i]表示横坐标为i的纵坐标,给出m次询问,每次给出一个(x0,y0),(x1,y1),问这两个点围成的矩形中有多少个不同的y坐标思路:我们对横坐标使用莫队,对纵坐标使用分块,用num[i]表示纵坐标为i的个数,用sum[i]表示第i个块内有几个不同的纵坐标,对每个询问用前缀和思想求A® - A(l-1)即可,时间复杂度n*sqrt(n)#include<bits/stdc++.h>using namespace std;#define inf 0原创 2021-08-06 11:04:25 · 177 阅读 · 0 评论 -
2021牛客暑期多校训练营5——B: Boxes
2021牛客暑期多校训练营5——B: Boxes题意:给n个盒子,里面要么是白球要么是黑球,每打开一个需要w[i]花费,你可以用c元来得到提示现在还有多少个黑球,问知道每个盒子里面是什么颜色的球的最小花费的期望思路:假如不用提示,则需要所有的w[i]之和;假如用提示,那么最开始用最好,然后当我们在开到第i个盒子之后发现刚好找到的所有的黑球或者白球,那么后面的就不用开了(显然最后一个格子永远也可以不被开)。所有我们用x[i]表示在i~n中颜色全部相同的概率,显然x[n] = 1,x[n-1] = 1/原创 2021-08-02 09:49:05 · 141 阅读 · 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 评论 -
HDU - 1875
HDU - 1875题意:n个岛屿,给出Oxy坐标,问让n个岛屿互相连接需要多少钱思路:最小生成树,先预处理出每个岛屿到其他n-1个岛屿的距离,然后对于这n个点(n-1)*n/2条边用最小生成树算法即可#include<iostream>#include<cstdlib> #include<sstream>#include<cstdio>#include<stack>#include<cstdio>#include&l原创 2021-07-31 16:36:59 · 102 阅读 · 0 评论 -
POJ - 1611
POJ - 1611题意:n个人,m个团体,每个团体里的人是一个集合,多个团体也可能由于一些人有联系,变成了一个集合,问与0号在一个集合里的人数思路:简单并查集,注意一下输入就行了#include<iostream>#include<cstdlib>#include<map>using namespace std;int p[100000];int find(int root){ if(root==p[root])return p[root];原创 2021-07-31 16:32:25 · 134 阅读 · 0 评论 -
HDU - 3038
HDU - 3038题意:给n个区间和,问假话的数量思路:边带权并查集,我们发现,给了[1-2]的和、[3-4]的和,就代表这有了[1-4]的和,所以用并查集合并端点时,我们需要令左端点减一或者右端点加一。之后直接套用边带权并查集模板,判断新给出的区间关系与并查集中的该区间关系是否相等#include<iostream>#include<cstdlib> #include<sstream>#include<cstdio>#include<s原创 2021-07-31 16:25:09 · 216 阅读 · 0 评论 -
CodeForces 1013D
CodeForces 1013D题意:给一个n*m的网格,再给一些坐标,代表这个坐标被标记。对于任意两行两列,会出现4个交点,如果有三个交点被标记,那么第四个交点就会自然的变成被标记;现在问你令这张网格所有的地方都变成被标记,至少还需要增加多少个被标记的点思路:对于一个点(1,2),如果他想被标记,那么就需要(1,y)、(x,2)、(x,y)这三个点(x,y是在图内的任意点),那么我们观察这几个数字是不是1->2,2->x,x->y,y->1这样构成了一条连通路径,那么对于点(1原创 2021-07-31 16:00:18 · 164 阅读 · 0 评论 -
POJ - 2236
POJ - 2236题意:n个电脑,用Oxy坐标表示,有m次操作,如果是O x,就是将第x台电脑修复,并且其他所有好的电脑如果和它的距离小于等于d,那么就可以连通;如果是S q p,就是询问q和p是否可以连通(可以间接连通)思路:先处理一下n台电脑相互之间的距离,如果进行O操作,那么遍历其他n-1台电脑,如果距离小于d并且电脑已被修复,那么进行集合连接;如果进行S操作,直接查询即可#include<iostream>using namespace std;#define inf 0x3原创 2021-07-31 14:41:59 · 251 阅读 · 0 评论 -
POJ-3026
POJ-3026题意:给一个n*m的地图,里面有一个S和若干个A,问从S到所有的A的距离之和最短(S可以无限在任意时刻分身,但是每秒只能移动一个分身)思路:由于S可以随时随地分身,那么其实就是求令所有的A和S连通的最小路径和;所以我们先用BFS求每个A或S到其他所有A或S的最短距离,然后求一个最小生成树即可#include<iostream>#include<cstdlib> #include<sstream>#include<cstdio>#i原创 2021-07-31 14:29:55 · 164 阅读 · 0 评论 -
CodeForces - 1286A
CodeForces - 1286A题意:给一个拥有n个元素的数组,由1~n组成,但是有些元素由于某种原因变成了0,现在让你将其中的0用缺少的元素替换上去;我们定义两个相邻的元素如果奇偶性不同,那么就是一个不完美一对,求补全数组后不完美对数的最小值思路:给一个n,那么数组中必定有n/2个偶数和(n+1)/2个奇数,但是我们先不考虑有多少个偶数,多少个奇数;我们这里定义一个dp[i][j][k],表示前i个元素中有j个偶数并且以k结尾的最小不完美对数,显然,k只能为奇数或者偶数。那么我们从前往后遍历数组原创 2021-07-28 16:05:37 · 159 阅读 · 0 评论 -
Gym - 102889C
对于非负整数 u, v 的异或 ,w 二进制下第 i 位为 1,当且仅当 u 和 v 二进制下的第 i 位不相同。非负整数 x 的 ,定义为 x 二进制下 1 的个数,比如 , , 。现给一个长度为 n 的数组 a1, a2, …, an。定义数组连续的一段 al, al + 1, …, ar 的分数为该段内所有数异或的 ,即:需要请你给出如下信息:1.请给出数组 ai 的一个分段方案,使得各段分数的总和最大;2.请给出数组 ai 的一个分段方案,使得各段分数的总和最小。思路:总和最大肯定就是分原创 2021-07-23 19:50:27 · 110 阅读 · 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 评论 -
HDU - 2612 (我服了,不光POJ干坏事,HDU也干坏事?)
POJ3026,详情吐槽请看链接,这次又来了个HDU,c++提交一直WA,换到G++立马对?题意:无需解释,有中文。思路:分别从Y和M进行两次板子bfs,只用在遇到@的时候把距离+=stemp就好了,最后输出最小即可。代码:#include<iostream>#include<cstdlib> #include<sstream>#include<cstdio>#include<stack>#include<cstdio&g原创 2020-09-15 21:07:10 · 136 阅读 · 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 评论 -
POJ-3026(垃圾poj,哈哈)
题目链接题目大意:我看不懂题,看别人博客说题意就是所有S到A的连接的最小距离。思路:最小生成树(我用的kruskal)+广搜;本题坑点(太恶心了):①读完nm要用gets(),用getchar还不行。②开的数组还必须比给的范围大很多,要不给报WA(不报RE,无语了)③用G++提交TLE的代码和WA的代码可以在C++上AC(浪费好长时间)具体做法:用广搜求出每个A到其他A和S的距离。然后套kruskal的板子就行了,注意POJ的那些坑就行了。代码:#include<iostream>原创 2020-09-14 18:21:26 · 96 阅读 · 0 评论 -
并查集的简单例题(HDU - 1213,POJ - 2524,POJ - 1611)
并查集的简单例题(基础)HDU - 1213 题意:每次给两个人,找出最后的帮派数(帮派之间没有共同的一个人,否则将是一个帮派了)思路:①最简单的并查集应用,直接套用模板。②利用DFS进行搜索也可以。代码:并查集:#include<iostream>#include<cstdlib> #include<sstream>#include<...原创 2020-04-21 10:37:30 · 223 阅读 · 0 评论 -
POJ - 3126(简单bfs,素数打表)
题目链接题目大意:给俩4位数n1,n2,找出从n1变到n2的最小步数思路:bfs一个一个找,外加素数打表防止TLE(我还是看别人的)。代码:#include<iostream>#include<cstdlib> #include<sstream>#include<cstdio>#include<stack>#includ...原创 2020-04-10 17:27:38 · 201 阅读 · 0 评论 -
POJ-1426(简单bfs)
POJ1426题目链接题意:给个n(小于200)找一个数(不多于200位)只含1、0两个的数字。思路:由于n小于200,所以直接暴力从小到大找,依次1->10->11->100->101->110->111->…直到找到后返回。代码:#include<iostream>#include<cstdlib> #includ...原创 2020-04-09 21:54:48 · 819 阅读 · 3 评论 -
FZU 1937(字符串模拟)
FZU 1937题目链接题目大意:给你两个字符串s1,s2要求把s2插入s1(也就是有strlen(s1)+1种新的字符串)看这些中那些是回文的。思路:给的两个字符串都是小于50个,所以直接模拟。代码#include<iostream>#include<cstdlib> #include<sstream>#include<cstdio>...原创 2020-04-09 21:35:29 · 134 阅读 · 0 评论 -
POJ-3278(bfs基础)
题目链接题目大意:给俩点n,k,可以对n进行①n=n-1②n=n+1③n=2*n三种操作找到最小的操作数。思路:使用bfs进行每一层的搜索,例如n=1,k=3第一层操作后得到第二层n1=0;n2=2;n4=4;然后第二层在对每个值(n1,n2,n3)操作得到第四层分别为n11=-1(小于0,舍去),n12=1(已走过,舍去),n13=0(已走过,舍去)n21=1(走过,舍去),n22=3(此...原创 2020-04-08 12:40:43 · 546 阅读 · 0 评论 -
HDU - 1716(next_permutation的用法)
题目链接题意:全排列找出第k大的排列。思路:如果n<10~15,可以用dfs暴力搜索,但是n<1000;所以要用STL里的next_permutation函数来写————附上原博客并且,我的上条博客的题目:HDU - 1716也可用此方法写。代码:#include<iostream>#include<cstdlib> #include<ss...原创 2020-04-07 20:49:55 · 237 阅读 · 2 评论 -
HDU - 1716无需思考暴力做法
题目链接题意:不用说。思路:全排,没有前导0,并且数字不能重复。暴力模拟:#include<iostream>#include<cstdlib> #include<sstream>#include<cstdio>#include<stack>#include<cstdio>#include<map&g...原创 2020-04-07 18:27:13 · 126 阅读 · 0 评论 -
HDU-2648(map的简单使用)
HDU-2648题目链接题意:给出几天超市rank的增长,在每一天输出“memory”这个超市的排名;思路:直接用map去映射每一个超市,然后在每一天用迭代器遍历出“memory”的排名(题目给了5000ms,所以遍历应该不超时)。代码:#include<iostream>#include<cstdlib> #include<sstream>#i...原创 2020-04-07 11:48:19 · 337 阅读 · 0 评论