自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(53)
  • 资源 (1)
  • 收藏
  • 关注

原创 HDU 6214-求最小割的最小边数

HDU 6214求最小割的最小边数题目:给出一张有向图,求出最小割的最小边数解法:​ ①:建边时边权设成 d * (较大的数x),然后最小割就是 最大流 / (较大的数x),最小割的最小边数就是 最大流 % (较大的数x)​ ②:跑一遍 dinic 然后把满流的边边权设为 1 ,不满流的设为 inf 或 0 ,再跑 dinic 就是答案​ ③:跑一遍 dinic 然后将所有点分为两个集合(S,T),然后枚举每条满流的边,如果这条边的一点在S集合里另一个点在T集合里就是割边,我们发现分集合

2021-11-09 17:04:19 219

原创 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 187

原创 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 471

原创 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 259

原创 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 75

原创 网络流之最小割学习总结

网络流之最小割学习总结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 184

原创 #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 148

原创 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 126 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 149

原创 扩展欧几里得求多组解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 141

原创 网络流之最大流学习总结

网络流之最大流学习总结Acwing-2171-EK求最大流该算发可用于求流网络的最大流,大致过程就是每次找一条路径,然后这条路径上面的容量都减去这条路径里的容量最小值,由于每次找一条,所以复杂度较高AcWing 2172. Dinic/ISAP求最大流这里使用了Dinic,并没有用ISAP,两者掌握一种即可。Dinic利用了分层思路,每次BFS进行分层,然后DFS,这样一次BFS可以找到多条路径。算法中利用了两种优化:​ ①优先弧优化:某个节点的某条出边流量已经满了,那么下次DFS就不必再

2021-08-30 17:56:22 296

原创 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 140 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 62

转载 有上下界的网络流

这位大佬写的太好了,收藏!有上下界的网络流

2021-08-18 21:14:19 47

原创 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 87

原创 树链剖分(模板)

#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 65

原创 折半枚举、二进制枚举——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 136

原创 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 77

原创 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 102

原创 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 2183

原创 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 144

原创 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 113

原创 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 160

原创 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 78

原创 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 105

原创 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 181

原创 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 124

原创 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 221

原创 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 142

原创 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 132

原创 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 2457

原创 在数组中选取连续一段元素,长度大于等于k,找出平均值最大是多少

在数组中选取连续一段元素,长度大于等于k,找出平均值最大是多少思路:二分答案我们在0~最大可能值中二分答案,将答案传入check函数,用check函数判断当前答案是否可以找到一段区间其平均值大于等于当前答案,如果大于等于,那么真正答案一定大于等于当前二分答案。check函数:先将整个数组减去二分的答案res,然后求一个前缀和,从前缀和中找是否有某个长度大于等于k的区间和大于等于0,如果大于等于0代表一定存在另外一个区间,使得答案大于此二分答案resint n,kdouble eps = 1e-1

2021-07-26 20:33:33 608

原创 多维空间中求一个点相对一条线的对称点

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 766 4

原创 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 71

原创 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 88

原创 匈牙利算法

匈牙利算法算法用途:用于求最大匹配数,比如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 97

原创 求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 1122

原创 读入字符串的几种方法

一:使用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 6941

原创 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 66

原创 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 104

并查集、最小生成树.pptx

适用于讲课、复习、理解

2021-07-26

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除