目测 普及/提高- 难度. 思路 将 9 种可能的等级存储在数组里,则 min 值为分数为 0 ~ 3199 的颜色种类个数,max 值为 min 值加上分数 >3200 的人数. 特判 若分数为 0 ~ 3199 的颜色种类个数为 0,分数 >3200 的人数大于 1,则min 值为 1,max 值为分数 >3200 的人数 代码 #include <stdio.h> int getBlock(int rating) { if (rating < 400) retur…
[洛谷P3376题解]网络流(最大流)的实现算法讲解与代码 更坏的阅读体验 定义 对于给定的一个网络,有向图中每个的边权表示可以通过的最大流量.假设出发点S水流无限大,求水流到终点T后的最大流量. 起点我们一般称为源点,终点一般称为汇点 内容前置 1.增广路 ​ 在一个网络从源点S到汇点T的一条各边剩余流量都大于0(还能让水流通过,没有堵住)的一条路. 2.分层 ​ 预处理出源点到每个点的距离(每次寻找增广路都要,因为以前原本能走的路可能因为水灌满了,导致不能走了).作用是保证只往更远的地方放水…
本文摘自本人洛谷博客,原文章地址:https://www.luogu.com.cn/blog/cjtb666anran/solution-p5759 \[这道题重在理解题意 \] 选手编号依次为: \(1,2...N\) ( \(N\) 为参赛总人数). 设 \(x_{ij}\) 分别表示编号为 \(i\) 的选手第 \(j\) 项竞赛的成绩 \((1 \le i \le N\),\(1 \le j \le 8)\) .其它指标如下: 第 \(j\) 项竞赛的平均分 $ avg_j = \fra…
题目描述 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用“H” 表示),也可能是平原(用“P”表示),如下图.在每一格平原地形上最多可以布置一支炮兵部队(山地上不能够部署炮兵部队):一支炮兵部队在地图上的攻击范围如图中黑色区域所示(我就不贴图) 如果在地图中的灰色所标识的平原上部署一支炮兵部队,则图中的黑色的网格表示它能够攻击到的区域:沿横向左右各两格,沿纵向上下各两格.图上其它白色网格均攻击不到.从图上可见炮兵的攻击范围不受…
不会并查集的话请将此文与我以前写的并查集一同食用. 原题来自洛谷 原题 文字稿在此: 题目背景 现代的人对于本家族血统越来越感兴趣. 题目描述 给出充足的父子关系,请你编写程序找到某个人的最早的祖先. 输入输出格式 输入格式: 输入由多行组成,首先是一系列有关父子关系的描述,其中每一组父子关系中父亲只有一行,儿子可能有若干行,用#name的形式描写一组父子关系中的父亲的名字,用+name的形式描写一组父子关系中的儿子的名字:接下来用?name的形式表示要求该人的最早的祖先:最后用单独的一个$表示…
想要深入学习树形DP,请点击我的博客. 本题的DP模型同 P1352 没有上司的舞会.本题的难点在于如何把基环树DP转化为普通的树上DP. 考虑断边和换根.先找到其中的一个环,在上面随意取两个点, 断开这两个点的边,使其变为一棵普通树.以其中的一点为树根做树形DP,再以另一点为树根再做一次树形DP,因为相邻的两点不能同时选,所以最后统计一下 \(f(i)(0)\) 与 \(g(j)(0)\) 的最大值即可. 定义 \(f(i)(0/1)\) 为第一次树形DP的 \(i\) 点的最优解,\(g(i…
题目链接 因为题目说输入保证会交头接耳的同学前后相邻或者左右相邻,所以一对同学要分开有且只有一条唯一的通道才能把他们分开. 于是可以吧这条通道累加到一个数组里面.应为题目要求纵列的通道和横列的通道条数有限制,所以我们用贪心,将数据存入结构体在根据每一条线隔开的同学对数排序,得出前k条横线和前l条纵线就是要分割的通道. 因为题目要求输出按照\(a_i<a_{i+1}\),\(b_i<b_{i+1}\). 所以我们在根据\(a_i\)和\(b_i\)从小到大排序. 上代码 #include<…
这道题实在是一道 毒瘤 题,太坑爹了.那个写 \(deque\) 的题解亲测只有80分,原因 不言而明 ,这道题居然 丧心病狂 到 卡STL . 好了,不吐槽了,进入正题 题目分析: 这是一道十分 简单 的DP,相信大家也可以很容易地吧DP状态转移方程给推出来.我就献丑给大家推一遍,如有错漏,请留言,谢谢. 我们可以定一个函数 \(f(i)\) ,它表示跳到 \(i\) 棵树上去的 \(f(i)\) 的劳累值.由题可知,可以 \(i-v,i-v+1,i-v+2,......i-2,i-1\) 棵…
别碰我! 自己还是太蒟了…… 看了好久,最后抄参考题解打出来的…… 前面的可能影响后面的,所以按照询问右端点排序 这时候维护一个前缀和数组就可以了, 那么问题又来了,去重? 可以这样,从前往后枚举,如果被加过了就在前面去掉 具体看代码(题目毒瘤导致卡常卡了好几遍): #include<bits/stdc++.h> #define rint register int #define lowbit(x) (x&(-x)) using namespace std; ],a[],vis[],o…
这道题告诉我,背的掉板子并不能解决一切问题,理解思想才是关键,比如不看题解,我确实想不清楚这题是弗洛伊德求最短路 (我不该自不量力的说我会弗洛伊德了我错了做人果然要谦虚) 灾后重建 题目背景 B地区在地震过后,所有村庄都造成了一定的损毁,而这场地震却没对公路造成什么影响.但是在村庄重建好之前,所有与未重建完成的村庄的公路均无法通车.换句话说,只有连接着两个重建完成的村庄的公路才能通车,只能到达重建完成的村庄. 题目描述 给出B地区的村庄数N,村庄编号从0到N-1,和所有M条公路的长度,公路是双向…
题面 本人用的是暴力分类讨论 + \(unordered\_map\) 存储,与所有的题解都不同. 因为 \(n \leq 6\) ,非常的小,并且我不想写 DFS,所以直接暴力分类讨论 \(n=1,n=2,\dots,n=6\) 的情况. 当 \(n \leq 3\) 时,可以用循环嵌套来解决,这里就不再赘述了. 当 \(n > 3\) 时,暴力循环去做的时间复杂度达到了 \(O(m^n)\) ,无法通过本题,所以考虑优化(以 \(n=6\) 为例,其余类推):先枚举 \(x_1,x_2,x_…
题意 Link 求 \[\sum_{i=1}^{2^n}\log_2\left(\prod_{j=1}^i\operatorname{lowbit}(j)\right) \] \(n\le 2^{64}\) . 题解 Update. 好像有更简单做法 . 有趣题 . 首先这个 \(\log\) 可以丢到里面去吧 \[\sum_{i=1}^{2^n}\sum_{j=1}^i\log_2(\operatorname{lowbit}(j)) \] 然后这个 \(\log_2(\operatorname…
题目 这个题主要是一个考分类讨论的模拟题,做这个提的时候首先要脑子清醒,才可以清楚地写出怎么模拟来. \(Code\) #include <iostream> #include <algorithm> #include <cstring> #include <cstdlib> #include <cstdio> #define N 100100 using namespace std; int n, k, ans[N], cv[N]; int m…
题面 裸跑一遍SPFA,统计每个点的入队次数: 如果该点的入队次数>=总点数,那么该点便是一个负环上的点: 重点!!!: 1.不是“YES”,是“YE5”: 2.不是“NO”,是“N0”:(是零): 3.多测不清空,爆零两行泪: #include <bits/stdc++.h> #pragma GCC optmize(2) using namespace std; int t; int n,m; struct littlestar{ int to; int nxt; int w; }st…
题面 利用暴力快速幂O(nlogn)会TLE掉: 所以对于求1~n的所有逆元要用递推公式: #include <bits/stdc++.h> using namespace std; ]; int main () { int n,p; cin>>n>>p; inv[]=; cout<<inv[]<<endl; ;i<=n;i++){ inv[i]=(p-p/i)*inv[p%i]%p; printf("%lld\n",i…
题面 因为 n=lcm(a,b)n = lcm(a, b)n=lcm(a,b) ,可以得出: a  和 b  的质因数都是 n 的质因数 对于 n  的每个质因数 x ,在 n 中的次数为 y ,那么 x  在 a 和 b  中至少有一个次数为 y,在另一个中的次数 <=y. 所以我们只要把 n 的每个质因数的次数求出来就好了 即ans=(2a1+1)×(2a2+1)×……×(2an+1). #include <iostream> #include <cmath> #prag…
题面 思路一:纯模拟.(暴力不是满分) 思路: 1.定义一个二维数组. 2.根据每个数据给二维数组赋值. 3.最后输出那个坐标的值. 思路二(正规思路): 逆序找,因为后来的地毯会覆盖之前的,一发现有解就输出…
吐槽一下:蜜汁UKE是什么玩意?! 题目分析: 观察题面,对于给定的组卷要求,计算满足要求的组卷方案,可以发现这是一道明显的有条件的二分图匹配问题,于是考虑建模. 建一个超级源点,一个超级汇点:源点与试题相连,汇点与类型相连. 重点是类型的题数的建模.可以从感性来理解一下,其实这有一点限流的意思,每个类型只要求有这么多的题量,不能超出,于是考虑在类型与汇点相连的时候将容量设为类型的题数,在算最大流的时候将题量限制住,就能满足题面的要求了.(希望大家能明白我的意思 \(QwQ\) ) 最后的图即为…
我在这里就讲两种方法 Prim 和 Kruscal Kruscal kruscal的本质其实是 排序+并查集 ,是生成树中避圈法的推广 算法原理如下 (1)将连通带权图G=<n,m>的各条边按从小到大的次序排列,写成E1,E2,···Em,其中E1的权最小,Em的权最大,m为边数.//这就是排序的原因 (2)取权最小的两条边E1,E2,构成边的集合T,即T={E1,E2}.从E3起,按次序逐个将边加进集合T中去,若出现回路则将这条边排除(不加进去),按此法一直进行到Em,最后得到n-1条边的集…
我先讲一下我的思路 将A,B,C,D四种操作用函数储存起来: 枚举所有可能出现的情况:A,B,C,D,AA,AB,AC,AD,BB,BC,BD,CC,CD,DD,ABC,ABD,ACD,BCD,ABCD共19种情况:(这里面一定有遗漏的点,但由于数据太水,所以没有一一列出来) 对初始矩阵进行上面枚举的操作,如果操作后与最终矩阵相同,便直接输出所对应的枚举的操作: 如果此时还没有结束程序(即所有操作都枚举完之后,皆不符合最终矩阵),就直接输出"Poland cannot into space!!!…
吐槽: 只能说这道题很数学,本数学蒟蒻推了半天没推出来,只知道要用绝对值,幸亏教练提醒,才勉强想出正解(似乎不是这样的),真的是很无语. 以上皆为吐槽本题,可直接 跳过 分析: 既然题目是要使书架上的书一样多,那么就一定要求平均数了 \(s=\sum_{i=1}^n book_i,s=s\div n\),\(s\)即为平均数 继续分析,我们将平均数减掉,得出一个书架需要改变的量\(x_1,x_2,\)···\(x_n\),这时我们发现,我们可以得出一个方程组 \(\begin{cases}x_1…
前言: 其实这道题挺水的,但我居然把ta想成了 贪心 啪啪打脸 好了,废话不多说. 思路: step 1:先翻译以下题意,其实就是求出最多消耗多少体力能把东海填满,如果不能填满,就输出"Impossible" step 2:于是想到 贪心 01背包,以搬石头消耗的体力为物品的体积,以石头的 step 3:我们现在已经求出(1~c)所有体力可搬走的最大的体积,假如此时以i体力可填满东海,消耗的体力就是(c-i):如果以c的体力都不能填满,就输出"Impossible"…
给出一种主函数递归的方法(其实主函数 main() 也是可以递归的) #include <stdio.h> int main() { int a; scanf("%d", &a); if (a != 42) { printf("%d\n", a); main(); } return 0; }…
题目 这道题让我们求最小限重的最大值 显然可以先求出最大生成树,然后在树上进行操作 因为如果两点之间有多条路径的话一定会走最大的,而其他小的路径是不会被走的 然后考虑求最小权值 可以采用倍增求LCA,预处理时顺便把最小权值求出来 Code: #include<bits/stdc++.h> #define IO4 10000+10 #define debug cout<<"Error"<<endl using namespace std; int n,…
这是题目吗? 显然的DP,讲几个重要的地方 1.贪心:让吃饭时间长的先排队(证明从略) 2.状态: f[i][j][k]代表前i个人,一号时间j,二号时间k显然MLE 所以压缩成f[i][j]代表前i个人,一号时间j,用前缀和维护时间,s[i]-j就是二号的时间 Code: #include<bits/stdc++.h> using namespace std; struct Person { int take,eat; bool operator < (Person ano)const…
我不是题目的说 这道题运用了一种很巧妙的DP方式:悬线法 如图,蓝色为悬线,黄色为向两边延伸的长度 那么显然,最大子矩形的宽一定是这些黄线中最小的(证明从略) 所以我们可以维护三个数组: Up[i][j]表示向上延伸的长度 Left[i][j]表示向左能延伸到的最远横坐标 Right[i][j]表示向右能延伸到的最远横坐标 Code: #include<bits/stdc++.h> #define INF 0x3f3f3f3f using namespace std; int n,m,maxR…
(别点我我不是题目) 这道题可以很容易看出是一道dp(因为是在dp关卡里找的) 稍微想一下就可以yy出一个不错的状态: f[i][j][k][0/1]代表走到了点(i,j).膜液量相差k(小a-uim=k).小a/uim最后取的情况数 坑一: f[][][][]:Accepted .00s .31MB f[][][][]:Unaccepted .11s .00MB//MLE三个点 转移也很好办:一个点只可能从左边或者上边走来 int tmp=(c-mp[i][j]+k)%k; f[i][j][c…
这题打着高精的旗号其实是闹着玩的……(我不是题目) 数据范围就是提示你这题O(1)的 我们知道,一个数膜9的余数等于它数字和膜9的余数 我们可以把l到r加起来然后膜9 也就是(l+r)(r-l+1)/2%9 出现了除法所以我们把/2转化成逆元*5 就完了. #include<bits/stdc++.h> using namespace std; long long q,l,r; int main(){ cin>>q; while(q--){ cin>>l>>…
题目戳我 很明显的这题是一道dp,主要讲一下几个细节 1.初始化 我们需要初始化边界情况也就是一个字符串为空的情况 #----------# #----------# A:aaaaaa A:□□□□□□ B:□□□□□□ or B:bbbbbb #----------# #----------# 这时f[i][0]=i*k,f[0][j]=j*k. 另外注意都为空也就是f[0][0]=0 2.dp 这道题的转移有三种 ()字符对字符 A:xxx...a B:xxx...b 由f[i-][j-]转…
这道题可以用各种算法踩掉,我选择的是SPFA. 因为题目要求计数,所以我们开一个ans数组表示数量. 分两种情况讨论: 一:dis_v>dis_u+1 最短路被更新了,可以直接ans_v=ans_u覆盖. 二:dis_v==dis_u+1 又找到一条最短路,将条数相加即可. 具体看代码: #include<bits/stdc++.h> #define mod 100003 using namespace std; struct Edge { int to,next; }e[]; ],cn…