
题解
文章平均质量分 53
214
hesorchen
这个作者很懒,什么都没留下…
展开
-
力扣第331场周赛题解
力扣周赛题解原创 2023-02-05 12:12:49 · 673 阅读 · 0 评论 -
2022年6月第十三届蓝桥杯大赛软件赛全国决赛C++A组题解
目录比赛成绩与复盘试题 A: 小蓝与钥匙试题 B: 排列距离试题 C: 内存空间试题 D: 最大公约数试题 E: owo试题 F: 环境治理试题 G: 选素数试题 H: 替换字符试题 I: 三角序列试题 J: 括号序列树原创 2022-06-18 13:25:19 · 10847 阅读 · 12 评论 -
leetcode第294场周赛巫师的总力量和——维护前缀和的前缀和
主要记录一下On预处理,O1取任意区间前缀和的前缀和题目6077. 巫师的总力量和解题思路贪心从小到大考虑,每次计算以aia_iai为最小值时的贡献。下面来看具体例子:考虑a2a_2a2作为最小值时的贡献区间[1,2],[1,3],[1,4],[1,5],[2,2],[2,3],[2,4],[2,5][1,2],[1,3],[1,4],[1,5],[2,2],[2,3],[2,4],[2,5][1,2],[1,3],[1,4],[1,5],[2,2],[2,3],[2,4],[.原创 2022-05-22 17:29:54 · 380 阅读 · 0 评论 -
2022年4月第十三届蓝桥杯C/C++程序设计A组(省赛)试题及题解
试题A:裁纸刀试题B:灭鼠先锋试题C:求和试题 D: 选数异或试题 E: 爬树的甲壳虫试题 F: 青蛙过河试题 G: 最长不下降子序列试题 H: 扫描游戏试题 I: 数的拆分试题 J: 推导部分和原创 2022-04-09 13:00:16 · 24298 阅读 · 16 评论 -
牛客练习赛D数学家的谜题线段树+bitset优化
题目https://ac.nowcoder.com/acm/contest/11175/D单点修改和区间查询,询问区间乘能被多少个素数整除。解题思路显然是维护区间质因子的数量,可以用带修莫队。也可以用线段树+bitset优化。将质数映射到1-10000的位中。代码#include <bits/stdc++.h>using namespace std;const int N = 1e5 + 5, M = 5e4 + 5;vector<int> fac[N];原创 2021-11-17 11:10:22 · 434 阅读 · 1 评论 -
HDU-2147 kiki‘s game 巴什博弈
HDU-2147 传送门最近小明很闲,找了小华下棋。 棋盘的大小是n*m,小明突然想到一个新的玩法,首先有个卒放在棋盘的右上角(1,m)的位置。 每一次小明或者小华可以将这个卒向左移一步或者向下移一步,或者向左下移一步 谁不能移动谁就输了。小明先移动棋子卒,小明会赢吗?假设玩家都是最优决策。Input多组输入,每行包括两个数字n,m (0 < n , m < = 2000 ...原创 2020-02-01 12:32:27 · 7364 阅读 · 0 评论 -
牛客练习赛C魔法学院(hard version) 并查集加速
题目https://ac.nowcoder.com/acm/contest/11181/C给出一个小写字母字符串,现在有m种魔法,每种魔法可以将区间LR的字母变为新字母X,求最后字符串的最大字典序。题解思路两种比较容易想到的操作:将操作按照X的大小从小到大排序,每次暴力区间覆盖即可,可以使用客珂朵莉树。将操作按照X的大小从大到小排序,相同区间覆盖一次,之后不再覆盖,可以用并查集加速跳跃过程。并查集代码#include <bits/stdc++.h>using namespa原创 2021-11-16 16:14:38 · 661 阅读 · 0 评论 -
洛谷P1160 双向链表
题目洛谷P1160代码#include <bits/stdc++.h>using namespace std;const int N = 1e5 + 10;struct node{ int L, R;} a[N];void insert_left(int x, int k) //将x插入到k的左边{ a[x].R = k; a[x].L = a[k].L; a[a[k].L].R = x; a[k].L = x;}void i原创 2021-11-16 16:07:41 · 610 阅读 · 0 评论 -
2018ICPC焦作F-Honeycomb 蜂巢BFS
题目https://codeforces.com/gym/102028/problem/F求S-T至少要经过几个蜂巢,例如下图为7。题解注意细节,按照题意模拟即可。代码#include <cmath>#include <cstdio>#include <algorithm>#include <cstring>#include <queue>#include <iostream>using namespace s原创 2021-11-16 11:09:08 · 412 阅读 · 0 评论 -
HDU - 4793 思维、计算几何、直线和圆交点
题目HDU 4793有一个圆(图中红色部分),其有一个初速度,撞到黑色部分会发生完全弹性碰撞,求红色圆在蓝色区域的时间。题解训练赛的题,队友给了一个关键转化,可以将蓝色、黑色圆的半径同时加上红色圆的半径,然后将红色圆缩成一个点。这样各种事件还是等价的。转化之后就很简单了:一、红色点不进入蓝色区域,答案为0二、红色点进入蓝色区域但不进入黑色区域,答案为与蓝色区域两个交点的距离/速度与蓝色区域两个交点的距离/速度与蓝色区域两个交点的距离/速度三、红色点进入黑色区域,可以证明的是,与黑色圆发生碰原创 2021-11-16 11:02:00 · 429 阅读 · 0 评论 -
HDU4801 转魔方、DFS模拟
题目HDU 4801题解由于是两阶魔方,左边UP等于右边DOWN,因此共有6种转动方式。直接模拟即可,时间复杂度O(67×12)O(6^7\times 12)O(67×12)代码#include <bits/stdc++.h>using namespace std;int mp[][6] = { {-1, -1, 0, 1, -1, -1}, {-1, -1, 2, 3, -1, -1}, {4, 5, 6, 7, 8, 9}, {10, 11,原创 2021-11-16 10:51:05 · 481 阅读 · 0 评论 -
HDU5572 2015ICPC上海A计算几何
题目HDU 5572无限大的平面上,有一个圆柱。圆柱外有两个点A、B,点A有个速度向量V,A撞到圆柱会发生完全弹性碰撞。问点A是否能经过点B。解题思路我们记A -> A+V的运动轨迹为直线 l1l1l1(射线在代码实现中并不好处理)。共分以下几种情况:一、 l1l1l1与圆不相交判断A是否能直接经过B,即判断向量V⃗、B−A⃗\vec{V}、\vec{B-A}V、B−A是否同向。二、 l1l1l1与圆相切情况同一。三、 l1l1l1与圆相交记l1l1l1与圆距离较近的点为X。原创 2021-11-16 10:45:54 · 296 阅读 · 0 评论 -
D. Treelabeling 思维,01染色
题目D. Treelabeling题解x ^ y <= min(x,y) 等价于x、y二进制最高位相同。只要树上每条边的邻点都满足该条件,那么先手无论将棋子放哪都必胜。考虑如何构造。可以将树01染色,相邻点颜色不同, 将所有点分为两类,不同类的最高位都不同即可。#include <bits/stdc++.h>using namespace std;const int N = 2e5 + 5;vector<int> mp[N];vector<int&g原创 2021-11-13 21:22:11 · 519 阅读 · 0 评论 -
POJ1106极角排序
题目POJ Transmitters给出若干个点和一个半圆,半圆可以绕着圆心任意旋转,问最多能覆盖多少个点。解题思路距离圆心的距离大于半径的点可以直接先排除掉。将剩余的点进行极角排序,然后用一个双端队列维护能被半圆覆盖的点,当队首和当前处理点的角度大于π\piπ时,弹出队首元素。期间队列最大的size就是答案。需要注意的是,当前处理点极角接近π\piπ时,最开始邻近−π-\pi−π处的点也会有贡献,可以将所有点复制一份加到后面,并将复制的点极角加上2π2\pi2π。时间复杂度O(nlogn)O原创 2021-10-29 10:10:55 · 213 阅读 · 0 评论 -
2021ICPC江西省赛G.Magic Number Group莫队
题目G.Magic Number Group给定一个正整数序列,每次询问区间[L,R][L,R][L,R],任意选择一个大于1的正整数p,该区间内最多有多少数能被p整除。解题思路对于p,我们一定是选择一个质数,问题就转化成了区间[L,R][L,R][L,R],要使尽可能多的数包含质因子p。考虑对于所有数都分解出所有质因子。每个数的质因子数量很少,最后就是莫队离线维护众数板子。代码#include <bits/stdc++.h>using namespace std;const原创 2021-10-27 11:02:04 · 786 阅读 · 1 评论 -
POJ2397DP搜索
题目Spiderman蜘蛛侠刚开始在高度为0的位置,每次可以向上或者向下aia_iai个距离,最后要回到高度为0的位置、中途高度不能低于0、最大高度最小。求跳跃的具体方式。解题思路先用DP求出最小最大高度,然后DFS求解路径。代码#include <set>#include <map>#include <list>#include <stack>#include <queue>#include <cmath>#原创 2021-10-19 10:57:23 · 113 阅读 · 0 评论 -
abcE-Xor Distance思维、拆位
题目E - Xor Distances给出一颗带边权的树。求所有简单路径异或和。解题思路找任一结点x为根结点。记F(u,v)为u到v简单路径的异或值。对于两个结点u,v,设w为uv的最近公共祖先,有F(u,v)= F(u,w) ^ F(w,v)= F(u,w) ^ F(w,v) ^ F(x,w) ^ F(x,w)= F(u,x) ^ F(x,v)由于异或值每一位互不影响,因此可以拆位考虑。设DP[i][j][k]DP[i][j][k]DP[i][j][k]为子树中所有结点 到结点iii、原创 2021-10-12 09:21:35 · 275 阅读 · 1 评论 -
数位DP、多少小于n的数包含k个非0位
题目到处都是0解题思路数位DP板子改改代码#include <bits/stdc++.h>using namespace std;const int N = 1e2 + 5;char s[N];long long dp[N][5];int n;long long dfs(int pos, int lim, int k){ if (k < 0) return 0; if (pos > n) return k原创 2021-10-08 21:20:17 · 119 阅读 · 0 评论 -
HDU6287质因数分解、二分
题目口算训练求解思路给出nnn个数,每次询问区间[l,r][l,r][l,r]所有数的乘积是否是XXX的倍数。a/b=0a/b=0a/b=0a=p1c1+p2c2+p3c3+...+pncna=p_1^{c_1}+p_2^{c_2}+p_3^{c_3}+... +p_n^{c_n}a=p1c1+p2c2+p3c3+...+pncnb=p1d1+p2d2+p3d3+...+pndnb=p_1^{d_1}+p_2^{d_2}+p_3^{d_3}+... +p_n^{d_n}b=p1d原创 2021-10-07 17:30:30 · 163 阅读 · 0 评论 -
CF18B/01背包
题目B. Checkout Assistant有nnn件商品,每件需要花费tit_iti秒时间、cic_ici元钱支付。但是每一秒钟,你可以偷走一件商品(不用付钱),求最小支付金额。求解思路如果购买了物品iii,相当于花费cic_ici元,拿走ti+1t_i+1ti+1件物品,求拿走至少nnn件物品的最小花费。难点在于将问题转化为01背包模型,将01背包改改即可。代码#include <bits/stdc++.h>using namespace std;const i原创 2021-10-07 16:28:03 · 140 阅读 · 0 评论 -
CF1592Ddfs序+二分
题目D. Hemose in ICPC ?交互题。给出一棵树,点数<=1000,边权未知。你每次可以询问一个点集,会返回这些点集两两路径边权gcd的最大值。请你用至多12次询问确定两个点,使得他们之间的路径边权gcd即是最大值。求解思路这个点集的最大值,等价于路径上权值最大的一条边。也就是我们要找到最大边权的边。212>10002^{12}>1000212>1000。只需每次都排除掉半棵树,我们就可以以O(logn)O(logn)O(logn)的时间复杂度找到答案。可以原创 2021-10-06 10:36:37 · 172 阅读 · 0 评论 -
POJ1696凸包变形
题目Space Ant平面上有若干个点,一只蚂蚁走路不能向右转,问最多能经过多少个点。蚂蚁的起点为(0,min(yi))(0,min(y_i))(0,min(yi))求解凸包变形,路径一定是下凸壳、上凸壳、下凸壳、上凸壳…组成的,循环找凸壳即可。代码#include <iostream>#include <algorithm>#include <cstring>using namespace std;const int N = 2e5 + 5;原创 2021-10-05 09:51:58 · 192 阅读 · 0 评论 -
POJ3304 思维、判断线段和直线相交
题目Segments给出n个线段,问是否存在一条直线,使得n个线段在这条直线上的投影会交于一点。解题思路假设交点为x,过x作这条直线的垂线l,那么必然l经过所有线段。所以问题转化为,是否存在一条直线和n条线段相交。代码#include <iostream>#include <vector>using namespace std;const int N = 1e5 + 5;typedef struct Point{ double x, y; P原创 2021-10-04 16:54:55 · 119 阅读 · 0 评论 -
POJ2653线段相交
题目Pick-up sticks二维平面给出一些棍子,问哪些棍子没被其他棍子压着。解题思路O(n2)O(n^2)O(n2)暴力判断即可。因为保证了答案不超过1000,因此最坏时间复杂度是O(min(n2,kn))O(min(n^2,kn))O(min(n2,kn))代码#include <iostream>#include <vector>using namespace std;const int N = 1e5 + 5;typedef struct Poi原创 2021-10-04 16:06:59 · 126 阅读 · 0 评论 -
POJ1410线段相交、快速排斥实验、跨立实验
题目Intersection给出二维平面中一条线段和一个矩形,问线段和矩形是否有交点,矩形包括边和内部。解题思路先判断线段和四条边是否相交,如果没交点,再继续判断线段是否在矩形内。判断线段相交需要使用快速排斥实验和跨立实验。直接使用跨立实验会有问题,比如其中一条线段退化成一个点的情况,可以通过跨立实验,但是不能通过快速排斥实验:代码#include <iostream>using namespace std;const int N = 1e5 + 5;typedef原创 2021-10-04 15:44:41 · 355 阅读 · 0 评论 -
POJ2398计算几何、叉积判断点在线段左/右侧
题目Toy Storage二维平面中有一个矩形,放入n块隔板,将矩形分成n+1个区域,隔板保证不相交且两端点在矩形的两条横向线段中。形如下图:给出m个点,求包含t个点的区域数量。求解思路可以用叉积判断一个点在线段的左侧还是右侧。OA⃗×OB⃗=∣OA∣×∣OB∣×sinθ\vec{OA} \times \vec{OB}=|OA|\times|OB|\times \sin\thetaOA×OB=∣OA∣×∣OB∣×sinθ叉积为负,说明θ大于π\theta 大于\piθ大于π如果OA⃗×原创 2021-10-03 19:03:05 · 541 阅读 · 0 评论 -
POJ2826计算几何、线段交点
题目An Easy Problem?!在平面中给出两条线段,问最多能接到多少从上至下的雨水。解题思路要能接到雨水,首先得满足两条线段相交形成‘V’型结构,相交大致有以下情况,比较难考虑到的有情况3、4:来找四种情况的特征即可。方法很多,下面是一种可行方法情况2:点1点2的y坐标相同情况1:过点1作垂线与直线23交于点5,点5的y坐标小于直线14-23的交点坐标。情况3、4:作点1的垂线交直线23于点5,判断点5点3上方还是下方即可。判断方法很多,尽量减少运算次数、除法为优。代码#in原创 2021-10-03 16:37:10 · 196 阅读 · 0 评论 -
牛客数字染色莫比乌斯容斥
题目数字染色给出一个正整数序列,求有多少子序列的gcd不为1。求解假设子序列gcd为x,那么只需求出x的倍数的数量m,gcd为x的子序列数量即为2m−12^m-12m−1。这样可以求出 gcd分别为2的倍数、3的倍数、4的倍数… 的方案数,剩下的就是容斥了,比如6,计算2的倍数、3的倍数的时候重复算了,那么要减去。代码:#include <bits/stdc++.h>using namespace std;const int N = 1e5 + 5;int mul[N];原创 2021-09-21 18:57:54 · 225 阅读 · 0 评论 -
Educational Codeforces Round 114 A-D
A. Regular Bracket Sequences请你构造n个长度为2n的不同的合法括号序列。如下构造即可。()()()()(())()((()))... ...B. Combinatorics Homework问是否存在这样的字符串:恰好有a个字母’A’恰好有b个字母’B’恰好有c个字母’C’没有其他字母有m对相同的相邻字母对计算最大和最小的相同相邻字母对数量,判断m是否在中间即可。最大构造就是AAA…BBB…CCC最小构造就是拿出最多的那种字母,另外两种字母原创 2021-09-21 16:19:16 · 193 阅读 · 0 评论 -
CF1153D神仙DP
题目D. Serval and Rooted Tree给出一颗有根树,在每个非叶子节点都有一个属性:maxmaxmax : 在所有儿子的权值中取最大值minminmin : 在所有儿子的权值中取最小值假设这颗树有k个叶子结点,现在你需要对这k个叶子结点赋值[1,k]且两两互不相同。问根结点的最大值可以是多少。求解很难用数值直接处理,我们使用排名进行树形dp,排名第1的权值即为k,最低排名的权值即为1。令dpudp_udpu表示以u为根的子树的所有叶节点中,结点u可以取得的最大值的排名,原创 2021-09-21 15:59:01 · 194 阅读 · 0 评论 -
gym344448C线段树/树状数组 离线查询区间小于等于k的数的数量
题目原地击剑求解其实就是求∑i=1n∑j=i+1nai+i>=j&&aj−j<=i\sum_{i=1}^{n}\sum_{j=i+1}^{n} a_i+i>=j{\&\&} a_j-j<=i∑i=1n∑j=i+1nai+i>=j&&aj−j<=i两个条件可以写成:j<=ai+i&&aj−j<=ij<=a_i+i\&\&a_j-j<=ij<=ai原创 2021-09-20 20:12:37 · 580 阅读 · 2 评论 -
POJ1236DAG转强连通图
题目POJ 1236不难得出第一问答案是,对原图tarjan缩点、转化为DAG之后入度为0的点个数。第二问有个结论:要将DAG图转化为强连通图,需要增加的最少单向边数量为max(indegree,outdegree)。因为强连通图中每个点对都要互相可达,那就每个点都要可进可出。代码#include <iostream>#include <cstdio>#include <string>#include <cstring>#include &原创 2021-07-22 10:23:25 · 210 阅读 · 0 评论 -
CF1244E
题目E. Minimizing Difference给出n个正整数,最多执行k次操作。每次操作可以选择一个数加一或减一。问操作后最小值和最大值的最小差值是多少。求解贪心。每次肯定选择最小值加一或者最大值减一。选哪一个取决于最小值的数量少还是最大值的数量少。假设最大值有x个,那么我们得将这x个最大值都减1才能使最终贡献减一,最小值同理。因此不断贪心合并即可。#include <bits/stdc++.h>using namespace std;const int N = 1e5原创 2021-09-16 20:02:15 · 178 阅读 · 0 评论 -
旅行商问题状压DP
旅行商问题旅行商问题 百度百科:给定一系列城市和每对城市之间的距离,求解访问每一座城市一次并回到起始城市的最短回路。状压DP求解DP[i][j]DP[i][j]DP[i][j]表示最后在城市iii,已达城市状态为jjj的最短距离。例题:洛谷 P1433代码:#include <bits/stdc++.h>using namespace std;const int N = 20;double x[N], y[N];double dis[N][N];double f(int原创 2021-09-15 10:06:27 · 373 阅读 · 0 评论 -
力扣2003 三种解法 启发式合并、线段树维护mex运算、思维
题目链接2003. 每棵子树内缺失的最小基因值给出一颗有根树,每个节点有一个权值wiw_iwi,求出所有子树的mex值,一个子树的mex值定义为在该子树中最小的未出现的正整数。题解Solution I启发式合并考虑暴力维护每颗子树包含的数据,当前子树包含的正整数就是所有儿子包含的正整数加上根,并且根据mex运算性质,父亲结点的mex值肯定大于等于儿子结点。但是暴力合并的时空复杂度都是O(n2)O(n^2)O(n2)。可以在合并的时候每次都将小的集合往大的集合合并,这样时间复杂度最坏为O(nl原创 2021-09-13 20:18:52 · 492 阅读 · 0 评论 -
Codeforces Global Round 16 A-E
A. Median Maximizationn个非负数的和是s,问中位数最大可以是多少。前一半都取0最优。代码:#include <bits/stdc++.h>using namespace std;const int N = 1e5 + 5;void solve(){ long long n, s; cin >> n >> s; long long m = (n + 1) / 2; n -= (m - 1);原创 2021-09-13 19:55:07 · 297 阅读 · 0 评论 -
Codeforces Round #742 (Div. 2)A-E
B. MEXor Mixup有一未知数组的mex值为a,异或值为b,求数组的最小长度。由于mex值为a,因此至少需要 [0,a-1] 这a个元素。令前a个元素的异或值为x,若x=b,则只需要前a个元素若x!=b,显然存在一个数y满足x^y=b,但是需要判断y是否是a,即是否会破坏mex条件。代码#include <bits/stdc++.h>using namespace std;const int N = 3e5 + 5;int pre[N];void solve(原创 2021-09-06 21:56:06 · 192 阅读 · 0 评论 -
2021百度之星复赛1002第二类斯特林数
题目题目链接 Add or Multiply 1题目大意有一个初始数xxx和一个运算序列an+ma_{n+m}an+m,其中a1a_1a1到ana_nan是加法,an+1a_{n+1}an+1到an+ma_{n+m}an+m是乘法,令S=x+a1+a2+...+an×an+1×an+2×...×an+mS=x+a_1+a_2+...+a_n\times a_{n+1}\times a_{n+2}\times ...\times a_{n+m} S=x+a1+a2+...+an×an+1原创 2021-08-23 10:50:35 · 258 阅读 · 0 评论 -
HDU2228栈、深搜、树哈希/同构
题目Same or not给出两个01字符串,表示两棵树上的深搜方式。其中0表示向深层递归,1表示回溯。问两个字符串有没有可能是在同一颗树上生成的。求解根据深搜的性质,先用栈建树。建好两棵树之后,求出树的重心,然后以重心为根,进行树哈希,利用哈希值判断两棵树是否同构即可。代码#include <bits/stdc++.h>using namespace std;const int N = 1e4 + 5;vector<int> mp[N];int siz[N]原创 2021-08-18 20:05:50 · 177 阅读 · 0 评论 -
树同构/树哈希
题目P5043 【模板】树同构([BJOI2015]树的同构)树的同构与哈希判断两棵树是否同构,可以用树哈希实现,两颗树的哈希值一样时,我们可以判定他们同构。树的哈希只在有根树中有意义。当要判定两棵树是否同构时,我们可以选择它们的重心为根进行哈希。时间复杂度为O(nlogn)O(nlogn)O(nlogn)。关于树哈希,用的比较多的方法是将子树从小到大排序,对于第iii个子树,乘上第iii个质数。val[y]=∑x∈sonyval[x]∗prime[size(x)]val[y]=\sum_{x\i原创 2021-08-18 17:42:34 · 694 阅读 · 0 评论