![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
ACM
文章平均质量分 65
Difstpoftf
这个作者很懒,什么都没留下…
展开
-
hdu5510B - Bazinga(KMP+剪枝)
题意:给你n个串,求符合条件的i,前i-1个串不是i的子串。。求i的最大值。思路:刚开始想的是跑n遍ac自动机,对前i-1个串建trie树。但是串的长度最大为2000,爆内存了。。直接从第n个串暴力kmp的话会超时。。队友想了一种剪枝,从第1个串开始KMP,如果前面有某个串x是当前串y的子串的话,那么之后就不用匹配x了,因为匹配y串就想到于匹配了x串。。过了。。但是如果给你500个原创 2017-10-08 13:52:58 · 302 阅读 · 0 评论 -
hdu5521M - Meeting(最短路)
题意:有n个点,m个关系;对于每个关系,输入t,s,接着输入s个数,表示这s个数俩俩之间有边且权值都为t。两个人分别从同时1,n出发,问两人相遇所耗的最短距离,相遇只能在结点上相遇,且若两人走到距离不同则取最大的。求出所有符合条件相遇时的结点,若没有,则输出Evil John,若有多个,则按字典序最小输出所有可行结点。思路:以1为起点跑最短路,记录每个点的距离disx,然后以n为起点跑原创 2017-10-08 13:07:44 · 340 阅读 · 0 评论 -
codeforces 869C. The Intriguing Obsession(组合数学)
题意:有三种岛屿,数量分别为a,b,c;任意两个岛屿可以最多建一座桥(桥长度为1),问你有几种建桥方式;限制条件:同种岛屿要么无法达到,要么距离至少为3;限制条件可以理解为:1.同种岛屿之间不能有桥;2.同种岛屿不能同时连着同一个岛屿;因为条件1,所以建桥可以分三步,a与b的建桥情况,b与c的建桥情况,a与c的建桥情况///////////即每种岛屿的每个岛屿与另一种的每个岛屿原创 2017-10-07 20:26:33 · 371 阅读 · 0 评论 -
2017南宁网络赛M.Frequent Subsets Problem (状态压缩)
题意:给你一个全集U,元素为1~n;再给你m个模板集(为U的某一子集);和一个概率a;让你求U的所有子集中,在m个模板集中出现的概率大于等于a的子集个数;例如:全集为1234,有两个模板集,分别为{1,2},{1,2,3};概率a为1,那么符合条件的子集有,{1},{2},{1,2};如果概率a为0.5,那么符合条件的除了之前的还有{3},{1,3},{2,3};思路:因为n小于等于2原创 2017-09-28 15:47:50 · 305 阅读 · 0 评论 -
2017南宁网络赛J.Minimum Distance in a Star Graph(bfs求最短路)
题意:给你一个n维空间,有n!的节点,节点编号为n的全排列,每个节点num与n-1个节点相连(这n-1个节点的编号分别为num的第一位与后面n-1位交换的数,例如1234与2134,3214,4231相连)思路:bfs求最短路,由于节点的数比较大,用map离散化节点就好了。最好根据题意模拟一下相连的边。代码:#include using namespace std;typ原创 2017-09-28 09:50:50 · 157 阅读 · 0 评论 -
2017南宁网络赛L.The Heaviest Non-decreasing Subsequence Problem (最长非递减子序列)
题意:给你一个序列。对于每个元素,如果他的值小于0,那么他的权重为0;如果他的值大于等于10000,那么他的真实值减去10000,且他的权重为5;否则他的权重为1。求一个元素值非递减的序列,使得权重值最大。思路:根据要求重新构建一个序列,小于0则不加入,大于等于0且小于10000加入1次,大于10000加入5次。然后用nlogn的方法求最长上升子序列即可。代码:#inclu原创 2017-09-27 21:33:21 · 329 阅读 · 0 评论 -
2017南宁网络赛F.Overlapping Rectangles(扫描线法+线段树)
题意:给你直角坐标系上的n个矩形,求其覆盖的总面积。思路:屏幕面积并问题,离散坐标后,用线段树实现扫描法。我对扫描法的一点理解:就是从高度最低开始扫描,用线段树维护当前高度向上的有面积覆盖的总长度,然后一层一层的求面积。代码:#include using namespace std;const int maxn = 1000+7;int n,cnt,num[ma原创 2017-09-27 20:37:38 · 162 阅读 · 0 评论 -
2017南宁网络赛B.Train Seats Reservation(初级扫描)
题意:有100个站点,给你n个乘客流入情况,每个乘客在车上时需要一个座位,求最少需要布置多少座位。思路:因为只有100个站点,所以直接模拟上车下车的情况,上车座位加k,下车座位-k,然后从头遍历一遍站点,求出最大的座位量即可。代码:#includeusing namespace std;int num[101];int main(){ int n; w原创 2017-09-26 15:01:01 · 180 阅读 · 0 评论 -
codeforces864D. Make a Permutation!(贪心)
题意:给你一个长度为n的序列,元素大小为1~n。让你修改某些元素值,使得整个序列出现的元素不重复(修改值范围为1~N);求在修改操作数最少的前提下,使得修改后的序列字典序最小,思路:贪心;由题意知道修改操作最少为1~n没出现过的数的个数。要使得字典序最小,那么就要从头部开始插入,平且插入可选的最小值t(可用优先队列预处理)。当某个位置的数num出现次数大于二,那么可进行插入判断。两原创 2017-09-26 14:23:12 · 578 阅读 · 0 评论 -
hdu1533(KM算法逆向版)
思路:把边取负,跑最大权km算法,得到的答案取负即可。代码:#include using namespace std;const int maxn = 103;const int inf = 0x3f3f3f3f;int w[maxn][maxn],lx[maxn],ly[maxn],slack[maxn],link[maxn],visx[maxn],visy[maxn],a原创 2017-09-26 12:13:40 · 324 阅读 · 0 评论 -
hdu2255(KM算法模板)
题意:n个人选n个房子,每个人对每个房子分别有一个出价。一个人只能买一个房子,求最大利润。思路:带权二分匹配问题,可以用最大费用流做,但是km算法更高效。代码:#include using namespace std;const int maxn = 303;const int inf = 0x3f3f3f3f;int w[maxn][maxn],lx[maxn],l原创 2017-09-25 21:22:05 · 238 阅读 · 0 评论 -
hdu2063(最大权匹配匈牙利算法模板)
题意:有m个女生和n个男生,k个可以建立关系。一个女生只能和一个男生建立关系,求最大的关系数。思路:二分图最大匹配,匈牙利算法枚举男生来找增广路,如果能找到,匹配数加一。代码:#include using namespace std;const int maxn = 505;vector g[maxn];int link[maxn],vis[maxn];int k,原创 2017-09-24 20:48:08 · 217 阅读 · 0 评论 -
hdu1533(最小费用最大流spfa模板)
题意:n个人,进n个房子,每走一格花费1元,每个房子只能进一人,求所有人进房子的最小花费。思路:建立网络图,设置大源点和大汇点。跑mcmf;代码:#include using namespace std;typedef long long ll;const int maxn = 400;const int maxm = 200000;const int inf =原创 2017-09-24 14:38:03 · 508 阅读 · 1 评论 -
hdu6214Smallest Minimum Cut(最小割的最小割边数,dinic模板)
题意:给你一个有向图,求最小割的最小割边数。思路:上网搜到两种方法,其中一种是错的,因为最小割的割边一定为满流,但满流的边不一定是最小割的割边。还有,用ford-fulkerson算法会超时,,所以套了个dicnic的模板代码:#include #include #include #include using namespace std; const int Ni原创 2017-09-23 11:43:28 · 248 阅读 · 0 评论 -
hdu3549(最大流ford-fulkerson模板)
题意:给你一个有向图,源点为1,汇点为n,求最大流。思路:ford-fulkerson模板代码:#include using namespace std;const int maxn = 20;const int inf = 0x3f3f3f3f;class edge{public: int to,cap,rev; edge(int t,int原创 2017-09-22 20:16:22 · 218 阅读 · 0 评论 -
2017乌鲁木齐网络赛F.Islands(强连通分量模板题)
题意:给你一个有向图,让你添加最少的边,使得这个图任意两个点互相可达。思路:求强连通分量,缩点,求出缩点后的图的出度为0的点的个数c1,入度为0的点的个数c2.根据题意,只要添加线,使得不存在出度为0和入度0的点即可所以最少需要max(c1,c2);注意特判强连通分量为1的情况。代码:#include using namespace std;const int max原创 2017-09-22 10:47:26 · 238 阅读 · 0 评论 -
2017.09.17有感
当断不断,必受其乱。时不我待,只争朝夕。原创 2017-09-17 11:47:43 · 171 阅读 · 0 评论 -
dijkstra模板
用dijkstra算法时,求最短路,不能存在负权边;求最长路时,不能存在正权边(((贪心思想;代码:struct edge{ int to,val,next;}e[maxm];int vis[maxn],head[maxn],in[maxn];ll dis[maxn];int n,m,cnt;void add(int u,int v,int val){原创 2017-09-13 17:21:06 · 182 阅读 · 0 评论 -
hdu6201transaction transaction transaction(最长路spfa vector模板)
思路:把点权化成边权,跑最短路,这题卡常数了,必须用vector版的邻接表跑spfa才能过。代码:#include using namespace std;typedef long long ll;const int maxm = 1e5+7;const int maxn = 1e5+7;const ll inf = 0x3f3f3f3f3f3f3f3f;struct E原创 2017-09-13 14:57:27 · 205 阅读 · 0 评论 -
2017乌鲁木齐网络赛 skiing(spfa/bellman最长路模板题)
题意:给你一个有向图,让你求整个图可以跑出的最长路。思路:对每个入度为0的点跑一遍最短路,每次跑都记忆化。最后遍历一遍最大值。代码:#include using namespace std;typedef long long ll;const int maxm = 1e5+7;const int maxn = 1e4+7;struct edge{ int原创 2017-09-12 21:28:03 · 221 阅读 · 0 评论 -
hdu6198 number number number(矩阵快速幂模板题)
题意:给你一个斐波那契数列,和一个k,能被k个斐波那契数(可重复)正好相加的数为good,否则为bad。在给定的k的前提下,让你求最小的bad数。思路:在稿纸上写个斐波那契数列,并推出前几个k的答案,发现所求值为第k*2+3项斐波那契数减1。然后用矩阵快速幂求斐波那契数即可。(((自己手写的矩阵快速幂渣爆了,copy了大腿的模板。。代码:#includeusing names原创 2017-09-12 17:51:25 · 180 阅读 · 0 评论 -
hdu6197array array array(最长上升子序列二分版)
题意:给你一个长度为n的数组;问你能不能在删除k个元素后,使得数组变为一个非增序列或者非减序列。思路:1.记录dp[i]为以第i个元素为结尾的最长非增(减)子序列。时间复杂度O(n*n);这题数据范围T了;代码:#include using namespace std;const int maxn = 1e5+7;int dp1[maxn],dp2[maxn],arr原创 2017-09-11 20:56:08 · 202 阅读 · 0 评论 -
hdu6092Rikka with Subset(dp+思维)
题意:让你求一个长度为n的数组,这个数组的每个子集的和为a,a的范围为0~m,,现在给你0~m中每个数出现的次数。求出这个长度为n的数组。思路:先求出数组中有几个0,发现0的个数为log(0出现的次数),那么1的个数就为 1出现的次数/0出现的次数 然后根据1的个数,来更新能凑出和为1~m的个数,记dp[i]为已知的数能凑出多少个和为i的数,每得到一个数,就更新一次dp数组,因为为原创 2017-09-06 20:03:58 · 148 阅读 · 0 评论 -
hdu6162 Ch’s gift(LCA)
题意:给你一棵树,每个节点有一个价值,要执行m次询问,每次询问输入四个数,s,t,a,b,求解s到t的最短路,并把路径上节点的价值在[a,b]之间的价值求和输出。思路:对每组询问,求LCA(开始询问前先以1为根节点dfs一遍,确定每个节点的高度,开始每组询问时,根据高度差迭代求lca,详情看代码),并在求解过程判断价值符不符合要求。代码:#include using nam原创 2017-09-05 20:23:58 · 280 阅读 · 0 评论 -
codeforces851C. Five Dimensional Points(暴力/思维)
题意:给你几个五维空间上的点,问你有几个好点,好点定义:任意其他两个点与该点的夹角不为锐角。思路:1.只要判断为坏点后马上break,暴力能过。。(我天,,我当时没敢写,看来以后遇事不决先暴力优化一发试试)2.只要n>11这个空间上必定没有好点,因为五维空间理论上只有5条互相垂直的直线,若一个点为好点,该空间最多只有11个点(五条垂线的交点为好点,其他的点分别在每条垂线上,即5原创 2017-09-05 16:48:31 · 573 阅读 · 0 评论 -
codeforces 842C. Ilya And The Tree(dfs)
题意:有n个节点标号1~n,每个节点有一个正整数价值,这几个节点形成了一棵以节点1为根节点的树,求根节点到节点x的路径上所有节点价值的gcd(你可改变这条路径上某个节点的的价值为0,或者不做任何修改);思路:从根节点开始,求每个节点可能的gcd,用set维护这些gcd。则每个节点的可能的gcd必包括 其父节点的gcd与当前节点的价值的最大公因数。但漏了一种情况,不修改从根节点到当前节点原创 2017-09-03 16:25:34 · 248 阅读 · 0 评论 -
codeforces 848A From Y to Y(思维)
题意:给你一个整数K,求出一个字符集,这个字符集经过最优的合并后,合并的花费恰好等于K。思路:样例给的答案让我以为这题很复杂,,但发现一个长度为n的只有一种字符的字符集,最优合并后的花费为n*(n-1)/2,,所以只要找出不同的字符集的(不同的字符集,合并时不需要花费),使得他们的和为k就行了。代码:#include using namespace std;int ma原创 2017-09-02 20:44:05 · 272 阅读 · 0 评论 -
codeforces 849B Tell Your World(计算几何)
题意:给你一个直角坐标系,上面有n个点,问你能不能画两条不重合的平行线,使得每条平行线至少经过一个点,且所有的点都在其中一条平行线上。思路:提取前三个点,根据题目要求,这两条线其中一条必经过前三个点中至少两个点。所以可以枚举第一条平行线,找有没有符合条件的另一条平行线。代码:#include using namespace std;typedef long long ll原创 2017-09-02 19:33:50 · 343 阅读 · 0 评论 -
BZOJ4690 Never Wait for Weights(带权并查集模板题)
题意:一共有n个物品;输入:? a b w 表示b比a重w,! a b 表示输出b比a重多少;思路:对每个? a b w;建立a、b的并查集,维护dis数组。dis[x]表示x比x的父亲fa[x]重多少;代码:#include using namespace std;int fa[100100];long long dis[100100];int n,m;int原创 2017-09-01 20:42:12 · 193 阅读 · 0 评论 -
CodeVS 1082 (区间修改+区间查询树状数组模板)
题意:两种操作:1.区间修改2.求区间和参考博客:http://blog.csdn.net/fsahfgsadhsakndas/article/details/52650026代码:#include using namespace std;typedef long long ll;const int maxn = 2e5+7;ll arr[maxn],c1[max原创 2017-08-31 21:58:05 · 296 阅读 · 0 评论 -
codeforces 842 A. Kirill And The Game(阅读题)
题意:给你两个区间[L,R].[X,Y],,和一个整数k。求是否能从第一个区间中取一个整数a,第二个区间取一个整数b,使得a/b恰好等于k。思路:由于a,b,k为整数,为避免a/b自动取整问题,,所以要判断b*k等于a。。但是不能直接判断[k*x,k*y]与[[l,r]是否有交集来判断存不存在,,因为这两个区间是不连续的,只能取整数。hack数据:70 70 1 50 50代码原创 2017-08-30 11:55:35 · 573 阅读 · 0 评论 -
CodeForces - 383 C. Propagating tree(dfs序+线段树/树状数组)
题意:有n个结点,标为1~n,,形成了一棵以1为根节点的树,有m个操作,,操作有两种:1。某个节点的值加上v,该节点的隔代都加上v,,该节点的子代以及子代的隔代都减去v。2。查询某个节点的值。n,m如果修改节点值直接暴力dfs的话,时间复杂度为O(n*m),显然超时。可以看出,修改操作,其实是修改两个区间的值,,,那么可以想到线段树区间修改,lazy一下时间就可以优化到原创 2017-08-29 17:29:38 · 310 阅读 · 0 评论 -
gym 101492 A. Comunicating the Tibet(dfs遍历无向图)
题意:输入n,m,k;分别代表n个节点,m条边,每个节点的取值范围(1~k的正整数)。让你给每个节点赋值,使得每个节点和相连的节点的值不相同。思路:一个一个节点赋值,暴力枚举赋值,赋值时考虑周围的节点有没有冲突。。。。但是不能1~n的取节点赋值,,只能从节点1开始dfs遍历图赋值(即每赋值一个节点,必须马上考虑该节点周围的值,才能保证得到最优策略)给出一组数据4 3 21原创 2017-08-28 15:15:33 · 539 阅读 · 0 评论 -
Gym - 101492 E. Teamwork(过河问题)
题意:n个人要从a到b,每个人过河需要的时间不同,,只有一根绳子,每次过河需要一根绳子,每次最多只能同时过两人,,,如果同时过两人,过河时间取两人中最大的。思路:按过河时间排序后有两种最优策略:1.最轻的带最重的过去,2.两个最轻的带两个最重的过去每次判断两人,比较两种策略哪个更优。代码:#include using namespace std;typed原创 2017-08-27 19:48:04 · 748 阅读 · 0 评论 -
Aizu - 2784Similarity of Subtrees(树哈希)
题意:给你一棵树,问有多少对相似的子树(每层深度拥有相同数量的节点)。思路:将每棵树通过hash函数映射出一个值,Hash(T)= (n1+n2P+n3P2+…+nmPm−1) % MOD /////////ni表示当前子树深度为i的节点有几个。相当于将一棵树转化成一个p进制的整数。代码:#include using namespace std;typedef原创 2017-08-26 20:14:39 · 206 阅读 · 0 评论 -
hdu4355Party All the Time(三分查找模板题)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4355思路:看完题没证出所求值在区间内是单峰函数。但是看到这种在连续区间上求最值的,应该就要想到二分或三分,而所求值必不可能在区间上是单调的,所以三分试试(三分可求单峰函数最值)。代码:#include using namespace std;const double esp原创 2017-08-26 14:59:50 · 560 阅读 · 0 评论 -
UVALive 6694 - Toy Boxes(枚举+三分)
题意:给你n件物品,每件物品都有重量Wi,分在三个箱子里,每个箱子至少一件物品。求总费用最少(每个箱子费用=箱子总重量*箱子内物品总数)。思路:先按升序排序,若把物品分成总量连续的两份,以对称轴位置为x轴,费用为y轴,画出图形是一个单峰函数。高效率求单峰函数最值可以想到三分,但题目要求分成三份,所以要有两个对称轴,这时可以枚举第一个对称轴,求第二个对称轴。时间复杂度O(nlogn)原创 2017-08-26 13:44:00 · 254 阅读 · 0 评论 -
hdu6180Schedule(贪心+set)
题意:给你一些时间区间,时间区间内的时间点必须要有机器工作,并且重合的区间必须要由不同的机器工作,问用最少的机器数,并且在这个最小机器数的前提下所花费的最小的时间和思路:贪心:按左端点升序排序,一个一个加就好。但是加机器操作这个多校时没有模拟出来,后来知道set里竟然也有upperbound。代码:#include using namespace std;typedef原创 2017-08-25 18:06:08 · 287 阅读 · 0 评论 -
hdu6181Two Paths(次短路模板题)
思路:裸的次短路题,多校的时候直接网上找了个模板,改了改范围和变量类型就1a了,看来很好用,直接盗取了=。=代码:#include #include #include #include #include #include #include #include #include #define MEM(a,x) memset(a,x,sizeof a)#define原创 2017-08-24 20:40:42 · 354 阅读 · 0 评论 -
hdu6178Monkeys(bfs+输入挂模板)
题意:给你一颗树,删除最多的边,使得k个猴子能落在n个结点上(每个猴子所在的节点周围至少连着一个有猴子的节点)思路:要使得剩下的边最少,那么两个点只配一条边是最优的,计算出这种边的最大条数,如果这些边不够连接k个猴子,那么每剩下一个猴子就要多加一条边。所以只要从度数为1的节点开始找,bfs一下就好。多校的时候认为这个思路没错,不管怎么优化就是疯狂tle,换了一个快的但是不一定对原创 2017-08-24 20:31:16 · 619 阅读 · 0 评论