随笔分类 -  hdu

摘要:拓扑排序找环模题,如果一次排序所有点不能全部删除则有环,因为环的所有点入度为1。 #include <bits/stdc++.h> #include <unordered_set> #include <unordered_map> #define pb push_back #define mp ma 阅读全文
posted @ 2018-09-04 14:23 LMissher 阅读(107) 评论(0) 推荐(0)
摘要:染色覆盖问题,有q次操作,每次操作可以把一个区间染成一种颜色或者把询问一个区间有多少中颜色。 把一个区间拆分成线段树中的一个一个的小区间,查询的时候也一样,当我们要染的区间是一个大区间的一部分且大区间有颜色时,把大区间的颜色pushdown。 查询时当线段树的区间包含了我们要查询的区间就返回这个区间 阅读全文
posted @ 2018-09-02 17:02 LMissher 阅读(105) 评论(0) 推荐(0)
摘要:分层图最短路模板题。 #include <bits/stdc++.h> using namespace std; typedef long long ll; const ll inf = 1e18; const int M = 1e5+7; int n,m,cnt,head[M],flag[M][2 阅读全文
posted @ 2018-09-02 14:19 LMissher 阅读(160) 评论(0) 推荐(0)
摘要:给n个数字与q次询问,每次询问找出区间不同数字的个数并输出在这个区间里第"(个数+1)/2"次出现的数字。每个数字只有第一次出现会被计数。 考虑主席树对区间不同个数的统计是基于重复的数字只保留最后出现的那次也就是说我们可以找到从后往前数字第一次出现的计数。 但现在要求的是从前向后,考虑从后向前建立主 阅读全文
posted @ 2018-08-31 21:34 LMissher 阅读(194) 评论(0) 推荐(0)
摘要:主席树求区间小于某个数的数的个数模板(静态) #include <bits/stdc++.h> using namespace std; const int M = 1e5+7; int _,n,q,a[M],ls[M],tot,sz,pos,cas=1; int L[20*M],R[20*M],T 阅读全文
posted @ 2018-08-31 13:21 LMissher 阅读(125) 评论(0) 推荐(0)
摘要:模板 #include <bits/stdc++.h> using namespace std; const int M = 1e5+7; int _,n,q,a[M],ls[M]; int L[M*20],R[M*20],num[M*20],T[M],tot,pos;//L每个节点的左子树,R每个 阅读全文
posted @ 2018-08-31 10:09 LMissher 阅读(142) 评论(0) 推荐(0)
摘要:权值线段树求第k小。 题意给n个数所有前缀中的逆序对数,构造出原序列。 第i个前缀减去第i-1个前缀就是第i个值插入序列后增加的逆序对,也就是说前面有这么多数比当前数大。那么i减去这个数代表当前数是前i个数的区间第k小。 维护一个权值线段树,初始节点权值分别为1...n。 从后向前考虑,每遇到一个数 阅读全文
posted @ 2018-08-30 10:54 LMissher 阅读(131) 评论(0) 推荐(0)
摘要:权值线段树求逆序对,题目依次把首数字移向尾部问最小逆序对。移动的时候查询更新一下就好。 #include <bits/stdc++.h> #define Lson l,mid,rt<<1 #define Rson mid+1,r,rt<<1|1 using namespace std; const 阅读全文
posted @ 2018-08-30 10:02 LMissher 阅读(130) 评论(0) 推荐(0)
摘要:给一颗树,给q次询问,每次询问给一条路径x到y并且给这条路染色v。 问最后每个点分别被哪种颜色染色的最多。 首先考虑在直线上的这种问题,我们可以把每次染色的区间左端点和右端点记录下来。然后建一颗颜色的权值线段树。 每次到左端点的时候把权值线段树的颜色++,到右端点+1的时候把颜色--。类似差分。然后 阅读全文
posted @ 2018-08-29 14:34 LMissher 阅读(125) 评论(0) 推荐(0)
摘要:有n个节点的树,有q次操作,每次操作选择一条路径问从起点出发到终点可以在任意点花vi买入一个商品并在之后任意一点以vj卖掉。 问最大收益是多少,并在每次操作后将那条路径所有点权加上v。 树链剖分将问题变为直线上的问题后,考虑用线段树维护一个最大值与最小值,以及从直线左到右的最大收益以及直线右到左的最 阅读全文
posted @ 2018-08-29 14:33 LMissher 阅读(161) 评论(0) 推荐(0)
摘要:题意给你q次询问,给一条链问从给定起点到给定终点的最长连续严格递增子序列。 因为给定起点与终点所以路径可能与dfs序的树节点展开顺序相反。所以问题变成了给n个数询问一个区间的最长LCIS。 但因为方向可正可负,所以我们除了维护区间的最长递增以外还要维护最长递减。线段树的部分就做完了。 树链剖分的时候 阅读全文
posted @ 2018-08-28 23:21 LMissher 阅读(210) 评论(0) 推荐(0)
摘要:给n个数,有两个操作,第一个操作单点更新,第二个操作询问区间的最长严格连续递增子序列 因为是连续,所以线段树区间合并的时候答案只可能是两个子区间的答案或者合并后的中间拼接的最大值。 维护五个量,lnum区间左端点的值,rnum区间右端点的值,llen区间从左端点起的最长LCIS,rlen区间从右端点 阅读全文
posted @ 2018-08-28 11:27 LMissher 阅读(131) 评论(0) 推荐(0)
摘要:树链剖分模板题。更新一条链的值以及求一个点的值。 可以用线段树或树状数组来区间更新加单点查询。 #include <bits/stdc++.h> #define Lson l,mid,rt<<1 #define Rson mid+1,r,rt<<1|1 using namespace std; co 阅读全文
posted @ 2018-08-27 13:04 LMissher 阅读(163) 评论(0) 推荐(0)
摘要:题意就是给一颗有根树再给m个询问,每个询问需要回答第i个节点的子树下有多少个出现k次的数字。 考虑启发式合并,当加入一个节点时如果加入之前是k次那么加入之后答案-1,如果加入后刚好是k次,那么答案+1。 删除操作同理。 #include <bits/stdc++.h> using namespace 阅读全文
posted @ 2018-08-27 09:36 LMissher 阅读(107) 评论(0) 推荐(0)
摘要:给定一棵n个点的有根树,1为根节点,每个点有一个点权。询问每个点的子树下任意两个数字的gcd最大是多少。 我们可以先把1e5以内所有数字的因数求出来。因为1e5以内数字的因数不超过200个。所以可以暴力做些事情。 树上启发式合并,将重儿子的所有节点的权值以及权值的因子保存下来,然后依次合并轻儿子。 阅读全文
posted @ 2018-08-26 18:03 LMissher 阅读(203) 评论(0) 推荐(0)
摘要:题意很迷,给一棵n个节点的树,每个节点有一个权值是这个节点完成其任务的时间。 比如第一个任务的权值是1,完成它将在第一秒,第二个任务的权值是2,完成前两个任务的时间是3秒。 现在问你完成任务的时间再加上罚时是多少,罚时是完成任务的时间再加上它开始做任务的时间。比如一个任务权值是3,从第四秒开始做,那 阅读全文
posted @ 2018-08-26 15:15 LMissher 阅读(175) 评论(0) 推荐(0)
摘要:题目:最小生成树裸题。 注意getchar的使用。 代码: #include<cstdio>#include<cstring>#include<algorithm>using namespace std;int per[110];struct node{ char a,b; int w;}s[100 阅读全文
posted @ 2017-09-12 14:55 LMissher 阅读(117) 评论(0) 推荐(0)
摘要:题目:有两组数目相同的数,数目可以顺序移动。每组数从1到n进行ai-bi并求和,当和小于0时停止,并把之前的ai求和输出,求最大的ai求和。 题解:把两组数复制并延长一倍。一个循环搞定。 ps:第一道自己做出的网络赛题目,继续努力! 代码: #include<cstdio>int a[1100000 阅读全文
posted @ 2017-09-12 13:32 LMissher 阅读(94) 评论(0) 推荐(0)
摘要:题意:有n个点m条边,求用边把所有点连接起来的最小权值。 题解:当m小于n-1时是不可能的,当有自环时也不可能,排除掉这两个情况然后用Kruskal。 代码: #include <cstdio>#include <algorithm>using namespace std;int n,m,f[110 阅读全文
posted @ 2017-08-22 11:11 LMissher 阅读(130) 评论(0) 推荐(0)
摘要:题意:有n个村子与很多路,有些路已经修好了,求最小路程把所有村子连起来。 题解:用Kruskal算法,提前把已经修好的路合并。 代码: #include <cstdio>#include <algorithm>using namespace std;int n,q,Map[110][110],f[1 阅读全文
posted @ 2017-08-22 10:33 LMissher 阅读(120) 评论(0) 推荐(0)