10 2022 档案
摘要:二叉苹果树 题目描述 有一棵苹果树,如果树枝有分叉,一定是分二叉(就是说没有只有一个儿子的结点) 这棵树共有 个结点(叶子点或者树枝分叉点),编号为 ,树根编号一定是 。 我们用一根树枝两端连接的结点的编号来描述一根树枝的位置。下面是一颗有 个树枝的树: 2
阅读全文
摘要:樱花 题目背景 《爱与愁的故事第四弹·plant》第一章。 题目描述 爱与愁大神后院里种了 棵樱花树,每棵都有美学值 。爱与愁大神在每天上学前都会来赏花。爱与愁大神可是生物学霸,他懂得如何欣赏樱花:一种樱花树看一遍过,一种樱花树最多看 $A_i
阅读全文
摘要:[NOI1995] 石子合并 题目描述 在一个圆形操场的四周摆放 堆石子,现要将石子有次序地合并成一堆,规定每次只能选相邻的 堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分。 试设计出一个算法,计算出将 堆石子合并成 堆的最小得分和最大得分。 输入格式 数
阅读全文
摘要:We Need More Bosses 题面翻译 题目大意: 给定一个个点条边的无向图,找到两个点,使得到必须经过的边最多(一条边无论走哪条路线都经过ta,这条边就是必须经过的边), 输入格式: 第一行两个整数,$n
阅读全文
摘要:[HNOI2003]操作系统 题目描述 写一个程序来模拟操作系统的进程调度。假设该系统只有一个CPU,每一个进程的到达时间,执行时间和运行优先级都是已知的。其中运行优先级用自然数表示,数字越大,则优先级越高。 如果一个进程到达的时候CPU是空闲的,则它会一直占用CPU直到该进程结束。除非在这个过程中
阅读全文
摘要:[SNOI2017]炸弹 题目描述 在一条直线上有 个炸弹,每个炸弹的坐标是 ,爆炸半径是 ,当一个炸弹爆炸时,如果另一个炸弹所在位置 满足: ,那么,该炸弹也会被引爆。 现在,请你帮忙计算一下,先把第
阅读全文
摘要:题目描述 给两个的矩阵A和B,你可以进行若干次操作。每次操作你可以使A或B的某一行或者某一列的所有元素增加1。 问至少要多少次操作,才能使A和B相等。 输入格式 从文件a.in中读入数据。 第一行一个正整数T,表示数据组数。 每组数据的第一行两个正整数n,m。 接下来n行,每行m个非负整数
阅读全文
摘要:题目描述 Tom 最近学习了滑动窗口类的算法,滑动窗口算法可以解决一些线性数组的离线静态区间查询类问题。 具体来说,假设对于一个数组进行 次静态区间查询问题。如果这些查询满足条件:,当 (表示查询的编号,表示查询的左右端
阅读全文
摘要:题目描述 Tom 的班级中有 个人,他们的性格各不相同。 Tom 现在想要从这 个人中选出一些人组成一个兴趣小组,但是他想让参加这个兴趣小组的人数尽可能的多。但是他又不想让其中有任何一对人之间由于性格问题产生矛盾。 具体来说,如果这个兴趣小组中出现两个人性格值的乘积开三次方根是一个正
阅读全文
摘要:(芭芭拉太可爱了叭......) 题目描述 在企鹅国,企鹅们是通过滑冰出行的。每次滑冰需要选择一个营地作为起点,一个营地作为终点,然后从营地 滑到营地 需要的时间是 。 现在企鹅豆豆在 $
阅读全文
摘要:[JSOI2007] 建筑抢修 题目描述 小刚在玩 JSOI 提供的一个称之为“建筑抢修”的电脑游戏:经过了一场激烈的战斗,T 部落消灭了所有 Z 部落的入侵者。但是 T 部落的基地里已经有 个建筑设施受到了严重的损伤,如果不尽快修复的话,这些建筑设施将会完全毁坏。现在的情况是:T 部落基地
阅读全文
摘要:[NOIP2010 提高组] 乌龟棋 题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物。 题目描述 乌龟棋的棋盘是一行个格子,每个格子上一个分数(非负整数)。棋盘第1格是唯一的起点,第格是终点,游戏要求玩家控制一个乌龟棋子从起点出发走到终点。 乌龟棋中张爬行卡片,分成4种不
阅读全文
摘要:快速求和 题目描述 给定一个数字字符串,用最小次数的加法让字符串等于一个给定的目标数字。每次加法就是在字符串的某个位置插入一个加号。在里面要的所有加号都插入后,就像做普通加法那样来求值。 例如,考虑字符串12,做 次加法,我们得到数字 。如果插入 个加号,我们得到 ,因
阅读全文
摘要:大师 题目背景 建筑大师最近在跟着数学大师 ljt12138 学数学,今天他学了等差数列,ljt12138 决定给他留一道练习题。 题目描述 ljt12138 首先建了 个特斯拉电磁塔,这些电塔排成一排,从左到右依次标号为 到 ,第 个电塔的高度为 。 建筑
阅读全文
摘要:P2285 [HNOI2004]打鼹鼠 题目描述 鼹鼠是一种很喜欢挖洞的动物,但每过一定的时间,它还是喜欢把头探出到地面上来透透气的。根据这个特点阿牛编写了一个打鼹鼠的游戏:在一个 的网格中,在某些时刻鼹鼠会在某一个网格探出头来透透气。你可以控制一个机器人来打鼹鼠,如果 $
阅读全文
摘要:p1006 这道题其实和1004的方格取数差不多。 先放一下四维DP的代码,与之前不同,l从j + 1开始,这样保证了不会有重复的点,中点(n,m)的值为0,所以最后的答案是f[n][m - 1][n - 1][m]。 #include <bits/stdc++.h> using namespace
阅读全文
摘要:P1004 [NOIP2000 提高组] 方格取数 题目描述 设有 的方格图 ,我们将其中的某些方格中填入正整数,而其他的方格中则放入数字 。如下图所示(见样例): A 0 0 0 0 0 0 0 0 0 0 13 0 0 6 0 0 0 0 0
阅读全文
摘要:(神里......) 先来复习一下C++STL库函数的二分查找lower_bound和upper_bound。 lower_bound求的是序列中第一个大等于目标元素,返回其位置,upper_bound求的是序列中第一个大于目标元素的位置。 序列{}下标从1开始,二者的形式: int
阅读全文
摘要:##题目描述 作为学校违纪行为的代言人,小S被老师安排去排一个新班级的座位。新班级有 n位同学,他们的成绩按顺序分别为。教室的一桌会坐相邻的两个人,称为同桌。为促进互帮互助,一对同桌的成绩之差的绝对值必须大于等于给定的常数 K,
阅读全文
摘要:##题目描述 小D今天学习了哈希,因此她对一个等比数列在模意义下的值产生了浓厚兴趣。她选定了三个数 ,并生成了一个共 n 项且下标从 0 开始的序列 用于研究。但可惜的是,她不小心把 f 排序了一下,并且她忘记了原先的 a 的值,请
阅读全文
摘要:P1194 买礼物 普及的题目,而且一眼就能看出该用什么做法。 我主要是决定这道题建图的思想值得借鉴,每样东西原本的价格是a,所以新建一个节点0, 0向i连边,边权为a,这样一共就有b + 1个点,跑kruskal的时候记录加入的边数,=b时就break。 #include <bits/stdc++
阅读全文
摘要:P3796 差不多还是AC自动机的模板,不过求解得问题不同,这里trie树节点end维护以该点结尾的单词的编号,这样方便我们统计每个模式串出现的次数,最后找到次数最多的模式串即可。 #include <bits/stdc++.h> using namespace std; const int N =
阅读全文
摘要:P3808 KMP用来求单模式串的匹配,AC自动机用来求多模式串的匹配。 就是给你n个模式串,再给你一个文本串,求有多少个模式串在文本串中出现过。 AC自动机的数据结构基于trie数,像KMP的nxt数组一样维护失配指针fail(寻找fail的过程是用bfs实现的),查询过程中不断向下匹配,匹配不了
阅读全文
摘要:这是一篇由超级菜的OIer写的博客...... LIS就是最长上升子序列,通过DP求解。 普通的求法是的(相信大家都会写): ##解法1 #include <bits/stdc++.h> using namespace std; const int N = 105, inf
阅读全文
摘要:题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间。更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过 元钱就行”。今天一早,金明就开始做预算了,他把想买的物品分为两类:主件与附件,附件是从属于某个主件的,下表
阅读全文
摘要:P2392 一道有点意思的题...... 对于每一科的作业, 左右脑各可以解决一门,最后取花费时间较长的作为全部解决完该科作业的答案,计sum为该科作业时间总和,所以当左右脑各花费sum/2时(也就是时间差为0)答案显然是最优的,所以我们要让这个时间差尽可能的小,所以可以用背包。 设背包容量为sum
阅读全文
摘要:P3842 每一行走完该行的线段后才能向下一行移动,那么显然可以按行数为阶段进行DP,发现每一行停止的位置不是在左端点就是在右端点,所以设f[i][0\1]表示走完第i行的线段最终停在左/右端点的最短路程, 从该行的左/右端点向下一行的左右端点转移即可,模拟一下可以得到转移方程。 代码如下: 1 #
阅读全文
摘要:P1077 首先二维数组的DP比较好想,设f(i,j)表示前i种花摆了j盆的方案数,方程为 代码如下: #include <bits/stdc++.h> using namespace std; const in
阅读全文
摘要:P1002 标记马可以到达的地方,因为卒是能向下或向右走,设f[i][j]表示到达(i,j)的路径数,显然有:f[i][j] = f[i - 1][j] + f[i][j - 1]。 DP转移即可。 1 #include <bits/stdc++.h> 2 #define ll long long
阅读全文
摘要:P1802 (日常切水题......) 打人游戏,打不赢获得lose[i],打赢获得win[i],显然win[]>lose[],首先我们肯定可以获得所有的lose,那么打赢每个人就相当于可以获得win-lose,代价为use[i],那么这道题就是一个01背包问题了。 (放张可莉压压惊......)
阅读全文
摘要:P4017 A被B吃,则由A向B连一条有向边,最终得到一个有向图。起点为入度为0的点,终点为出度为0的点,相当于算从起点到终点有多少条不同的路径。 我们设dp[i]表示从起点到i点的路径条数,最终的答案就是所有出度为0的点的dp值相加。dp过程用拓扑排序处理即可。 1 #include <bits/
阅读全文
摘要:P2572 又是一道颠覆我对线段树认知的题...... 线段树每个节点维护八个信息:0/1个数,从左/右起0/1的个数,最长连续的0/1个数。 我们用线段树维护信息是需要区间合并的,因此为保证能够合并,我们才维护以上的八个信息。 打上两个标记:tg1={-1, 0, 1},-1表示没有,0表示将区间
阅读全文
摘要:P2196 将题目的信息转化为图,相当于我们要在图上找一条最长路径,考虑dfs,dp[i]表示以i结尾的最长路径。则有dp[i] = max(dp[j]) + a[i]) j->i。 题目又要求输出路径,所以用pre[i]记录前驱,最后输出即可。 1 #include <bits/stdc++.h>
阅读全文
摘要:01背包裸题。 不用数组记录每个物品的重量和价值,分别用两个变量记录即可。 1 #include <bits/stdc++.h> 2 using namespace std; 3 int t, m, x, y; 4 int f[1005]; 5 int main() { 6 scanf("%d %d
阅读全文
摘要:P1262 间谍a知道间谍b的情报,那么a向b连边,比较显然的做法就是用tarjan先缩点,这样一个联通块中只要一个人被抓捕,其他的都能抓捕,我们对于每个连通块维护块内的最小花费,再维护块内最小的节点编号。 对于入度为0的连通块我们肯定是需要购买的,购买后他所连向的连通块我们就都可以抓捕了,依次下去
阅读全文
摘要:P1407 对于数据读入的处理就是用map将字符串映射为一个数值即可。 我们称n对为夫妇, m对为情人, 如果把这n+m对关系都用边相连,我们可以得到很多个环,在环中如果一对夫妇离婚,那么两个人都可以和环中的情人分别再进行配对,所以我们可以用tarjan来判断一对夫妇是否都在同一个环中,如果在那么这
阅读全文
摘要:P3387 我的做法就是将原图缩点,得到一个DAG新图,在新图上进行DP求最长路径。 1 #include <bits/stdc++.h> 2 using namespace std; 3 const int N = 1e5 + 10; 4 int n, m, t; 5 int dfn[N], lo
阅读全文
摘要:求割点: 1 #include <bits/stdc++.h> 2 using namespace std; 3 const int N = 1e5 + 10; 4 int n, m, t, idx; 5 int tot, head[N], to[N << 1], nxt[N << 1]; 6 in
阅读全文
摘要:1 #include <bits/stdc++.h> 2 using namespace std; 3 const int N = 1e5 + 10; 4 int n, opt, x, val[N], fa[N], sze[N], sum[N], lc[N], rc[N], T, rt; 5 voi
阅读全文
摘要:题目大意: 题目描述. 有𝑛个套娃,大小为𝑎1 ≤ 𝑎2 ≤ … ≤ 𝑎𝑛,现在要将这些套娃分成𝑘组,每组套娃按照大小排序后相邻两个套娃之间的大小差距要求≥ 𝑟,求方案数。 解析: 求方案数, 考虑DP。 dpi,j表示前i个套娃分成j组的方案数。对于套娃i,满足ai - ap>=r时
阅读全文
摘要:题目 感觉这已经不能说是模板了吧...... 解析: 难点在于换根后对子树进行的操作,设rt为当前根节点,u为操作子树: u=rt时,就是对整棵树操作,没事么好说的。 rt不在u的子树范围内,操作对象就是u的子树。 rt在u的子树范围内,操作范围就是整棵树减去u-rt路径上深度最小的点(可以用线段树
阅读全文
摘要:将树通过树链剖分转化成线性序列,用线段树维护最值,和值即可。 1 #include <bits/stdc++.h> 2 using namespace std; 3 const int N = 3e4 + 10; 4 int n, m, head[N], to[N << 1], nxt[N << 1
阅读全文
摘要:P3402 通过主席树维护不同版本的并查集,注意要采用按秩合并的方式,路径压缩可能会爆。 1 #include <bits/stdc++.h> 2 using namespace std; 3 const int N = 3e5 + 10; 4 int n, m, rt[N * 30]; 5 str
阅读全文
摘要:还是用主席树来做(因为提到不同的版本),这时候的主席树不是以权值为下标的,就是普通的线段树,维护范围1~n,i存的是a[ ]中的数。 1 #include <bits/stdc++.h> 2 using namespace std; 3 const int N = 1e6 + 10, M = N *
阅读全文
摘要:主席树另一模板。 查询的是[L,R]中<=h的个数。 1 #include <bits/stdc++.h> 2 using namespace std; 3 #define lc tr[i].ch[0] 4 #define rc tr[i].ch[1] 5 #define Lc tr[j].ch[0
阅读全文
摘要:P3834 主席树模板,求区间第k小。 1 #include <bits/stdc++.h> 2 using namespace std; 3 #define lc tr[i].ch[0] 4 #define rc tr[i].ch[1] 5 #define Lc tr[j].ch[0] 6 #de
阅读全文
摘要:P2680 题目的大意就是走完m条路径所需要的最短时间(边权是时间), 其中我们可以把一条边的权值变成0(也就是题目所说的虫洞)。 可以考虑二分答案x,找到一条边,使得所有大于x的路径都经过这条边(差分维护),并且路径减去这条边的边权后小等于x,通过这样判定x是否可行。 1 #include <bi
阅读全文
摘要:1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const int N = 5e6 + 10; 5 ll fac[N], sv[N], inv[N], a[N]; 6 ll n, p, k; 7
阅读全文