随笔分类 - hdu
摘要:无向图的最小路径覆盖。 找出联通块里所有的奇度点,然后两个两个的点互相连边,构造成所有点都是偶度数。 然后就找联通块里有多少条欧拉回路,如果回路中有新加的边则答案++。 #include <bits/stdc++.h> using namespace std; const int M = 1e5+7
        阅读全文
                
摘要:给一幅图,并且给出图里哪些是好点,哪些是坏点,问你这副图能不能被分成一个好点坏点图不矛盾。 我们先把给定了是好点或者坏点的点进行二分图染色,如果染出来是矛盾的就错误。 然后在把那些和已知点不在同一个联通块里的点随意指定初始颜色染色,染出来是矛盾的就错误。 #include <bits/stdc++.
        阅读全文
                
摘要:让你找一幅图里有多少点集含有三元环或者三个独立点。 由拉姆塞定理可知六个人中必有三个人认识或三个人都不认识,所以超过6的点集都算。 ans = pow(2,n) - C(n,i) i属于[ 0 , 5 ] r然后再暴力计算[ 3 , 5 ]的点集里哪些属于合法的即可。 #include <bits/
        阅读全文
                
摘要:water,给一个数n,问从1...n的数字里最少删去多少数字让剩下的数字必不可能组成三角形。 保留的数字必定是1、2、3、5、8、13、21.....这样的数字。 //#define test #include<bits/stdc++.h> using namespace std; const i
        阅读全文
                
摘要:water //#define test #include<bits/stdc++.h> using namespace std; const int Nmax=1e6+7; typedef long long ll; struct LL { ll a,b; LL(){ } LL(ll aa,ll 
        阅读全文
                
摘要:构造一个n个数字的排列,使其作为 sigma( gcd( a[i] , a[i+1] ) ) 中第k小的排列。 因为题目给的 k*2 <= n ,所以可以知道只会询问最小到第 n/2 小,易得最多移动一个数字即可得到答案。 假设原始排列为1 2 3 ... n,如果询问最小直接输出排列,否则询问x且
        阅读全文
                
摘要:给两个数组a , b,并给一个间隔值p。问在间隔值p下b在中有多少个匹配。 比如a数组为1 2 2 4 3,b数组为1 2 3,那么在间隔值为2的情况下有一个匹配。 把a数组中可以作为开头的所有间隔数字比如2可以开头的数字是1或者2,3可以开头的数字是1、2、3取出来。 然后做p次kmp即可。 //
        阅读全文
                
摘要:给一个数字 n ,(1<=n<=1e18)。让你找一些数字加起来和为 n ,数字个数不超过50个而且数字都是回文数字。 每次找到大小最接近这个数的回文数即可。如6745888可以找到6745476,6960242可以找到6950595。 用大数模拟一下即可。 //#define test #incl
        阅读全文
                
摘要:给一棵树,q次询问,每次询问给连续的一个闭区间,问区间所有数的LCA是多少。 做一个dfs序,其中把dfs序最小的点和最大的点做一次LCA求出的点就是答案。 #include <bits/stdc++.h> #define lson l,mid,rt<<1 #define rson mid+1,r,
        阅读全文
                
摘要:给一幅无权无向无环图并给出它的一颗生成树,要求出一个最小割,并且最小割中有且仅有一条树边。 一条从u到v的非树边会让它从树上u到v路径上的边成为最小割的代价+1,所以考虑树链剖分把所有非树边作为更新来更新路径上边的代价。 因为只需要在最后找出最小的那条边,所以直接差分即可。 #include <bi
        阅读全文
                
摘要:给n个数,再给q次询问,每次询问回答区间[l,r]的a[l]%a[l+1]%a[l+2]%a[l+3]....%a[r]的答案。 可以知道只有当一个数遇到一个比它小的数答案才会改变且取模最多log次就会停止,所以用线段树暴力寻找一个数右边第一个比它小的数即可。 #include <bits/stdc
        阅读全文
                
摘要:给n个数,q次询问,每次问区间[l,r]的GCD以及整个区间内有多少个gcd为此的区间。 求区间gcd很好求,而有多少个这样的gcd,可以预处理出区间所有的gcd,因为一个n个数的区间最多有logn种gcd,所有暴力枚举即可。 #include <bits/stdc++.h> #define pb 
        阅读全文
                
摘要:逆序并查集 #include <bits/stdc++.h> #define pb push_back #define mp make_pair #define x first #define y second #define lson l,mid,rt<<1 #define rson mid+1,
        阅读全文
                
摘要:有一个有300个座位的圆,现在给出n个两个人间的座位信息,问有几个信息是错误的。 当一个信息和前面的信息矛盾被认为是错误的。 一个模300系的带权并查集。势能高的向势能低的树合并,合并时压缩路径并将相对于根节点的势能更新。 #include <bits/stdc++.h> #define pb pu
        阅读全文
                
摘要:每个信息给一个子区间[l,r]的和,问有多少信息是错误的。 子区间[l,r]的和可以知道是由r的前缀和减去l-1的前缀和。 所以presum[r]-presum[l-1]=sum[l,r]。所有可以把每个数字当成一个节点,两个节点间的势差为sum。 用并查集维护联通块及所有点与根节点的势差,那么如果
        阅读全文
                
摘要:一个城市有一个龙珠,每次两个操作,第一个操作把一个城市的龙珠移到另一个城市。 第二个操作询问第i个龙珠在哪个城市以及那个城市的size以及这个龙珠的转移次数。 用并查集维护一个联通块的size以及一个转换次数cnt。 每次合并联通块的时候把根节点的cnt++,然后在find的时候做压缩路径以及字节点
        阅读全文
                
摘要:给一个数,两个人轮流把这个切成k段并把k段加和给下一个人切,谁先无法切谁就失败。 dfs+博弈 具体看代码注释 #include <bits/stdc++.h> #define pb push_back #define mp make_pair #define x first #define y s
        阅读全文
                
摘要:一只老鼠从(1,1)出发每次最远只能水平或竖直移动不超过k个曼哈顿距离,且能移动到下一个点的条件是下一个点的权值大于现在这个点。 记忆化搜索。搜索状态是(行,列),直接四个方向上的k种移动方式枚举然后取max保存就好。 #include <bits/stdc++.h> #define pb push
        阅读全文
                
摘要:题意是把一幅图分成n层,在第x层的点可以去x+1层,x+1层的点也可以返回x层,花费为c。 再额外给m条边,问1到n的最短路。 建图的时候新建n个节点,每个节点表示第i层的顶点,顶点向第i层每个点连有向边,边权为0,同时原始点向其下一层和上一层的顶点连有向边,边权为c。表示这一层的点可以通过顶点花费
        阅读全文
                

 
         浙公网安备 33010602011771号
浙公网安备 33010602011771号