
大学ACM
文章平均质量分 55
大学ACM经历
匿枫
这个作者很懒,什么都没留下…
展开
-
CodeForces 1714G :Path Prefixes 二分 + 树上倍增
晚上睡不着,国庆节似乎跟我想象中的不太一样起来写两道题吧希望以后,生活可以善待我吧。原创 2022-10-02 02:46:15 · 397 阅读 · 2 评论 -
【HDU 6567】 :Cotree 换根DP
传送门分析首先我们知道,树上某点到树上其他点的距离和中,树的重心最小,所以这个问题就可以转化成找出两棵树的重心,链接,然后计算树上距离和两棵树分类可以用并查集操作,后面两个步骤用换根DP就可以解决了代码#pragma GCC optimize(3)#include <bits/stdc++.h>#define debug(x) cout<<#x<<":"<<x<<endl;#define dl(x) printf("%lld\n",原创 2021-11-17 23:09:17 · 263 阅读 · 0 评论 -
2018 CCPC Guilin H :Hamming Distance 思维 — 构造
传送门分析我是真的不会写构造啊55555首先如果可以的话,填a显然是最优情况,剩下就要考虑调整那些位置可以保证汉明距离相等首先如果相同的位置,直接填a就可以了,那么不同的位置,就要考虑如果这一位填的字母造成的距离影响能不能用后面的距离去抵消,所以我们要从后往前维护一个不相同字符前缀,然后循环每一种字母情况即可代码#pragma GCC optimize(3)#include <bits/stdc++.h>#define debug(x) cout<<#x<<原创 2021-11-17 22:28:55 · 175 阅读 · 0 评论 -
2018 CCPC Guilin J :Stone Game 思维 + 博弈论
传送门分析考虑每一个数能被选择的最大次数如果a[i]<a[i−1]&&a[i]<a[i+1]a[i] < a[i - 1] \&\& a[i] < a[i + 1]a[i]<a[i−1]&&a[i]<a[i+1],那么a[i]a[i]a[i]可以减为0如果a[i]a[i]a[i]大于其中一个,那么可以减为较小值+1如果a[i]a[i]a[i]大于左右两个数,那么可以减为较大值+1代码#pragma GCC op原创 2021-11-17 22:22:41 · 230 阅读 · 0 评论 -
CodeForces 1277E :Two Fairs 思维
传送门题意分析首先如果要做到题目的要求,那么两个点之间的关系一定是,一个点只能到达aaa不能到达bbb,一个点只能到达bbb不能到达aaa思考一下,如果一个点既能到达aaa又能到达bbb的话,那么我到达任意一点,只需要经过aaa和bbb中的其中一点就可以了所以我们需要统计,在不经过aaa的情况下能到达bbb的点和不经过bbb的情况下能到达aaa的点的数量,两者相乘即可代码#pragma GCC optimize(3)#include <bits/stdc++.h>#defin原创 2021-11-15 22:15:11 · 159 阅读 · 0 评论 -
【SDUTOJ 2414】 :An interesting game 网络流
传送门题意分析这个数据范围很小,可以考虑用网络流处理我们把0−300 - 300−30这个范围内每一个值和每一个位置连边,流量为1,费用为该变量,然后设置虚拟原点控制流量,跑最小费用最大流即可代码#pragma GCC optimize(3)#include <bits/stdc++.h>#define debug(x) cout<<#x<<":"<<x<<endl;#define dl(x) printf("%lld\n",x原创 2021-11-15 21:42:57 · 446 阅读 · 0 评论 -
CodeForces 1286B :Numbers on Tree 思维构造
传送门题意分析一开始想的是从下向上暴力赋值排序,然后对子树进行合并,但是后来发现好像不好处理冲突问题所以我们需要维护的是一个相对关系,离散化即可首先这个树上点权最小的值一定是深度最大并且aia_iai为000的点,我们把这个点或者这些点丢到队列中,然后不停向上维护相对关系即可,这个过程可以参考拓扑排序那么我们怎么去维护队列中的深度关系内,用优先队列即可复杂度为O(n2logn)O(n ^ 2logn)O(n2logn)代码#pragma GCC optimize(3)#include原创 2021-11-15 19:59:56 · 446 阅读 · 0 评论 -
CodeForces 791D :Distance in Tree 树形DP
传送门题意分析树上统计问题考虑到kkk比较小,我们可以维护num[u][i]num[u][i]num[u][i]数组表示以uuu为跟节点的子树中,到uuu点距离模kkk为iii的点有这么多,那么状态转移方程就是f[u]=f[u]+f[j]+1+num[j][0]f[u] = f[u] + f[j] + 1 + num[j][0]f[u]=f[u]+f[j]+1+num[j][0]应该比较好理解,因为如果模不为0,说明还能继续走一步,否则就得再走一步,多出来的1是从子节点字节走到uuu节点的然原创 2021-11-15 00:04:38 · 161 阅读 · 0 评论 -
CodeForces 161D :Distance in Tree 树形DP + 点分治
传送门题意给你一棵树,有nnn个点,边权都为111,问你树上有多少对点的距离为kkk分析两种思路,第一种思路是树形DP,为f[u][x]f[u][x]f[u][x]维护树上到点uuu距离为xxx的点的数量,向下跑一遍,然后向上维护一下就好了还有一种点分治的做法下次补上代码#pragma GCC optimize(3)#include <bits/stdc++.h>#define debug(x) cout<<#x<<":"<<x<<原创 2021-11-14 11:51:07 · 356 阅读 · 0 评论 -
CodeForces 796E :Exam Cheating DP
传送门题意muronglinmuronglinmuronglin是个学渣,考试的时候,她一道题也不会做她的左右桌分别是学霸chhokmahchhokmahchhokmah和学霸lukelinlukelinlukelin,虽然学霸并不是题题都会做,但他们做了的题一定都对现在muronglinmuronglinmuronglin想要作弊,但是为了不被监考员抓住,她最多偷看ppp次,一次能看连续的kkk道题给定nnn和lalala和lblblb,分别为题目总数,chhokmahchhokmahchhok原创 2021-11-12 22:45:24 · 520 阅读 · 0 评论 -
CodeForces 383C :Propagating tree 树状树组 + 差分
传送门题意分析这道题很巧妙啊首先因为要对整个子树做操作,所以很容易想到可能会跟dfsdfsdfs序有关但是仔细看一下,这里的modifymodifymodify又跟节点深度奇偶有关,怎么处理呢我们维护两个树状数组,一个表示深度为奇,一个表示偶,这样,我们在进行modifymodifymodify操作的时候,只需要对对应奇偶的树状数组进行查分操作即可,在查询中,减去奇偶属性相反的和即可代码#pragma GCC optimize(3)#include <bits/stdc++.h&g原创 2021-11-10 21:36:20 · 434 阅读 · 4 评论 -
CodeForces 1560F2 :Nearest Beautiful Number (hard version) 贪心 + 思维
传送门题意分析我们从低位开始往高位寻找第一个不合法的数字,然后让这一位+1,然后check整个数是否合法,如果还是不合法的话,继续重复上一步操作代码#pragma GCC optimize(3)#include <bits/stdc++.h>#define debug(x) cout<<#x<<":"<<x<<endl;#define dl(x) printf("%lld\n",x);#define di(x) printf("原创 2021-11-09 19:52:54 · 131 阅读 · 0 评论 -
2019 CCPC Harbin E :Exchanging Gifts 拓扑排序
传送门分析代码#pragma GCC optimize(3)#include <bits/stdc++.h>#define debug(x) cout<<#x<<":"<<x<<endl;#define dl(x) printf("%lld\n",x);#define di(x) printf("%d\n",x);#define _CRT_SECURE_NO_WARNINGS#define pb push_back#define原创 2021-11-09 19:40:23 · 257 阅读 · 0 评论 -
CodeForces 888G :Xor-MST 异或最小生成树
传送门题意给定一个nnn个节点的完全图,每个节点有个编号aia_iai,节点iii和节点jjj之间边的权值为ai⊕aja_i \oplus a_jai⊕aj,求该图的最小生成树的权值和。分析首先放上我CoolGuang的题解,讲的比较详细我个人的理解是,如果我们去递归整个字典树,如果遇到一个点即有左子树又有右子树,那么我们把右子树的所有点看成已经匹配好的一个团,左子树内的所有点看成匹配好的一个团,那么左右子树两个团直接需要进行匹配连接,那么我们去遍历左子树内的每一个点,查询在右子树的字典树原创 2021-11-07 20:28:41 · 228 阅读 · 0 评论 -
nowcoder :Birthday 费用流
传送门分析看完之后第一眼反应是个图论问题,想了两种方法,一种是求一个维护联通块个数,一个是网络流建图,后来想想联通块好像不太能写于是往网络流上想建图比较好建,源点和每一只蜡烛连边,每一只蜡烛和两个点之间连边,流量都为1,费用都为0,剩下的就是费用边应该如何连接的问题了,因为流量和费用并不是一个均衡的关系,所以可以暴力,每个点和汇点之间建50条边,每条边的费用为k∗k−(k−1)∗(k−1)k * k - (k - 1) * (k - 1)k∗k−(k−1)∗(k−1),然后跑费用流即可代码#pra原创 2021-11-07 17:01:11 · 96 阅读 · 0 评论 -
LOJ P2448 :无尽的生命 树状数组 + 离散化
传送门分析我们将需要操作的点进行离散化,这样就可以对这些点用树状数字求逆序对,同时还需要维护离散化后每两个点之间的数的逆序对的数量代码#include <bits/stdc++.h>#define debug(x) cout<<#x<<":"<<x<<endl;#define dl(x) printf("%lld\n",x);#define di(x) printf("%d\n",x);#define _CRT_SECURE_NO_原创 2021-11-03 21:19:23 · 259 阅读 · 0 评论 -
CodeForces 740D :Alyona and a tree 树上差分
传送门题意分析求每个点控制了多少个点,等价于求每个点会被多少个点控制考虑从根节点到每一个节点维护一条链,记录链上每一个节点到跟节点的距离,这样二分就可以求出距离当前点,最短的可以控制当前节点的点,然后对这个区间上每一个数+1即可,这个操作可以用查分来处理代码#pragma GCC optimize(3)#include <bits/stdc++.h>#define debug(x) cout<<#x<<":"<<x<<endl;原创 2021-11-02 22:54:00 · 177 阅读 · 1 评论 -
河南省赛:神奇的魔法 思维
题意分析思路比较好想,维护两个优先队列,一个是可以两倍处理数,一个是还未被选中但最终一定要被选中的数,同时维护一下两个和即可具体看代码代码#pragma GCC optimize(3)#include <bits/stdc++.h>#define debug(x) cout<<#x<<":"<<x<<endl;#define dl(x) printf("%lld\n",x);#define di(x) printf("%d\n"原创 2021-11-02 21:34:19 · 113 阅读 · 0 评论 -
CodeForces 375D :Tree and Queries dsu on tree 换根DP
传送门题意有n个数,你可以对每个数进行两种操作:将一个数乘以2将一个数变为其二分之一并向下取整问最少通过多少次操作可以将这些数的值变为全部相同。分析好像很多题解都是写的暴力啊,我来补一个换根DPDPDP考虑建树,iii和i∗2i * 2i∗2之间连一条单向边,i/2i / 2i/2和iii之间连一条单向边,然后如果要把所有的数全部转换成1的话,就是记录每一个点的代表的数出现的次数乘以这个点的深度的和,然后要统计每一个点作为答案的情况,换一下根即可代码#pragma GCC optimi原创 2021-11-02 20:39:29 · 168 阅读 · 0 评论 -
CodeForces 375D :Tree and Queries dsu on tree
传送门题意分析树上静态统计,跟dsuontreedsu on treedsuontree的板子题处理出现次数最多的是一个思路,维护一下每一种颜色出现的次数即可代码#pragma GCC optimize(3)#include <bits/stdc++.h>#define debug(x) cout<<#x<<":"<<x<<endl;#define dl(x) printf("%lld\n",x);#define di(x) p原创 2021-11-01 15:25:40 · 177 阅读 · 0 评论 -
2020 CCPC Changchun F :Strange Memory dsu on tree
传送门分析一开始读错题了,以为是个算贡献的水题。。。树上静态统计,考虑dfsuontreedfsu on treedfsuontree,我们去维护每一个值对应每一个二进制位出现了多少次1,然后就可以快速计算异或值代码#pragma GCC optimize(3)#include <bits/stdc++.h>#define debug(x) cout<<#x<<":"<<x<<endl;#define dl(x) printf("%原创 2021-10-31 23:05:07 · 113 阅读 · 0 评论 -
CodeForces 1154E :Two Teams 思维
传送门题意分析很久以前比赛没写出来的一道题,翻出来补一下我们维护两个优先队列q,pq,pq,p,把所有人的信息丢到队列qqq中,同时维护前驱和后继,每次取出最大的那个,然后遍历他的前驱和后继的kkk个节点,把信息丢到队列ppp中,这样,只要p,qp,qp,q两个队列的toptoptop信息相同,就说明已经被找过了,应该poppoppop掉代码#pragma GCC optimize(3)#include <bits/stdc++.h>#define debug(x) cout&原创 2021-10-28 22:16:34 · 318 阅读 · 0 评论 -
CodeForces 652D :Nested Segments 思维 + 树状数组
传送门题意给你nnn条闭区间的线段,求每条能够包含的线段的数量分析考虑固定一维,将线段的左端点从大到小排序,那么被包含的线段一定是访问过的,右端点小于当前访问线段右端点的线段,离散化之后用树状数组维护即可代码#pragma GCC optimize(3)#include <bits/stdc++.h>#define debug(x) cout<<#x<<":"<<x<<endl;#define dl(x) printf("%lld原创 2021-10-28 21:11:42 · 200 阅读 · 0 评论 -
LOJ P1967 :货车运输 最大生成树 + 树链剖分
传送门分析跟上一题基本一样的思路(我从哪翻出来这道题的我也忘了。。。)代码#include <bits/stdc++.h>#define debug(x) cout<<#x<<":"<<x<<endl;#define dl(x) printf("%lld\n",x);#define di(x) printf("%d\n",x);#define _CRT_SECURE_NO_WARNINGS#define pb push_back原创 2021-10-25 22:22:41 · 90 阅读 · 0 评论 -
CodeForces 609E :Minimum spanning tree for each edge 最小生成树 + 树链剖分
传送门题意给你nnn个点,mmm条边,如果对于一个最小生成树中要求必须包括第i(1<=i<=m)i(1<=i<=m)i(1<=i<=m)条边,那么最小生成树的权值总和最小是多少。分析先将人和车按照初始位置从小到大排序,这样就可以维护双指针缩小范围然后将左端点小于等于当前乘客的车加入线段树,线段树上每一个节点表示当前时间到达的位置然后线段树上二分即可(线段树上二分需要时刻记住左子树是一个残缺区间,维护的区间值可能并不是出现在查询的残缺区间,需要去判断返回值再去原创 2021-10-25 21:22:47 · 345 阅读 · 0 评论 -
SPOJ - DQUERY:D-query 主席树
传送门题意给定一个数组a[n]a[n]a[n],请你统计lll到rrr中不同数字的个数。分析跟上一题一样,同样用主席树维护第iii棵主席树表示区间内[1−r][1 - r][1−r]不同数的个数,然后维护lastlastlast,对于每个位置,先将上一个位置减一,再将当前位置加一即可代码#pragma GCC optimize(3)#include <bits/stdc++.h>#define debug(x) cout<<#x<<":"<<原创 2021-10-23 22:28:39 · 121 阅读 · 0 评论 -
CodeForces 1000F :One Occurrence 主席树
传送门题意分析主席树进行区间维护我们维护每一个位置上的数字,上一次出现的位置在哪里,只要区间有数字的lastlastlast小于左端点即可,主席树暴力维护代码#pragma GCC optimize(3)#include <bits/stdc++.h>#define debug(x) cout<<#x<<":"<<x<<endl;#define dl(x) printf("%lld\n",x);#define di(x) pr原创 2021-10-23 20:53:15 · 293 阅读 · 0 评论 -
CodeForces 1592E :Bored Bakry 二进制 + 思维
传送门题意给定一个 nnn 个数的数组,要求找一个连续子区间,满足该子区间的区间 &\&& 和 >>> 区间异或和。求该子区间的最大长度。分析二进制常见的处理方式就是进行拆位处理首先如果是大于的话,那么就要求第kkk位的异或和大于&\&&,然后大于第kkk位的异或和为0代码#pragma GCC optimize(3)#include <bits/stdc++.h>#define debug(x) cout<原创 2021-10-20 15:54:46 · 318 阅读 · 0 评论 -
CodeForces 1574D :The Strongest Build BFS
传送门题意分析用mapmapmap维护不能选的组合,然后bfsbfsbfs直接搜太暴力了。。。代码#pragma GCC optimize(3)#include <bits/stdc++.h>#define debug(x) cout<<#x<<":"<<x<<endl;#define dl(x) printf("%lld\n",x);#define di(x) printf("%d\n",x);#define _CRT_SE原创 2021-10-19 23:59:43 · 115 阅读 · 0 评论 -
宇宙人浇花:字典树 + 前缀和
传送门题意分析水群看到的题,woc贼妙我们都知道,要表示一个区间的异或和的话,可以用前缀和处理,那么这里有两个,要怎么处理呢我们用aaa数组表示原序列的异或和前缀和,bbb表示原序列 + 的异或和前缀和,我们从0 - n开始循环,不停的把a[n]a[i]⊕b[i]a[n] ^ a[i] \oplus b[i]a[n]a[i]⊕b[i]插入,也就是插入了类似于aaaabbbbaaaabbbbaaaabbbb的形式,然后对a[i]oplusb[i]a[i] oplus b[i]a[i]oplusb原创 2021-10-19 22:23:46 · 224 阅读 · 0 评论 -
CodeForces 1593G :Changing Brackets 前缀和 + 思维
传送门题意分析因为左右之间可以相互转换,所以不用考虑方向问题,所以如果是合法状态的话,只要保证奇数位置和偶数位置的相同类别的括号数量相同即可,用前缀和维护一下即可代码#pragma GCC optimize(3)#include <bits/stdc++.h>#define debug(x) cout<<#x<<":"<<x<<endl;#define dl(x) printf("%lld\n",x);#define di(x)原创 2021-10-19 18:53:09 · 212 阅读 · 0 评论 -
CodeForces 1579G :Minimal Coverage DP
传送门题意大意是有之前拜访的直线的端点当作起始点摆放,要求最小的覆盖并集长度分析我们把最后的线段的左端点始终对准0,用f[i][j]f[i][j]f[i][j]表示前iii条线,右端点位于jjj位置的情况下的最小长度,那么,如果我们正着摆放的话,状态转移方程就是f[i][j+a[i]]=min(f[i][j+a[i]],max(f[i−1][j],j+a[i]))f[i][j + a[i]] = min(f[i][j + a[i]],max(f[i - 1][j],j + a[i]))f[i][j+原创 2021-10-06 16:02:44 · 275 阅读 · 0 评论 -
CodeForces 1579F :Array Stabilization (AND version) 思维
传送门题意给定一个数组nnn,下标从000开始,只包含000和111.给定ddd。现在需要你确定经过多少次操作后数组元素全为0。操作为将数组循环移位ddd,再和原数组相与得到新数组。分析考虑插入队首和队尾逆序对增加的个数也就是求序列中大于aia_iai和小于aia_iai的个数那么可以用树状数组来维护因为值域比较大所以需要提前离散化一下代码#pragma GCC optimize(3)#include <bits/stdc++.h>#define debug(x)原创 2021-10-05 19:52:32 · 219 阅读 · 0 评论 -
CodeForces 1579E2 :Array Optimization by Deque 树状数组 + 离散化
传送门题意给你一个数组,然后给一个双端队列,数组从1~n,你每次可以将ai,放到队列后面或前面,问最后的最小逆序对是多少分析考虑插入队首和队尾逆序对增加的个数也就是求序列中大于aia_iai和小于aia_iai的个数那么可以用树状数组来维护因为值域比较大所以需要提前离散化一下代码#pragma GCC optimize(3)#include <bits/stdc++.h>#define debug(x) cout<<#x<<":"<<原创 2021-10-05 00:32:31 · 271 阅读 · 0 评论 -
2021ICPC网络赛第一场 :G Longest Prefix Matching 字典树
分析看起来是个字典树的板子题?写了个巨丑的代码交上去ttt了,果然人丑常数大代码#pragma GCC optimize(3)#include <bits/stdc++.h>#define debug(x) cout<<#x<<":"<<x<<endl;#define dl(x) printf("%lld\n",x);#define di(x) printf("%d\n",x);#define _CRT_SECURE_NO_WARN原创 2021-09-20 22:38:43 · 184 阅读 · 0 评论 -
CodeForces 280C :Game on Tree 数学期望
传送门题意分析每个点有两种情况,删除或者不删除,也就是对应操作0次或者操作1次所以,我们考虑对每个点单独计算贡献,因为每个点操作次数最多为1,所以期望应该是每个点被选中的概率和,考虑一条从根结点到uuu的链,什么情况下uuu必选呢,当1−(u−1)1 - (u - 1)1−(u−1)这些点都没有被选中的情况下,uuu节点必选,所以概率为1/dep1 / dep1/dep代码#pragma GCC optimize(3)#include <bits/stdc++.h>#defin原创 2021-09-15 22:01:05 · 172 阅读 · 0 评论 -
【HDU6278】Just h-index 主席树 + 二分
传送⻔题意给n个数,q次询问,每次询问给出一个区间[l,r],要你求出最大的h,使得在[l,r]这个区间内满足,有h个数的值大于等于h。分析求最大的符合要求的数,首先想到二分的思路然后因为处理区间内的个数问题,可以在主席树上处理因为主席树自带一个二分,所以可以去掉一个logloglog代码#pragma GCC optimize(3)#include <bits/stdc++.h>#define debug(x) cout<<#x<<":"<&l原创 2021-09-15 16:16:21 · 119 阅读 · 0 评论 -
【HDU5521】Meeting 最短路 + 优化建图
传送⻔题意有个图,有n个结点,有m个区域,相同的点可以在不同的区域中,同一区域内的点之间的距离都是一样的。有两个人分别在结点1和结点n,让两个人选择一个地方相聚,到达这个地方所用的时间最少。输出最少的时间,以及所有最短时间的点。分析最短路问题,怎么去建图呢显然,一个集合里面两两建边是一件不太现实的事,考虑每一个集合建了一个虚点,那么集合之中的移动可以看成 点 - 虚点 - 点的移动代码#pragma GCC optimize(3)#include <bits/stdc++.h>原创 2021-09-14 22:46:14 · 119 阅读 · 0 评论 -
CodeForces 1511E :Colorings and Dominoes DP + 贡献
传送门题意分析显然暴力枚举每一种颜色情况是不现实的,那么我们去考虑每两个小方格在什么情况下会被覆盖,计算他们各自的贡献即可首先考虑到每一行和每一列是相互独立的,那么我们枚举每一行和每一列,处理出来连续的方格,设长度为lenlenlen,假设我们要选择最后两个方格进行覆盖,那么我们的方案数就是f[i]=(f[i]+ksm(2,i−3)+f[i−2])f[i] = (f[i] + ksm(2,i - 3) + f[i - 2])f[i]=(f[i]+ksm(2,i−3)+f[i−2])假设i−2i原创 2021-09-14 21:51:04 · 126 阅读 · 0 评论 -
【CSUST 7041】: lazy tree 线段树
传送门题意分析这题思路不是很难,难在细节的处理上首先我们去维护区间的价值和区间和,区间的价值为两个子区间的价值和+两个子区间和的乘积然后推出来区间+x对价值的改变公式即可代码#pragma GCC optimize(3)#include <bits/stdc++.h>#define debug(x) cout<<#x<<":"<<x<<endl;#define dl(x) printf("%lld\n",x);#define原创 2021-09-14 20:40:14 · 216 阅读 · 0 评论