摘要:
看得出题目的直径也就是任意两点之间最短路的最大值,因此这是个多源汇最短路 而连接两个独立的区域,就需要取到最小值,然后跟每个集合的最大值进行取max #include<iostream> #include<string> #include<algorithm> #include<cmath> #de 阅读全文
摘要:
典型的树上求两点间距离最大值,lca的做法 这题要求同一个阵营,不妨先将同属一个阵营的先存进数组,之后每组进行比较 比较时取出深度最深的,因为这个一定是答案中两点中的其中一个答案,这是树的性质,不妨可以想一想 #include<bits/stdc++.h> using namespace std; 阅读全文
摘要:
这题和最短路计数差不多,只是多了个次短路判断,其实也是跟最短路一样是满足拓扑序的,也就是说不可能出队之后绕一个环回来次短路还变化了 因此也可以用迪杰斯特拉这种天然满足拓扑序的进行更新,只不过需要注意一下最短路和次短路的变化 #include<bits/stdc++.h> using namespac 阅读全文
摘要:
将括号拆掉其实就是维护两个求和 任取一个作为根节点,做两次dfs 考虑使用贡献来更新答案 而第二次dfs考虑这条边权的影响 #include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=2e5+10; c 阅读全文
摘要:
用单调栈来维护,并且维护两个数组,一个是某数现存的个数,一个是这个数是否已经在栈中 如果已在栈中,就不能操作,并且把个数--,因为如果这样操作,就会出现一个问题。 题目告诉我们每个数必须出现一次,举个例子 现在是 1 3 1 4 3 2,这样的序列 刚开始是1 3 ,如果我们操作1 ,因为3的数可以 阅读全文
摘要:
这题是单点修改和区间查询,因此想到用线段树求,问题是里面的因子个数的维护 显然不可能是先算出来再分解因子,因此我们想到唯一分解定理,也就是所有数都是某些质因数的倍数的乘积 并且每个数不超过10,10里面质数只有2 3 5 7 9,因此只需要维护这些值就行了,因此因数个数就是这个质因数的指数+1的乘积 阅读全文
摘要:
本题很容易看出在l和r中间和左边的都去l,其他都去r 之后我们可以二分出l在队列中的位置进行加减法,r同理 #include<iostream> #include<algorithm> using namespace std; const int N=1e5+10; int a[N],sum[N]; 阅读全文
摘要:
对于计数问题,如果对于dp,那么只要一路推过来就好。但是图内可能存在环,因此必须要想办法 我们可以发现是,这些环对答案没有影响,其实最短路的计数和dp的计数如出一辙 都是在拓扑序上进行。因此我们可以在端点往外bfs或者迪杰斯特拉,这样就能产生拓扑树 而答案就是这样更新而来。如果图中有负权,那么用sp 阅读全文
摘要:
这题主要问题是有些地方有钥匙,这种类型我们之前在bfs种做到过,就是用状压dp多枚举一维钥匙就行了,因为钥匙不需要时间,所以每次走到取完钥匙肯定是最优的 本题是二维的,不过转成一维更方便。我们的dis数组原先记录的是点,现在记录的是点和状态。建图是,先建门,将门与墙都插入一个set便于查询 建完这两 阅读全文
摘要:
因为这道题只能买卖一次,所以我们可以用dp的思想去分段,也就是以某个位置i作为分段点 从1-i能找到的最小值和从n-i能找到最大值,答案就是差值,因为两者没有约束。这样可以包含所有情况,虽然要重复。 问题是如何求去,因为本题有环,所以我们不能真的dp求,而dp其实就是dag的最x路,因此我们可以想到 阅读全文