头文件 C 题目链接:ybtoj高效进阶 21289 题目大意 给你一个无向图。 多次询问,每次给你一个区间,你只能保留区间内的点,然后如果一条边连接的点中有不在的或两个点的编号差大于 K 那这个边也不存在。 所有询问的 K 相同,然后对于每个询问输出当前情况下图的连通块数。 思路 考虑一开始
逛动物园 题目链接:ybtoj高效进阶 21252 题目大意 给你 n 个点,值可能是 a,b,c(等概率),然后有以下规则:a 优于 b,b 优于 c,c 优于 a。 然后要你处理若干次操作:把两个点放在一起,保留优的点。然后问你有多少的概率使得 x 点到现在还存在。 思路 首先考虑赢的概率,不难发现本场赢的是 \(\frac
序列修改 题目链接:ybtoj高效进阶 21253 题目大意 给你一个序列,然后一个序列的费用是每个前缀的大小乘里面的数字种类的和。 然后你可以至多修改一个数,费用是原来到现在的绝对值,要你最小化序列费用和修改费用的和。 思路 首先我们可以简单算出一开始不修改的费用,然后考虑修改之后会
摆放鞋子 题目链接:ybtoj高效进阶 21254 题目大意 给你一个网格,然后每个点可能是两个类型的其中一种,四个方向的一种,然后你可以无限次操作,每次选两个相邻的点,一个顺时针转 90 度,一个逆时针转 90 度。 然后两个相邻的点能匹配要他们是不同类型的,而且它们的方向要满足四个条件的其中一
数塔路径 题目链接:ybtoj高效进阶 21268 题目大意 给你一个三角形的数塔,然后多次询问,每次不准走一个点,问你从左上到右下的最长路径和是多少。 (只能向下或右下走) 思路 首先我们不难 DP 出最优答案,但它会 ban 点。 那我们考虑它 ban 掉的点会不会对最优答案造成影响,如果有影响,就
序列修改 题目链接:ybtoj高效进阶 21253 题目大意 给你一个序列,然后一个序列的费用是每个前缀的大小乘里面的数字种类的和。 然后你可以至多修改一个数,费用是原来到现在的绝对值,要你最小化序列费用和修改费用的和。 思路 首先我们可以简单算出一开始不修改的费用,然后考虑修改
正题 题目链接:http://noip.ybtoj.com.cn/contest/596/problem/1 题目大意 \(T\)组询问给出\(n\)求有多少个\(n\)的排列满足第一个是\(1\)并且相邻的差不超过\(2\)。 \(1\leq T\leq 10^6,1\leq n\leq 10^9\) 解题思路 考虑一下如果我们要不断向前填满前面的一段的话,那么填的方案
文章目录 题目描述数据范围 解析代码 题目描述 数据范围 n < = 1 e 6
题意 题解 被思维定式坑了... 一开始想的都是怎么用矩阵转移。 等差数列很好转移,矩阵里一个 \(1\) 一个 \(d\) 即可。 组合数不好转移,只能想到 \(C_n^m=C_n^{m-1} \times \frac{n-m+1}{m}\) ,然而由于 \(m\) 是不断变化的,而且矩阵不好维护除法的形式,思考无果。 实际上是快速幂的
文章目录 解析代码 所谓树上莫队,就是在树上的莫队 (逃) 传送门 解析 似乎就是树上的这道题 考虑如何转化为序列问题呢? 考虑dfs序 但是又一个问题。。。 似乎这条链的dfs序不连续啊 树剖一下就好啦 考虑更阳间的方法 求出这棵树的欧拉序,在这个欧拉序上询问 那么我们发现,
题面: 题目分析: 考虑每一条边对于答案的贡献,根据树的性质,每一条边一定将整棵树分成了两个子树,而该边的贡献=子树1中叶节点数子树2中节点总数+子树2中叶节点数子树1中节点总数。 由于树有一个重要性质: 树的任意一个点都可以作为树的根 然后?没了。 哦不是,还有一个重要的点: 要注意
最多约数 给定一个正整数 \(n\) ,对于所有不超过 \(n\) 的正整数,找到包含约数最多的一个数。如果有多个这样的数,那么回答最小的那个。 \(n\leq 10^{16}\) 题解 首先有一个结论: 若正整数 \(N\) 被唯一质因数分解为 \(N=p_1^{c_1}p_2^{c_2}\dots p_m^{c_m}\) ,且满足 \(p_1<p_2<\do
题目算法要素:Floyd 题目分析: 最开始我想当作差分约束处理,但是没调过,只有20tps。 这个题的正解思路很有意思,很容易发现点数最多只有100,边数最多只有10000,因此可以用floyd维护f[a][b]表示a是否大于b。 若f[a][b]=true,则a>b。 若f[b][a]=true,则a<b。 若f[a][b]==0,则ab关系未知。 总
题意 题解 本题的瓶颈在于不容易判断多个字符串中,两两匹配的公共子串是否是相同的。 模式串和匹配串的概念有点绕...在这里把要对自身求 \(nxt\) 的串记为 A,另一个串记为 B. 不要太着急,想到“定一移一”的方法,先单独取出任意一个字符串(本文取的是 \(s_1\))作为初始的 A 串,长度为
题意 根据一个递推式不断求出元素,判断这个数出没出现过。 题解 以前只写过邻接表的哈希表,没写过链前的哈希表,贴一下代码。 代码 #include<bits/stdc++.h> using namespace std; #define ll long long const int INF = 0x3f3f3f3f,N = 2e6+10,mod = 1e6+7; inline ll read() { ll
题意 现在小泽的手上有 n 道难题,编号分别为 1∼n ,第 i 道题的难度系数是 ai 。 小泽想用这些题出比赛,他会把题目按照编号划分为若干个非空连续区间,每个区间对应了一场比赛。 特别的,如果某场比赛的题目难度系数之和超过了给定的常数 m ,这场比赛会过于毒瘤,所以他不希望出现这样的情
题面:洛谷传送门 题目的算法要素:线段树&返回值为结构体的线段树 题目分析: 线段树的单点赋值+区间查询(查询区间内和最大的一段序列)。 因为某一段区间内和最大的一段序列是从它的小区间中合并出来的,需要不断与其他区间比较,且小区间内的最大序列不一定是大区间内的最大序列的一部分。
粉刷木板 有 \(N\) 块木板从左到右排成一行,有 \(m\) 个工匠对这些木板进行粉刷,每块木板至多被粉刷一次。 第 \(i\) 个木匠要么不粉刷,要么粉刷包含木板 \(S_i\) 且长度不超过 \(L_i\) 的连续的一段木板,每粉刷一块可以得到 \(P_i\) 的报酬。不同工匠的 \(S_i\) 不同。 请问如何安排
题面 题目分析: 选择一个当前可选的数最小的位置,依次填入各个可能填入的数。 考虑怎么实现: 为了快速地得到每个位置可以选择的位置,可以将当前树所在的行、列、九宫格的填入状态压入一个二进制中储存。 Code #include<bits/stdc++.h> using namespace std; const int INF=1e9+7; i
一道特别水的线段树基础题。 不过发生了一些有意思的事情: 我最开始没算复杂度,就直接去想怎么对区间取模操作写懒标记和pushdown。 其实因为取模不会进行太多次,而且在中间可以特判结束向下递归,因此直接单点修改即可。 #include<bits/stdc++.h> using namespace std; #define mid
题意 题解 容易想到:开两个队列分别维护空闲内存块序列的编号\((q1)\),被占用的内存块的的编号与过期时间\((q2)\) 同时更新\(ocu\)数组,记录代码块是否被占用 但是我卡在了细节的地方很久:if(ocu[y]) ocu[y]++,q2.push(mp(y,x)); 询问的时候没有打上判断就直接\(push\)到\(q2\)里
权值统计 给出一个 \(n\) 个结点的无根树以及每个结点的权值,求出树的每一条路径的权值积的和,单独的一个结点也算作一条路径。 解析 要求每一条路径。 规定每条路径的权值为途径的点权之积。 对于这类问题,我们可以用 \(dp_u\) 表示以 \(u\) 为根的子树内所有答案。 但是,因为题目规
题意 给定一棵 \(n\) 个节点的树,每个点有个喜欢程度。求 选联通块,并且这个联通块包含最大的点权的方案数。 分析 很难想的一道题…… 原本思路:将权值最大的点设为根,跑一遍树形dp即可。 但是考虑到,权值最大的点可能不止一个,于是此做法失效。 考虑设\(dp_u\)表示在\(u\)的子树内,必
题意 题解 虽然在\(RMQ\)的章节里,但是这题的重点不在\(RMQ\),只是一个优化 考虑如何找到一段完美序列 记录\(lst[val]\)表示val值上次出现的位置,\(pre[i]\)表示以\(i\)为结尾的完美序列的起点 那么转移式很显然 代码 #include<bits/stdc++.h> using namespace std; #define ll lo
题意 题解 这在洛谷上是一道紫题...不枉我费了半个上午 首先可以想到,一个环里的点,要选择的话一定一起选,所以先想到缩点形成一个DAG 考虑如何建边,注意到题目关键:一个软件最多依赖另外一个软件,那么从被依赖想依赖建边,形成的还是一棵树 问题就转化成了:在一个树上每个点都有重量和价