随笔分类 -  高质量难题

摘要:超妙的树形dp一个递归,一个递推f[i]表示i结点往下走的最远距离,g[i]表示往上走的最远距离f[i]=max(f[j])+i->v;g[i]=max(g[pa],f[e[pa]->n]+e[pa]->v)+i->v; #include <iostream> #include <cstdio> # 阅读全文
posted @ 2020-03-27 22:08 WeiAR 阅读(494) 评论(0) 推荐(0) 编辑
摘要:先跑一遍spfa,这样就排除了小于k条边的情况。枚举那k条边中最小的边权,然后让所有的边都减去它,接着跑spfa,然后在加上k*v[i] #include <iostream> #include <cstdio> #include <queue> #include <algorithm> #incl 阅读全文
posted @ 2020-03-25 21:24 WeiAR 阅读(231) 评论(0) 推荐(0) 编辑
摘要:让最大值走得最多就好了,让最大值走最长链的长度,然后把最长链上的点都打上标记,再从所有没有被标记的点里找次长链,让次大值跑这个题我最后一小时写慌了,思路乱了,队友写得很妙,tql #include <iostream> #include <cstdio> #include <queue> #incl 阅读全文
posted @ 2020-03-25 20:28 WeiAR 阅读(382) 评论(0) 推荐(0) 编辑
摘要:https://codeforces.com/contest/1301/problem/B如果填的这个数特别大,显然不优,如果数特别小,也不优,所以它是凸函数,可以二分(整数单峰函数二分模板题 #include <iostream> #include <cstdio> #include <queue 阅读全文
posted @ 2020-03-20 15:45 WeiAR 阅读(263) 评论(0) 推荐(0) 编辑
摘要:是一个单调队列优化dp的典型例子。f[i]=min(f[j])+1,从[i-k,i-1]中转移过来,维护单调递增的队列,每次取队首元素+1就好了。转移分两种情况,[0,i]或者[i-k,i]这个区间里全是01交替的,那么你只能选f[i-1]也就是最大的,取队尾元素就可以了;否则取队首。 #inclu 阅读全文
posted @ 2020-03-11 21:33 WeiAR 阅读(103) 评论(0) 推荐(0) 编辑
摘要:Swimming Balls https://vjudge.net/contest/318752#problem/J如果直接算,各种球的情况都不清楚,因为放一个球之后,水位的变化也会影响之前放入的球,不如,二分最终的水位高度,这样每个球的贡献就有了 阅读全文
posted @ 2019-08-19 10:34 WeiAR 阅读(139) 评论(0) 推荐(0) 编辑
摘要:Gym100889Lhttps://vjudge.net/problem/341988/origin题目大意:有一个n*n的图,m条双向边(没有重边自环),求从每个节点出发走k条路后到其他所有节点的最短距离和方案数,方案数取模1e9+7输出做法:传递闭包,走k条路,就是做k次矩阵乘法,所谓矩阵乘法就 阅读全文
posted @ 2019-07-31 23:13 WeiAR 阅读(156) 评论(0) 推荐(0) 编辑
摘要:poj3417lca+差分每加入一条新边就会形成一个环,这个环上除了新边都会被覆盖一次,断掉覆盖一次的边再断了覆盖它的新边就能把树分成两部分。对于被覆盖数大于1次的边,就得至少断两条新边,对答案就没有贡献了。对于没有被覆盖的,对答案贡献为新边的数量,覆盖为1的,贡献为1,再否则为0。d[x]表示节点 阅读全文
posted @ 2019-07-24 12:09 WeiAR 阅读(291) 评论(1) 推荐(0) 编辑
摘要:poj3463大意:统计最小的长度个数+统计最小的长度+1的个数,大概就是求最短路和次短路的条数更新的时候有5种情况,有个细节就是它得是二维的,一个表示节点编号,一个0/1表示它是次短路的还是最短路的,把结构体扔到队列里。需要更新的就是4种情况。w<最小值w=最小值w<次小值w=次小值 阅读全文
posted @ 2019-07-21 22:42 WeiAR 阅读(123) 评论(0) 推荐(0) 编辑
摘要:Gym - 100543Lhttps://vjudge.net/problem/153854/origin区间dp,要从区间长度为1开始dp 阅读全文
posted @ 2019-07-20 20:05 WeiAR 阅读(141) 评论(0) 推荐(0) 编辑
摘要:Gym 100712Hhttps://vjudge.net/problem/195715/origin先缩点,再建立新图,然后跑两遍dfs求树上最长路 #include<iostream> #include<cstdio> #include<queue> #include<algorithm> #i 阅读全文
posted @ 2019-07-20 13:28 WeiAR 阅读(238) 评论(0) 推荐(0) 编辑
摘要:poj2135根本想不到系列求1到n,和n到1的最短路,但是不能重复走。超级源点连到1,流量为2,费用为0;n连到超级汇点,流量为2,费用为0。其他的流量为1,费用为边的长度。(图中为双向边 阅读全文
posted @ 2019-07-19 10:17 WeiAR 阅读(197) 评论(0) 推荐(0) 编辑
摘要:poj3281根本想不到了网络流题,把牛拆点,如图方式建图,然后跑网络流 阅读全文
posted @ 2019-07-18 16:06 WeiAR 阅读(279) 评论(0) 推荐(0) 编辑
摘要:CodeForces - 627Ahttps://vjudge.net/problem/326413/origina+b == (a&b)<<1 +(a^b);然后是位运算,如果对于这一位置,异或值为1时,有两种可能,由乘法原理,答案<<1。如果s==x,就会出现一方全0,一方全1的情况,所以-2. 阅读全文
posted @ 2019-07-18 10:50 WeiAR 阅读(163) 评论(0) 推荐(0) 编辑
摘要:Gym - 102163M https://vjudge.net/problem/2356949/origin取对数,然后特判特殊情况,就是0的那些情况 阅读全文
posted @ 2019-07-17 21:28 WeiAR 阅读(106) 评论(0) 推荐(0) 编辑
摘要:Gym - 102082Ghttps://vjudge.net/problem/2198225/origin对于数列中任意一个数,要么从最左边到它不递减,要么从最右边到到它不递减,为了满足这个条件,就要移动,而移动的最少步数就是逆序对数。所以这个数要么往左移动,要么往右移动,所以两个取最小就好了 阅读全文
posted @ 2019-07-17 11:13 WeiAR 阅读(265) 评论(0) 推荐(0) 编辑
摘要:https://vjudge.net/problem/2198221/origin逆向思维,原题是人出来,我们处理成人进去,算出来每个人的曼哈顿距离,然后从大到小排序,距离长的先入。走的距离+这个人从队伍中走到入口的距离的最小值就是答案 #include<iostream> #include<cst 阅读全文
posted @ 2019-07-16 19:39 WeiAR 阅读(842) 评论(0) 推荐(0) 编辑
摘要:http://codeforces.com/gym/100623/attachments H题已经给出来的,包括后来添加的,都累加得到ans,那么从1~ans都是可以凑出来的,如果ans<a[now]-1,那么就添加一个ans+1,然后继续操作。 1 #include<iostream> 2 #in 阅读全文
posted @ 2019-04-30 23:17 WeiAR 阅读(135) 评论(0) 推荐(0) 编辑
摘要:http://codeforces.com/gym/100623/attachments E题第一个优化它虽然是镜像对称,但它毕竟是一一对称的,所以可以匹配串和模式串都从头到尾颠倒一下第二个优化,与次数无关,所以排个序就完事了 1 #include<iostream> 2 #include<cstd 阅读全文
posted @ 2019-04-30 21:12 WeiAR 阅读(120) 评论(0) 推荐(0) 编辑
摘要:2016年省赛 G Triple Nimnim游戏,要求开始局面为先手必败,也就是异或和为0。如果n为奇数,二进制下最后一位只有两种可能1,1,1和1,0,0,显然异或和为1,所以方案数为0如果n为偶数,举个例子,14,二进制为1110,我们按位来拆1110==1000+100+101000=100 阅读全文
posted @ 2019-04-30 11:23 WeiAR 阅读(167) 评论(0) 推荐(0) 编辑