03 2024 档案

摘要:原题链接 题解 1.二分+dp code #include<bits/stdc++.h> using namespace std; string name[1000005],dp[1000005],st[1000005]; int main() { string s; cin>>s; int cnt 阅读全文
posted @ 2024-03-30 22:02 纯粹的 阅读(36) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 1.由于我刚刚才学字典树,所以我会告诉你这就类似字典树,对字符串终点节点加一,然后搜索统计最大前缀和 code #include<bits/stdc++.h> using namespace std; string s; int tree[2000005][65]={0}; int 阅读全文
posted @ 2024-03-30 20:37 纯粹的 阅读(9) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 1.建议去B站上看看动画演示,你就明白怎么回事了 2.如何用代码实现呢?看完你就明白了 code #include<bits/stdc++.h> using namespace std; int num=0; int tree[3000006][75]={0}; int cnt[30 阅读全文
posted @ 2024-03-30 20:20 纯粹的 阅读(38) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 1.如果数字为 100110101 那么答案为 000000000 ~ 011111111 中,k个1的组合数 + 100000000 ~ 100011111 中k-1个1的组合数 +...+ 1010101... (有k个1) 中0个 阅读全文
posted @ 2024-03-30 18:43 纯粹的 阅读(34) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 1.该题等价于构建一颗k叉树,每个叶子节点都有一个权值 leafi ,树的权值为 1nleafi ,在使树的权值尽可能小的情况下,使最深的叶子节点的深度也尽可能小,即使数的高度尽可能小 这个叫做哈夫曼树 2.构建过程如下:每次从队列中取出 \( 阅读全文
posted @ 2024-03-30 11:47 纯粹的 阅读(34) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 用由于本题具有线性特征(总是不减?)所以可以用两个堆来维护第i小的元素, code #include<bits/stdc++.h> using namespace std; int a[200005]; int main() { ios::sync_with_stdio(false) 阅读全文
posted @ 2024-03-29 16:50 纯粹的 阅读(18) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 1.最短路径一定可以表示成经过若干端点的线段,所以我们把端点单独提出来,这样就变成了计算几何形式的最短路 2.如果两个端点能相连,代表他们之间没有墙阻挡 code #include<bits/stdc++.h> using namespace std; int n; struct { 阅读全文
posted @ 2024-03-29 16:07 纯粹的 阅读(16) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 1.模拟题,注意细节 2.时间复杂度 O(n·sqrt(n)) code #include<bits/stdc++.h> using namespace std; int n; string s; int check(int len) { int flag=0; for(in 阅读全文
posted @ 2024-03-29 15:16 纯粹的 阅读(40) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 1.模拟+贪心,我们一个一个点添加,一层一层遍历,每个节点对当前层的接口数的贡献是-1 如果是节点2,对下一层接口数贡献为2,节点1贡献为1 如果当前层接口数用完了就下一层,初始值层0设为1 在时间复杂度合理的情况下无所不用其极 code #include<bits/stdc++.h 阅读全文
posted @ 2024-03-29 14:02 纯粹的 阅读(84) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 1.要确保任意回合赢回来的钱都要比之前下注的钱的总和要多 令 bi 为第 i 回合下注的钱,则有 bi·k>j=1ibj 则有 \(b_i\ge \left\lfloor \frac {\sum_{j=1}^{i-1}b_j}{k-1 阅读全文
posted @ 2024-03-28 22:04 纯粹的 阅读(7) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 1.选k个数,就会有k-1个数没法选。我们可以倒着来,每少选一个数,就会多一个数可以选,添加总比删除简单 2.最小的那个数,也就是第k小的数,因此我们可以维护一个大小为k 的优先队列,最小值就是队首元素 code #define ll long long #include<bits/ 阅读全文
posted @ 2024-03-28 21:23 纯粹的 阅读(10) 评论(0) 推荐(0) 编辑
摘要:原题链接 这道题让我对状态转移的理解更深 题解 1.对于任意一个点,不是在休息就是在锻炼,因此可以设 dp[i][j] 又因为疲劳值对答案也会有影响,或者说,当确定时间,决策,疲劳值时,所走过的路的最大值是可以确定的 所以再加一维 code #include<bits/stdc++.h> u 阅读全文
posted @ 2024-03-28 18:35 纯粹的 阅读(6) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 1.看到数据范围很小,所以我们可以穷举 如何穷举呢? 三个方向的背包dp,令 dp[i][j][k] 来表示 三边长度为 i,j,k 时能否达到,然后最外面一维是所用的木板 由于她想用所有的木板 所以 k=totalij ,所以可以变成两维 注意这里的背包 阅读全文
posted @ 2024-03-28 18:06 纯粹的 阅读(15) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 1.每个城市选择一个与它最近的城市 2.如果三个或以上的城市申请修建的公路成环。如下图,A 申请修建公路 AB,B 申请修建公路 BC,C 申请修建公路 CA。则政府将否决其中最短的一条公路的修建申请; 但是这条不成立,请看这条题解 或者下图 由此得出这题就是最小生成树,虽略有不同, 阅读全文
posted @ 2024-03-28 16:34 纯粹的 阅读(6) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 1.题目可以抽象转化为,若干个点和线段,求问最多有多少点和线段能配对,如果点在线段内 2.我们可以采用贪心的方法,对点升序排序,对线段按右端点升序排序 为什么请看下图 code #include<bits/stdc++.h> using namespace std; struct n 阅读全文
posted @ 2024-03-28 15:16 纯粹的 阅读(13) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 1.由于没有指向外面的箭头,所以 (1,1) (1,2) 都是 > 2.每次移动两步,所以落点一定是距离原点曼哈顿距离为偶数的点,所以中转点一定是曼哈顿距离为奇数的点,所以枚举所有曼哈顿距离为奇数的点(不包括终点),只要其没有连续出现<,一定能过去 code #includ 阅读全文
posted @ 2024-03-27 21:59 纯粹的 阅读(103) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 1.异或是01变1,11变0,或是01变1,11变1,所以或的越多(即分的组越多),结果越大 2.我们令x=x+1,这样小于等于x的 问题就变成了小于x 的问题,这里我们采用逼近答案的方法。 3.对于某一位而言,如果有奇数个元素在这一位上是1,那么不管怎么分,最后的结果肯定是1,如果 阅读全文
posted @ 2024-03-27 21:37 纯粹的 阅读(45) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 太巧妙了!! 层加式? code #include<bits/stdc++.h> #define ll long long using namespace std; ll a[100005]={0}; int main() { ll t; cin>>t; while(t--) { l 阅读全文
posted @ 2024-03-27 17:33 纯粹的 阅读(11) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 1.当没有花费限制的时候,我们可以将其抽象为简单的背包问题 2.如果有了花费限制,那么我们就再加一维条件 3.如果一个线段能用,那么它前面一定是铺满的,那我们令线段按起点排序,通过某种运算,保证放这个线段时,前面的线段组成是最优的 比如在 i 点结尾位置花费 j 所达 阅读全文
posted @ 2024-03-26 21:39 纯粹的 阅读(9) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 1.虫洞等价于建立负权边 2.回到过去等价于存在负权环 这里就相当于检测是否存在负权环,怎么判定呢?广搜,对于任意不含有负权环的,任意两点间的点数一定小于n 如果存在负权环,那么搜索会一直沿着这个环进行下去,其路径的点数会大于n code #include<bits/stdc++.h 阅读全文
posted @ 2024-03-26 19:52 纯粹的 阅读(8) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 1.我们没法遍历每个区间然后找出他们的最小值,所以我们考虑每个元素对答案的贡献 2.对于每一个元素来说,它的贡献等于它所在的区间长度乘上自身的值,这里的区间指的是以它为最小值的区间 3.以每个元素为最小值的区间要怎么求呢?我们将其转换成求左边第一个小和右边第一个小 对于这种问题(求序 阅读全文
posted @ 2024-03-25 22:06 纯粹的 阅读(5) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 这里和线性最大两段子段和不同,没有子段之间必须间隔一米,所以处理方式略有不同 code #define ll long long #include<bits/stdc++.h> using namespace std; ll a[200005]={0},pre[200005]={0} 阅读全文
posted @ 2024-03-25 21:36 纯粹的 阅读(12) 评论(0) 推荐(0) 编辑
摘要:原题链接 审题 1.连续子序列:子序列必须连续 2.最小长度为1 3.子序列之间至少隔一个数 题解 令 presum[i] 代表i及其之前的最大前缀和 则第一步更新令 presum[i] 为必须包括i的最大前缀和,第二步更新令其为i及其之前的最大前缀和。 sufsum同理 最后枚举断 阅读全文
posted @ 2024-03-25 15:53 纯粹的 阅读(36) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 1.具体去考虑每个集合所包含的元素及其大小个数是非常繁琐的,所以我们考虑每个元素对答案的贡献 2. 令 f[now] 代表以 now 为根节点的答案 sizes[now] 代表以 now 为根节点所包含集合的个数 更新过程如下: \(f[now]+=f 阅读全文
posted @ 2024-03-25 14:30 纯粹的 阅读(9) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 考虑以下决策,绝对最优: 1.按巧克力块的大小排序,先把大的块分出来。 2.一开始完整的巧克力是块矩形,取出一个正方形后,可以分为下方和右侧两个矩形,然后把这两个矩形放入优先队列。 3.分割下一个矩形时,从队列中取出 最短边最长的那个矩形,在这个矩形上做步骤2一样的分割 为什么这样的 阅读全文
posted @ 2024-03-25 13:56 纯粹的 阅读(11) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 1.选择一个区间,然后加上其和的 c1 倍,所以我们要选中区间和最大的那个 2.然而由于倍数可能为负,即 c<=0 ,所以这时我们要尽可能选和小的 3.由于最多选一次,意味着也可以不选,所以dp的时候不选就可以赋零 code #include<bits/stdc++ 阅读全文
posted @ 2024-03-24 00:50 纯粹的 阅读(3) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 1.我们可以用若干条直线把所有点串起来,串起来的要求是不同直线不共点,这样以每条直线上的两点为底,直线外另一点为顶点配对 令最大的直线上的点数为k,如果n-k>=k/2+k%2,那么这条直线上的点一定可以被消除。否则不行 就变成了若干集合彼此相消,当最大集合大小超过剩余集合总和时无法 阅读全文
posted @ 2024-03-23 15:53 纯粹的 阅读(13) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 1.abcdef= 1 ~ a* + ab* ~ abc + abc* ~ abcd + ... + abcde * ~ abcedf code #include<bits/stdc++.h> #define ll long long using namespace std; ll 阅读全文
posted @ 2024-03-22 20:55 纯粹的 阅读(7) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 请看code code #include<bits/stdc++.h> #define ll long long using namespace std; struct { ll to, val, head, times = 0; } edge[200005]; ll out[100 阅读全文
posted @ 2024-03-22 11:38 纯粹的 阅读(7) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 abcdefg等价于求 a000000+b00000+c0000+d000+e00+f0+g code #include<bits/stdc++.h> #define ll long long using namespace std; ll ten[14]={0}; ll f[14] 阅读全文
posted @ 2024-03-21 22:50 纯粹的 阅读(5) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 选的点一定是凸包上的点? code #include<bits/stdc++.h> using namespace std; struct poi { double x,y; }node[50005]; int q[100005]; double cal(int a,int b,in 阅读全文
posted @ 2024-03-21 18:13 纯粹的 阅读(10) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 code #include<bits/stdc++.h> #define ll long long using namespace std; const ll mod=1e9+7; ll tag[25]={0}; ll a[25]={0}; ll f(ll now) { ll sum 阅读全文
posted @ 2024-03-21 15:31 纯粹的 阅读(12) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 拓扑排序,层级标记,如果层级等于n,代表层次分明 code #include<bits/stdc++.h> using namespace std; vector<int> G[500005]; int in[500005]={0}; struct node { int id,lay 阅读全文
posted @ 2024-03-21 13:54 纯粹的 阅读(11) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 1.A<B 建立一条A向B的边 2.由于数据范围小,所以可以输入一次进行一次拓扑遍历 3.如果存在矛盾,说明存在环 4.对于拓扑排序进行层次标记,如果最大层等于n,代表每个字母层次分明,有先后次序 code #include<bits/stdc++.h> us 阅读全文
posted @ 2024-03-21 13:43 纯粹的 阅读(23) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 想象一下,从左上角无限大的地方开始,第一个看到的一定是斜率最小的且截距最大的,慢慢往右下角滑,第一个碰到的直线一定是斜率比前一个小(不一定是第二小)的但是是它的斜率所属直线里截距最大的 重复上述步骤,最外面的直线一定长这样 图片来自luogu,linaonao 所以我们可以按斜率排序 阅读全文
posted @ 2024-03-20 21:24 纯粹的 阅读(11) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 这么优质的文章我写什么题解 好难解释必然性感觉像模拟?? code #include<bits/stdc++.h> using namespace std; int q[100005]={0}; struct node { double x,y; }a[100005]; double 阅读全文
posted @ 2024-03-20 19:39 纯粹的 阅读(13) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 1.将雷达建在海岸线上最优,覆盖的面积最大 2.根据光线可逆,雷达安装的位置覆盖多少小岛,等价于小岛被覆盖需要在哪个范围的位置上安装雷达 3.想象把雷达安装在最左边,然后慢慢往右移,这个时候雷达覆盖的小岛数量会越来越多,当右移到某个原本能覆盖的小岛覆盖不了时,在那个位置安装一个雷达 阅读全文
posted @ 2024-03-20 18:01 纯粹的 阅读(18) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 叉积的运用,scanf控制输入格式 code #include<bits/stdc++.h> using namespace std; struct node { int x,y; }a[100005]; int x[200005],y[200005]; int main() { f 阅读全文
posted @ 2024-03-20 16:18 纯粹的 阅读(7) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 由于本题数据范围小,所以考虑暴力 两点确定一条直线,所以我们先确定两个点AB,然后再遍历所有点C,如果向量AB叉乘AC等于0代表共线(没说从哪里起飞) code #include<bits/stdc++.h> #define ll long long using namespace 阅读全文
posted @ 2024-03-20 15:32 纯粹的 阅读(26) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 有点思维,已知一个交点不会有三条对角线经过,所以有且只有两条对角线经过,而两条对角线又对应四个顶点,所以变成了组合数学,n个顶点里取四个。 为了防止溢出,这里做了一些处理 code #include<bits/stdc++.h> using namespace std; int ma 阅读全文
posted @ 2024-03-20 12:29 纯粹的 阅读(10) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 对于一个圆而言,如果两个点都在其内或其外,那么这个圆是不会经过的 所以穿过的圆是其中一个点在里面,另一个点在外面 code #include<bits/stdc++.h> using namespace std; struct node { int x,y,r; }circle[10 阅读全文
posted @ 2024-03-20 12:15 纯粹的 阅读(22) 评论(0) 推荐(0) 编辑
摘要:原题链接 WARNING!!! 使用map代替数组不再可靠,因为map的插入查找修改复杂度均为 O(logn) ,即使unorder_map也不行!!! 题解 我们发现,当一个节点的深度之和已知时(这里认为是根节点),其相邻节点的深度之和也可通过某种方程转移而得,有人称这种方法为换根DP 具 阅读全文
posted @ 2024-03-19 22:00 纯粹的 阅读(9) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 做两遍dfs,就能从树中求得图的效果了 第一遍,令 f[i] 为以 i 为根的子树(包括自身)的 maxansf[i] 的初值为 {1,a[i]=11,a[i]=0 \(f[ 阅读全文
posted @ 2024-03-19 21:47 纯粹的 阅读(5) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 把两个含有相同字符的字符串放进一个集合里,这让我想到了并查集 这里是线性并集,遍历字符串,对于字符串中出现的字符的集合并到自己身上来 code #include<bits/stdc++.h> using namespace std; int occ[30]={0}; int fa[2 阅读全文
posted @ 2024-03-19 14:53 纯粹的 阅读(8) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 如果一个数的存量大于1,那么alice可以不着急去拿,只要在bob拿之后再拿就可以了,所以alice要先去拿存量少(==1)的数且尽可能先拿小的 所以可以从0开始遍历直到遇到数字的存量等于零或者第二次遇到存量为一的数 code #include<bits/stdc++.h> #def 阅读全文
posted @ 2024-03-18 01:08 纯粹的 阅读(54) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 一看无从下脑,不妨造几个样例观察观察 1 2 3 4 1 2 3 4 此时两边取相同值即可 此时发现无论前半边数字的排列顺序是什么,只要是那几个数字,就不会影响答案 所以交换前半边和后半边的数字会影响答案 1 2 1 4 3 2 3 4 观察样例发现,交换之后,两边会出现一对相同的数 阅读全文
posted @ 2024-03-18 01:00 纯粹的 阅读(22) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 1.数字最多两位,所以数字的拆解方案惟一 2.数字拆开一定变小,所以最后一个数不拆 3.如果拆开,代表当前数大于前一个数,此时拆开要满足几点要求:后面的个位数不大于前一个数,前面的个位数不大于后一个个位数 code #include<bits/stdc++.h> using name 阅读全文
posted @ 2024-03-18 00:50 纯粹的 阅读(42) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 利用向量叉积的性质 对于一个组向量而言,如果a向量在夹角的右边,那么 a×b>=0 而凸多边形,边是往左凸的,所以一定都是正的 code #include<bits/stdc++.h> using namespace std; struct { int x,y; 阅读全文
posted @ 2024-03-18 00:36 纯粹的 阅读(11) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 考虑利用边界和墙来封锁坏人,封锁圈越大,好人的空间就越小。如果一个封锁圈是合理的,那么比他小的封锁圈也一定是合理的,无限小直到包裹坏人的四周 所以贪心地在坏人四周放墙,如果放的过周围有好人在周围,或者有好人但是把终点放了,或者从终点出发无法到达所有的好人(从多元深搜变成了单源广搜) 阅读全文
posted @ 2024-03-18 00:15 纯粹的 阅读(5) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 ab,bc,ac 等价于 abc az,bz 也可以等价于 abz 花费不变 所以是并查集,然后累积建边数量 如果 finds(a)==finda(z) 代表 a 阅读全文
posted @ 2024-03-17 21:26 纯粹的 阅读(16) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 1.任意两条边在且仅在一条链上 2.一定存在一条链使得其包含边权为0,1的边,这个时候我们要让2不在01所在的链上,即如下情况: 此时01所在链答案为2,02所在链答案为一 3.如果树退化成了链,那么不管怎么构造都一样 由此得出,找出这样 的 T 型节点,即含有三条边的节点,然后在它 阅读全文
posted @ 2024-03-17 19:24 纯粹的 阅读(9) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 太巧妙了!! 原题等效于该分层图,然后广搜 本题中我用了另一种方法建边,因为清空太麻烦了 code #include<bits/stdc++.h> using namespace std; int main() { ios::sync_with_stdio(false); cin.t 阅读全文
posted @ 2024-03-15 20:41 纯粹的 阅读(18) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 最大值最小化,想到了二分 而对于一个二分到的 maxlen 而言,如何判断是否存在一种分法使得最大值不大于它? 对于一个给定的二分值而言,要想成功有两个约束条件,一个是间断值不超过 maxlen ,一个是选中值之和不超过 \(\ 阅读全文
posted @ 2024-03-15 16:42 纯粹的 阅读(8) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 考虑以下决策 x+yS y=x+Si yxS y=x+Si 答案为红线上点的数量加上蓝线上点的数量减去交叉点(整数)的数量 由于 Si<=c 所以 交叉点等价于画斜率等于 1 阅读全文
posted @ 2024-03-15 15:35 纯粹的 阅读(15) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 最大值最小 二分可行性判断: 二分间断值 len  如果原序列 aiai1>len 双指针判断有没有 b+f 使得 ailen<=b+f<=ai1+len 由于只能使用一次,所以若使用两次 阅读全文
posted @ 2024-03-14 20:36 纯粹的 阅读(22) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 设 leni 为第 i 次操作后的数组长度, lasti 为该数组的最后一个数字 那么对于第一个 len 大于 ki 而言 Ai[k]Ai1[k1] 其中 \(k_1=(k-1)\% le 阅读全文
posted @ 2024-03-14 18:00 纯粹的 阅读(8) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 深搜带上 suma ,然后把经过的 sumb 放入栈里, 二分查找 code #define ll long long #include<bits/stdc++.h> using namespace std; inline void read(ll &x) { x 阅读全文
posted @ 2024-03-14 15:45 纯粹的 阅读(12) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 易得答案具有单调性,再加上 n·m<=1e6 故确定了二分 正方形每个数都大于 x 正方形内每个数减去 x ,1的数量是否达到 x2 差分面积是否达到 x2 code #include<bits/stdc++ 阅读全文
posted @ 2024-03-14 00:43 纯粹的 阅读(5) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 已知对于一个长度为 n 的连续+1型上升序列而言,其满足要求的子序列有2n个 若我们在该序列下标为 k 的右边插入一个绝对大于左边,绝对小于右边的数,满足要求的子序列会增加 2k 个 由此想到极限构造加二进制,其中最高位的一不用管,其余的每一位生成 阅读全文
posted @ 2024-03-13 23:47 纯粹的 阅读(4) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 原题可以理解为 找出含有最小边权的边双连通分量,然后找出那个边对应的两个节点的第二条路 本题我学会了: 1.代码命名风格要含义清晰,不然很容易搞混,包括变量,自定义函数 2.建边的时候尽量用链表式,因为dalao都在用,看题解方便一点 code #define ll 阅读全文
posted @ 2024-03-12 23:41 纯粹的 阅读(8) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 每个种族的贡献是互不干扰的,因此只需要计算每个族群在每个组数的情况下的解然后累加就行了,由于每个族群在组数大于等于 ci 的时候解数不变,所以这里用到了差分小技巧 然后就是计算每个族群在每个组数下的解就行了 code #define ll long long #includ 阅读全文
posted @ 2024-03-12 14:14 纯粹的 阅读(10) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 发誓以后除了stl内置,其他时候结构体绝对不内置比较函数 code #define ll long long #include<bits/stdc++.h> using namespace std; ll in_q[3005]={0}; ll h[3005]={0}; ll vis[ 阅读全文
posted @ 2024-03-11 15:14 纯粹的 阅读(11) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 把覆盖的区域变成黑色,然后在区域内划几条竖线,一定能分成若干个矩形左右拼接而成的图形 想象一条竖着的线,它的运动轨迹是不连续的,即他会从一个矩形的竖边跳到另一个矩形的竖边,每跳一条竖边都会对借着竖边归属的矩形的信息对这条竖边的激活块进行修改 当竖线的绝对位置发生移动时,计算激活区间产 阅读全文
posted @ 2024-03-10 21:31 纯粹的 阅读(29) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 原题等价于求以 ii>=k 为右端点,长度为 k 的区间内的最大元素 由于维护的区间是定值,所以我们可以用单调队列维护,单调队列中保证元素大小从头到尾降序,且下标升序 这样一来,我们便可以保证下标在指定范围内,然后取最大值也只需要 \(O(1)\ 阅读全文
posted @ 2024-03-10 15:17 纯粹的 阅读(10) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 1.倒序求 2.求每个点前有多少高度比自己小的 3.高度函数图像是有升有降的,由于要求比自己小的,在求完之后,我们把所有点前比自己小的点缩起来放到自己身上,然后把那些点删掉,再插入自己 这样序列就变成了降序,遍历的时候也只需要遍历那些降序点 code #include<bits/st 阅读全文
posted @ 2024-03-10 15:01 纯粹的 阅读(23) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 太巧妙了 把每个点上方的连续f长度记录下来,然后求每行的柱状图构成的矩形的最大面积 code #include<bits/stdc++.h> using namespace std; int f[1005][1005]={0}; int n,m; struct node { int 阅读全文
posted @ 2024-03-10 14:37 纯粹的 阅读(10) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 当你直到贪心不可行的时候就要用dp了 code #include<bits/stdc++.h> using namespace std; int ans=2e9; vector<int> G[10005]; int dp[100005][55]={0}; void ss(int no 阅读全文
posted @ 2024-03-10 12:00 纯粹的 阅读(16) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 得分有哪些条件?颜色相同,下标同奇或同偶, 由此我们对数进行sort分类,把颜色相同的放一起,然后颜色内部按下标小到大排 然后就是很关键的分数计算公式 (x+z)×(numberx+numberz). 可以分解为 \(\t 阅读全文
posted @ 2024-03-10 01:06 纯粹的 阅读(16) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 话说dalao们是怎么做这么快的?? 问从含有字符串的背包中取出一些字符串(每个背包只能娶一个),问能拼凑出给定字符串的最小代价 由于这里的拼凑是有顺序的,即如果b能拼上的是中间一块,那么a一定拼的是前边一块,这种拼凑让人想到了背包 这里是字符串的背包,其实是一样的,先判断能不能放进 阅读全文
posted @ 2024-03-10 00:25 纯粹的 阅读(20) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 直接插在它后面,这种数据结构是链表 赛时明明想到了链表,但是写的一团糟。。 对于链表,最简单的就是用map了 code #include<bits/stdc++.h> using namespace std; int a[200005]; map<int,int> head,to; 阅读全文
posted @ 2024-03-10 00:20 纯粹的 阅读(32) 评论(0) 推荐(0) 编辑
摘要:原题链接 思路 求最大区间和 设每个点为区间右端点时的最大区间和 f[i] ,则答案一定为 max(f[i]) 求最大的 f[i] 每个 f[i]=max(sum[i]sum[j1]),j[ik+1,i] \ 阅读全文
posted @ 2024-03-09 21:52 纯粹的 阅读(9) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 太巧妙了!! code #include<bits/stdc++.h> using namespace std; int main() { int n,w; cin>>n>>w; int score[605]={0}; for(int i=1;i<=n;i++) { int x; c 阅读全文
posted @ 2024-03-09 19:15 纯粹的 阅读(41) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 不能连续选k个元素 任意每k个元素就有一个不选 每k个点就有一个断点 每个点都有可能是断点 dp求解 sol.1f[i] 为第i个点为断点且为结尾的最大值 则 \(f[i]=max(f[j]+sum 阅读全文
posted @ 2024-03-09 16:40 纯粹的 阅读(16) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 一道搜索+模拟 搜索每一位可以放哪个值([0,9]),然后累加搜索下一位 注意细节 code #include<bits/stdc++.h> using namespace std; #define ll long long ll f[10][105]={0}; ll n,k 阅读全文
posted @ 2024-03-08 20:37 纯粹的 阅读(24) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 请看清楚题目再下手!! 每次都可以且必须派 [1,m] 条船,然后计算每次任务的最大值,最后求和 code #include<bits/stdc++.h> using namespace std; #define ll long long int main() { ll n, 阅读全文
posted @ 2024-03-08 20:34 纯粹的 阅读(48) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 直观的 O(n) 算法很容易想到,但是很不幸,挂了 所以我们要想到 O(1) 的做法 考虑到斐波那契数列非常有规律,所以我们找找规律 奇,奇,偶,奇,奇,偶。。。 code #include<bits/stdc++.h> using namespace std; #d 阅读全文
posted @ 2024-03-08 18:51 纯粹的 阅读(5) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 我一开始也很困惑,然后我想要不数据范围小一点我构造看看 当 n=5k=0 可不可以 k=1 可不可以 k=2 可不可以 然后根据直觉,gcd(a,a+1) 始终为一,且 一 和任何数的最大公约数都为一,自己和自己的最大公约数还是自己,所以 阅读全文
posted @ 2024-03-08 18:27 纯粹的 阅读(4) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 这种让来让去让我想到了二分图!! 注意细节!!剩余的就是模拟了 code #include<bits/stdc++.h> using namespace std; int stu[55],gohome[55],know[55][55]; int n; int belong[55]={ 阅读全文
posted @ 2024-03-08 15:48 纯粹的 阅读(6) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解,终于有一道题一遍过了 强连通分量缩点加本题个性化判断 code #include<bits/stdc++.h> using namespace std; vector<int> G[10005]; int order[10005]={0},low[10005]={0},len=0; 阅读全文
posted @ 2024-03-08 15:04 纯粹的 阅读(10) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 抽象化 抽象成点和边,对于抹除一个点,判断整个图是否联通 等价于建立一个点(被抹除点的前一个点),判断这个点与周围点相连后,累积合并次数是否等于点数减一 code #define ll long long #include<bits/stdc++.h> using namespace 阅读全文
posted @ 2024-03-08 14:26 纯粹的 阅读(13) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 把奶牛看成点,赠送列表关系看成有向边,这样这道题就成了对强连通分量缩点,然后找出这个新图中入度为零的点有几个,出度为零的点有几个 code #include<bits/stdc++.h> using namespace std; vector<int> G[105]; int len 阅读全文
posted @ 2024-03-08 12:21 纯粹的 阅读(8) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解1:朴素广搜 注意细节 code1 #include<bits/stdc++.h> using namespace std; int poi[4]={-3,1,-1,3}; int main() { string s; cin>>s; queue<string> q; map<stri 阅读全文
posted @ 2024-03-07 20:05 纯粹的 阅读(6) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解1: 按边权从大到小排序,如果这条边的两个点没确定关系,那么把他们设为敌人 这样,就成了一棵棵最大生成树(因为有的罪犯之间没有怨气) 由敌人的敌人是朋友可以得出,如果两个点在同一棵树,且距离为偶数,那么代表他们之间互为朋友 code1 #include<bits/stdc++.h> u 阅读全文
posted @ 2024-03-07 18:41 纯粹的 阅读(21) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 最小生成树和最短路不一样的兄弟 code #include<bits/stdc++.h> using namespace std; int fa[306]={0}; int finds(int now){return (fa[now]==now?now:finds(fa[now])) 阅读全文
posted @ 2024-03-06 23:25 纯粹的 阅读(6) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 思维转换,想象井里的水都来自山上,并把山看成一个点,那么这道题就变成了最小生成树 简证最小生成树原理: 按边权排序,然后遍历,如果这条边的两个点之前每连过,那么就连上,因为这就是这两个点所在集合之间的最短路径了,不然这条边没必要加,因为已经联通了 算是一种贪心? code #incl 阅读全文
posted @ 2024-03-06 23:09 纯粹的 阅读(69) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 二分图匹配,总的来说就是如果我的位子没人霸占,那我就坐,如果没人霸占,那我尝试着让他滚蛋 如果一个位子经历过两次滚蛋,说明别人确实没位子坐了,人家确实需要这个位子,那我就换一个位子 code #include<bits/stdc++.h> using namespace std; i 阅读全文
posted @ 2024-03-06 21:19 纯粹的 阅读(8) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 代码量小的离谱,思维难度大的离谱 对于两个原本不相邻的同色区域块,历经千辛万苦碰面的场景,我们可以描述成右边的区域块为左边的区域块消除的时候增添了长度 设 dp[i][j][suf] 代表消除区域 [i,j] 同时该区域的 j 增添了长度 suf 但是 阅读全文
posted @ 2024-03-06 20:29 纯粹的 阅读(17) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 二分加动态维护区间最大值 注意设立变量的含义,改变变量值的规则 code #include<bits/stdc++.h> #define ll long long using namespace std; ll sum[500005]={0}; struct unit { ll x, 阅读全文
posted @ 2024-03-06 19:35 纯粹的 阅读(20) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解1 stl模拟,注意lowerbound的效果和pos的返回值 code1 #include<bits/stdc++.h> using namespace std; vector<int> a; int main() { int n; cin>>n; while(n--) { int 阅读全文
posted @ 2024-03-04 23:38 纯粹的 阅读(13) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 对于每个容量,当前组 i 而言,放的决策有 size(i)+1 种 code #include<bits/stdc++.h> using namespace std; struct unit { int w,v; }; vector<unit> G[1005]; in 阅读全文
posted @ 2024-03-04 22:51 纯粹的 阅读(5) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 等价于线性代数中求最大无关组的大小 code #include<bits/stdc++.h> using namespace std; int main() { int t; cin>>t; while(t--) { int n; cin>>n; int a[105]={0}; fo 阅读全文
posted @ 2024-03-04 22:42 纯粹的 阅读(19) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 我们发现,当前的决策会影响未来的结果,因此我们把当前的决策存下来,这样等未来要用的时候就有的转移了,如果未来由多个状态决定,那就现在把那些状态都记录下来 我们发现,一个点如果能被吸收,那么其左边或右边的一个区间的点都肯定被吸收了,所以我们记录 f[i][j] 表示区间 \([ 阅读全文
posted @ 2024-03-04 20:44 纯粹的 阅读(4) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 核心技巧:两次搜索 第一次搜索: 搜索出 f[now][i]now 为根节点的子树且距离根节点恰好为 i 的节点的个数 搜索完了之后,把范围 k 以内的累加 第二次搜索: 由于整棵树的根节点的 f 等于整棵树里距离不大于 k 的节 阅读全文
posted @ 2024-03-04 17:56 纯粹的 阅读(18) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 遍历主件,和还剩下多少钱的情况下,最多有五种购买决策 1.不买 2.买主件 3.买主件+附件1 4.买主件+附件2 5.买主件+附件1+附件2 如果当前的钱够买,那就买买看,然后加上剩下的钱能买的最大值 code #include<bits/stdc++.h> using names 阅读全文
posted @ 2024-03-04 17:49 纯粹的 阅读(13) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 太妙了 如果能出去,那么出去的时间一定为让我出去的那个垃圾掉落的时间,且在此之前我所在的高度能撑到我垃圾掉落 如果出不去,我肯定一直呆在井底不动 所以我们可以以高度为变量 设每个高度能撑到的最久的时间 而每个垃圾在拿到的一瞬间要么吃要么搭,所以我们穷举,两个都要,如果搭,那么搭上去的 阅读全文
posted @ 2024-03-03 23:38 纯粹的 阅读(12) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 设 sum 为总能力 则若 sumF 的倍数 sum mod F=0 根据加法求模的特性,我们可以设 dp[i][j] 为 加上第 i 个元素后, 模为 j 的方案数 转移方程移得 注意一个细节:按照遍 阅读全文
posted @ 2024-03-03 22:55 纯粹的 阅读(40) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 巧妙的背包问题 我可以用按顺序遍历城堡,顺便表示出遍历到当前城堡时用掉了多少兵力,这样是可以穷尽所有兵力派送情况的 同时把这个城堡里的敌方兵力升序排序,然后遍历,表示为了消灭所有兵力小于等于ta的敌人所加的分 code #include<bits/stdc++.h> using na 阅读全文
posted @ 2024-03-03 20:28 纯粹的 阅读(17) 评论(0) 推荐(0) 编辑
摘要:原题链接 题解 计算分数是搜索 存储前缀注意细节 code #include<bits/stdc++.h> using namespace std; #define ll long long ll sco[35][35]={0}; string pre[35][35]; ll a[35]={0}; 阅读全文
posted @ 2024-03-03 16:53 纯粹的 阅读(13) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示