摘要:
本题很容易看出在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路,因此我们可以想到 阅读全文
摘要:
这道题有负权边,本来考虑可以用spfa,但是这个算法被卡了,因此只能转换思路。 我们发现因为负权边是单向的,且没有环,而正权是有环的,这说明这个图是一块一块的,负权边就是联通块和块的,因此这构成一个DAG 我们考虑在块内部使用迪杰斯特拉算法而在块和块之间使用拓扑排序来做 #include<cstdi 阅读全文