摘要: 据说这个叫分层图最短路 是个常见套路 一般就是:有k次机会可以直接通过一条边,问起点与终点之间的最短路径 我的理解:就相当给dis和inque数组加了一维表示用了j次免费机会 然后在松弛的时候就有两种决策:1.走免费边 2.走要钱的边 8102年了 别写spfa了 cpp include defin 阅读全文
posted @ 2018-10-25 14:45 Patrickpwq 阅读(87) 评论(0) 推荐(0) 编辑
摘要: 好神奇的一道题 我们发现给白边加上权值后 跑MST后 选到的白边就越少 然后就二分这个加上的权值 不过边界好像有点恶心?不过没关系 思想最重要 cpp include define N 50005 define M 100005 using namespace std; struct Edge { 阅读全文
posted @ 2018-10-25 11:26 Patrickpwq 阅读(93) 评论(0) 推荐(0) 编辑
摘要: 好题 一开始想状压 但是转移根本无从下手 设f[i][j]表示i~j天的最低成本 可以想到从第i天到第j天要么不换方案,要么从第k天换一种方案,类似于floyd求最短路 就是 f[i][j]=min(f[i][j],f[i][p]+f[p+1][j]+k) 这是个区间dp 然后我们发现 对于题目中有 阅读全文
posted @ 2018-10-25 09:39 Patrickpwq 阅读(85) 评论(0) 推荐(0) 编辑
摘要: 显然最近的两个部落的距离是有单调性的 因此可以二分 考虑check 我们遍历所有点 先把 define N 1005 define eps 1e 6 using namespace std; template inline void read(T &x) { x=0; static char ch= 阅读全文
posted @ 2018-10-25 08:12 Patrickpwq 阅读(196) 评论(0) 推荐(1) 编辑
摘要: 子序列肯定不可能是无限长的 由于amax=1e8 nmax=2e5 kmax=1e5 则summax=1e8 2e5 1e5=2e18 而longlong刚好能hold住 那也就是说一个子序列里面非1的个数不超过64个(longlong范围是2^64) 那我们可以把连续的1缩成一坨 然后枚举每个点 阅读全文
posted @ 2018-10-24 22:06 Patrickpwq 阅读(232) 评论(0) 推荐(0) 编辑
摘要: 我们固定左端点 每当右边加入一个数 那么gcd肯定在原来的基础上丢掉某几个质因数 由于一个数最多有log个质因子 所以对于一个l gcd(l,r)不同的区间最多有log个 于是我们枚举左端点 二分寻找右端点 用线段树/st表查询一个区间里的gcd 再用哈希表更新 但是只能拿80分 区间是可合并的 用 阅读全文
posted @ 2018-10-24 17:43 Patrickpwq 阅读(112) 评论(0) 推荐(0) 编辑
摘要: 我们发现直接做dp是不行的 有后效性 又发现T是满足单调性的 想到二分 考虑check 先来想想如何确定一个区间内的数经过修改能否满足limit 我们肯定是要把这个区间内的数两两的差改的尽量递增地平均才行 写出式子就是 (a[j] a[i])/(j 1) define INF 0x3f3f3f3f 阅读全文
posted @ 2018-10-24 16:37 Patrickpwq 阅读(121) 评论(0) 推荐(0) 编辑
摘要: 容易想到贪心:吃饭慢的先打饭节约时间, 所以先将人按吃饭时间从大到小排序。 是可以证明无论怎么交换,都没有这样选优的。在这里由于我太菜了,就不写证明了 我们设dp[i][j]表示前i个人 在1号窗口打饭总时间为j 最早吃饭完的时间 那也就顺便可以推出在二号窗口的打饭总时间了 影响到当前dp[i][j 阅读全文
posted @ 2018-10-23 23:36 Patrickpwq 阅读(78) 评论(0) 推荐(0) 编辑
摘要: 好题 同样的 我们考虑把环展开成链来想 我们引入一个概念:关键点 即 环外边的起点终点 对于u,v两点 u,v的最短路,必定是 环外边+环上连续一段...这样的几个组合拼成的 其次我们发现 “环上连续一段” 是很费时间的 极大地拖慢了我们spfa的效率 那么我们似乎只需要对于相邻两个关键点连一条权值 阅读全文
posted @ 2018-10-23 21:47 Patrickpwq 阅读(77) 评论(0) 推荐(0) 编辑
摘要: 两个管道相交是啥情况? 有环展链 我们把环展成链过后 发现只会出现如下图两种情况 然后我们维护二维BIT1:表示左端点小于等于x 右端点小于等于y的个数 BIT2:左端点大于等于x 右端点小于等于y BIT3:左端点大于等于x 右端点大于等于y 查询就很简单了 对于操作1相当于一个更新 阅读全文
posted @ 2018-10-23 16:43 Patrickpwq 阅读(105) 评论(0) 推荐(0) 编辑
摘要: 我日哦 完全忘了前几天才做的星球大战(JSOI2008 这道题还有花椒麻你 告诉你是一棵树 迷惑你是树上算法 正难即反 考虑离线存下点 用并查集维护 先把没有被破坏的点连起来 当两个联通块将要merge的时候 这时总贡献加了他们的权值和之积(根据乘法分配率可得 简直和星球大战一模一样 cpp inc 阅读全文
posted @ 2018-10-23 15:46 Patrickpwq 阅读(98) 评论(0) 推荐(0) 编辑
摘要: 注意到x xor y 在二进制下1的个数是和x,y在二进制下1的个数有关 更具体的来说:一奇一偶是满足要求的 不加任何优化可以拿80分 O(nlogv) 我们又发现过程中会出现比较多的重复的数 因此可以记忆化一下 拿到90分 不过我们需要O(n)才能过 所以需要一个O(1)求x在二进制下的个数的方法 阅读全文
posted @ 2018-10-23 14:02 Patrickpwq 阅读(114) 评论(0) 推荐(0) 编辑
摘要: 考虑到颜色只有50种 所以我们开50棵线段树 然后对于每次询问 循环50次对于每一个颜色的线段树询问 那如何查询啊 你考虑到每次询问的最左边都是1 也就是说只需要对于每种颜色的纵坐标 维护往右出现过的点的横坐标的最小值 然后就是区间(y1,y2)查询最小值 判断是否超过了x 但是会MLE啊 所以动态 阅读全文
posted @ 2018-10-22 22:47 Patrickpwq 阅读(109) 评论(0) 推荐(0) 编辑
摘要: 首先我们知道一个数开7 8次方过后就歇逼了 那我们是否可以维护一个区间的flag标记 表示是否一个区间里的数都是一样的 那开根就到这儿就行了(似乎在口胡?) 然后我们看一组数据 2 3 2 3 2 3 然后整体加6然后开根号,又会变回2 3 2 3 2 3 相当于不会出现区间数字一样的情况了,这样就 阅读全文
posted @ 2018-10-22 21:03 Patrickpwq 阅读(102) 评论(0) 推荐(0) 编辑
摘要: 首先应该看得出是一个背包吧 那dp数组的第一维肯定有前i个物品 那第二维放啥呢?血量?高度?时间? 时间是完全可以排除的,因为牛肯定是在辣鸡刚掉下的时候就使用它,而且对于subtask1"如果卡门可以爬出陷阱,输出一个整数表示最早什么时候可以爬出",答案肯定刚好是某个辣鸡下落的时间 血量呢?设dp[ 阅读全文
posted @ 2018-10-21 23:18 Patrickpwq 阅读(81) 评论(0) 推荐(0) 编辑
摘要: 一开始直接搜索+剪枝,拿了50分,发现原来是搜索搜复杂了..因为搜索是可以过的 注意到题目中有一句''再回过头来关掉另一边的路灯,而事实并非如此,因为在关的过程中适当地调头有可能会更省一些",也就是说老王是在沿着某个方向走着走着突然转向,而不是毫无逻辑的,我之前写的搜索枚举就是毫无逻辑的 cpp f 阅读全文
posted @ 2018-10-21 16:24 Patrickpwq 阅读(75) 评论(0) 推荐(1) 编辑
摘要: 一开始思路走偏 一直在想肯定与第几次取数有关 然后做了半天没做出来 看了题解才恍然大悟 原来有个性质“可以每行分开来做 最后加起来就好了” 那就变成了一个区间DP 我们设dp[i][j]表示从i到j闭区间的最大价值。(只考虑当前行) 那么dp[i][j]肯定是从i的右边/j的左边转移来的 则有dp[ 阅读全文
posted @ 2018-10-21 11:20 Patrickpwq 阅读(172) 评论(0) 推荐(1) 编辑
摘要: 没错我搬家了 阅读全文
posted @ 2018-10-20 23:42 Patrickpwq 阅读(68) 评论(0) 推荐(0) 编辑
摘要: "传送门QWQ" dp[i][j][h][l] 表示在点 (i,j),差值为h,小A还是uim取液体的方案数(0:小A 1:uim) 转移方程: dp[i][j][h][1]+=(dp[i 1][j][(h a[i][j]+k)%k][0]) dp[i][j][h][1]+=(dp[i][j 1][ 阅读全文
posted @ 2018-10-19 21:40 Patrickpwq 阅读(75) 评论(0) 推荐(0) 编辑
摘要: 对于不属于一个联通块的x,y,现在想要联通他们 则ans[y]=min(ans[x]+ans[y],max(edge[i].val,max(maxa[x],maxa[y])) min(minb[x],minb[y])); 前一种情况指他们俩各自占领各自的 后一种指一起占领 那么a[i]肯定取max, 阅读全文
posted @ 2018-10-19 17:06 Patrickpwq 阅读(270) 评论(0) 推荐(1) 编辑
摘要: 对于左移加:其实就是解方程 由于i已确定 可以预处理出逆元 对于右移异或 可以直接模拟 因为前面一坨不会变 cpp include define uint unsigned int using namespace std; int main() { ios::sync_with_stdio(fals 阅读全文
posted @ 2018-10-19 16:16 Patrickpwq 阅读(119) 评论(0) 推荐(0) 编辑
摘要: 考虑到当前能否选择这头牛 是与上次选哪头牛有关的 因为要满足差值大于k 所以记录一下last 表示选了哪一头牛 然后记忆化一下 有两个坑点 1.注意取绝对值 2.要枚举开头的那头牛 决不能直接dfs(0,0,0) 因为第一头牛与0的差值不一定大于k(或者初始化一下a[0]= INF也阔以) 这里提供 阅读全文
posted @ 2018-10-18 23:08 Patrickpwq 阅读(77) 评论(0) 推荐(0) 编辑
摘要: 维护一个区间的包含最左的元素的LCIS,包含最右元素的LCIS,以及整个区间的LCIS, 然后pushup的时候就更新这三个值就行了。注意要考虑左右儿子可以“接”起来的情况等等 查询的时候要注意,也要考虑左右可以“接”起来时候,不过还要注意,有可能左右儿子边界的已经“越界了”,就是超过了查询范围,还 阅读全文
posted @ 2018-10-18 20:43 Patrickpwq 阅读(85) 评论(0) 推荐(0) 编辑
摘要: DFS策略:对于当前状态,枚举下一个选哪个(i),如果当前耗时已经超过i的死亡线,ans就累积 然后可以记忆化当前状态标记为true 之后扫到这儿就return 代码不是A的。。和几份题解都对拍了半天没找出问题 如果能指出错误的话请评论 cpp include define N 17 define 阅读全文
posted @ 2018-10-18 16:37 Patrickpwq 阅读(142) 评论(0) 推荐(0) 编辑
摘要: "传送门" 我们记录pos1 pos2 pos3 分别代表现在字符串1,2,3的位置 然后判断pos1是否等于pos3 或者pos2是否等于pos3 分别进行dfs 然后我们发现是可以记忆化的 比方当pos1=pos3且pos2=pos3 那会先搜索pos1+1 那么在这一次的dfs 有可能就 提前 阅读全文
posted @ 2018-10-18 14:45 Patrickpwq 阅读(147) 评论(0) 推荐(0) 编辑
摘要: 我们直接在dfs的时候顺便建主席树 维护一个节点到根路径上的节点出现情况 对于查询(u,v) 用u点的主席树+v点的主席树 lca(u,v)的主席树 lca(u,v)父节点的主席树,在这样产生的主席树上查找第k小的排名,最后输出它原来的点权。 lca我选择了树链剖分 cpp include defi 阅读全文
posted @ 2018-10-18 14:03 Patrickpwq 阅读(111) 评论(0) 推荐(0) 编辑
摘要: 先打一个最裸的暴力再优化 10分代码 cpp // luogu judger enable o2 include define N 105 using namespace std; int n,m,a[N][N],true_ans,choose[N]; //n束花 m个瓶子 vector q; vo 阅读全文
posted @ 2018-10-18 11:08 Patrickpwq 阅读(179) 评论(0) 推荐(0) 编辑
摘要: https://blog.csdn.net/linkfqy/article/details/72861176 阅读全文
posted @ 2018-10-18 10:01 Patrickpwq 阅读(92) 评论(0) 推荐(0) 编辑
摘要: 解法1 玄学剪枝 最暴力的dfs是很好打的 交上去有70 考虑如何剪枝 1.当一个单词首尾和另外一个单词相同时,优先选择最长的那个,其他的不用选。 这一点很好实现,给原数组排个序,dfs的时候写个while特判一下就好 2.卡时自杀式剪枝 你懂我意思吧 以上两个剪枝随便加一个都可以过。。。 解法2 阅读全文
posted @ 2018-10-17 23:09 Patrickpwq 阅读(290) 评论(0) 推荐(0) 编辑
摘要: 其实就是一张图 可知每个点出度为一 由于有环 所以把整个图缩点后会好做得多 在缩点后 每个强联通分量的出度至多为一。 然后我们dfs 直接搜很危险 考虑记忆化 设ans[i]代表第i个强连通分量的答案就好了 详见代码 cpp // luogu judger enable o2 include def 阅读全文
posted @ 2018-10-17 21:34 Patrickpwq 阅读(103) 评论(0) 推荐(0) 编辑
摘要: f[i][j]: i表示整个图走没走过的状态 j表示当前到了第j个点 存的值就是在这种情形下 可以走到的地方的状态 dp[i][j]:i表示整个图走没走过的状态 j表示当前在j点 访问剩余能去到的点的方案数 因此只需要跑一遍DFS就好了 cpp include define int long lon 阅读全文
posted @ 2018-10-17 17:53 Patrickpwq 阅读(261) 评论(0) 推荐(0) 编辑
摘要: 期望是有线性性质的 考虑每个点的概率 由于一个点的子树放了后 它就不能再放了 换句话说 这个点是子树中第一个通电的 也就是说这个点的通电概率是$\frac{1}{size[i]}$ 题目中又说了每个点的编号大于儿子们 于是就不用dfs了 只需递推即可 把所有点的概率相加 那还要求出逆元 这里提供一种 阅读全文
posted @ 2018-10-17 16:13 Patrickpwq 阅读(96) 评论(0) 推荐(0) 编辑
摘要: 用dp[i]来表示状态i下的最优方案,dis[j]表示j到根节点的距离(题目中所描述的K)用dfs来更新答案 cpp include include define INF 2139062143 define N 12 define M 1005 using namespace std; int g[ 阅读全文
posted @ 2018-10-17 13:07 Patrickpwq 阅读(65) 评论(0) 推荐(0) 编辑
摘要: 对于询问[i,j] 在[1..n]中我们看看小于mid的数字有多少个,显然如果个数的两倍 define N 500005 using namespace std; int n,m,a[N],rt[N 100],lson[N 100],rson[N 100],tot,sum[N 100]; void 阅读全文
posted @ 2018-10-16 23:46 Patrickpwq 阅读(90) 评论(0) 推荐(0) 编辑
摘要: 这是一道好题 可以更深的理解主席树 最初的想法是 一开始 一边加入任务 一边维护时间轴 换句话说 对于每个时间点 我们都想维护一颗权值线段树(这里的权值代表着优先级Pi)相当于对于一个任务 我们要维护Ei Si棵 然而显然MLE 考虑降维 联想到主席树建树方式是通过前缀和来的 既然是求前缀和 这道题 阅读全文
posted @ 2018-10-16 22:24 Patrickpwq 阅读(134) 评论(0) 推荐(0) 编辑
摘要: 几个月没打了...全忘光 记得之前写过一篇主席树入门教程 https://blog.csdn.net/Patrickpwq/article/details/80315358 显然里面的代码丑的不能看 重发一个代码 主席树推荐不要写结构体 cpp // luogu judger enable o2 i 阅读全文
posted @ 2018-10-16 20:38 Patrickpwq 阅读(70) 评论(0) 推荐(0) 编辑
摘要: 我们先考虑如何比较两两的字符串 我们可以用线段树来维护哈希值 在线段树上根据二分的性质来做即可 又考虑到 每颗线段树是在之前的某颗基础上只修改了一个节点 那显然就想到了主席树 另外说说如何pushup 我们考虑这样一个字符串 abcdefg 假设当前节点左儿子是abc 右儿子是defg 由于我们的哈 阅读全文
posted @ 2018-10-16 17:32 Patrickpwq 阅读(118) 评论(0) 推荐(0) 编辑
摘要: 其实就是要求最小的环套树森林 我们现在只考虑如何合并 设当前边的两个端点是x,y 若x,y在一个联通块里 那这个联通块要么是树 要么是环套树 假如是个环套树 加一条边后必定变成两个环 不符合要求 假如是个树 加一条边就变成了换套树 符合要求 若x,y不在一个联通块里 假如同为环套树 加一条边后必定变 阅读全文
posted @ 2018-10-16 16:15 Patrickpwq 阅读(155) 评论(0) 推荐(0) 编辑
摘要: 整理题意后 对于每个询问其实就是 由于C(m,n)=C(m,m n) 就变成了 其实就是在杨辉三角上的一列求其中的一段和 然后有个玄学的公式 什么意思呢 证明是很容易得到的 所以把阶乘预处理出来 由于1e9+7是质数 可以用费马小定理算逆元 就可以O(1)回答 cpp include define 阅读全文
posted @ 2018-10-16 15:26 Patrickpwq 阅读(110) 评论(0) 推荐(1) 编辑
摘要: 思路:我们先判断这两条直线是否平行 若平行 再去判断是否重合 若不平行 算交点 具体实现:对于平行 我们直接判断v1,v2的叉积(v1,v2是来表示L1,L2的向量)是否为0 对于重合 我们把l1上的端点p1代入l2 判断叉积 如图 只需判断v1,v2的叉积是否为0 ,可以画个重合的图自行理解 对于 阅读全文
posted @ 2018-10-15 23:06 Patrickpwq 阅读(354) 评论(0) 推荐(0) 编辑