摘要:
有特殊意义的一道题…… 加权并查集,我们增加cnt、deep数组 分别表示i点所在链共有多少个点,以及路径压缩之前点i在链中的深度 每次合并时直接修改cnt,路径压缩的同时更新deep 因为每次查询之前都要find,所以查询节点x的deep也就在找father时更新了 (deep数组初始化为零比较方 阅读全文
摘要:
首先有这样一个结论:若p,q为自然数,且gcd(p,q)=1,那么px+qy不能表示的最大数为pq-p-q 那么本题中p,q均取决于最大的两个数,不妨取256,那么上界为256^2-256*2 之后就是简单的完全背包 如果数据中有1,或者最大不能取到的数大于上界,就是0 1 #include<cst 阅读全文
摘要:
这道题很神奇 我们举一个例子,m=12 那么我们可以把它分成两部分,L和R: (1,2,,6)(7,8,,12) 我们可以发现R中的数都可以由12/2和左边的数组合得到 那么我们对L再分……………… 同理,奇数时将,m/2变为m/2+1即可 1 #include<cstdio> 2 #include 阅读全文
摘要:
很容易想到以结束时间加上R从小到大排序 之后怎样呢? 我们按层考虑,f[i]表示前i个时间段嫩得到的最大价值 每次枚举其之前的状态,如果其ed<当前i的st,那么取max即可 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 阅读全文
摘要:
这道题普通的bfs spfa或者ballen ford会T 所以我们使用dfs spfa 原因在于,bfs sfpa中每个节点的入队次数不定,退出操作不及时,而dfs则不会 既然,我们需要找负环,那么我们不妨将dis数组初始化为0,以每个点为起点进行dfs spfa 这样第一次扩展到的只有边权为负的 阅读全文
摘要:
单调栈版子 1 #include<cstdio> 2 #include<cstring> 3 using namespace std; 4 const int N=80010; 5 int n,a,top=0,zh[N]; 6 int read(){ 7 int sum=0; 8 char ch=g 阅读全文
摘要:
本来还想了一会dp…… 然而一看数据范围明显是数论…… 那么推一推。。 我们发现可以用总方案数减去不会越狱的方案数 那么我们考虑在长度为n的数列中填数 首先第一个位置有m种选择,后面的位置: 总方案:m种;不会越狱:m-1种 快速幂。 1 #include<cstdio> 2 #include<cs 阅读全文
摘要:
前缀和、滚动数组优化dp f[i][j]表示前i个数,逆序对数为j的方案数 我们知道,在第k个位置放第i个数,单步得到的逆序对数为i-k 则在前i个数,最多能产生的逆序对数为i个,最少0个,均可转移到j 所以我们得到:f[i][j]=sum(f[i-1][j...j-i]) 所以我们可以通过前缀和优 阅读全文
摘要:
这道题值得好好想一会 我们通过对一些小数据的手算,以及对于每段路程的拆分,可以发现: 1.每个st对应的ed这段路程无论如何都要算上 2.额外还要计算的一段路程,就是“切换”费用 什么是切换费用呢? 我们知道可能会有这样的位置st,到达该位置时,把已经在车上的牛 i 扔下去,载上该处的牛 j 并将它 阅读全文
摘要:
算是一道dp 首先,排序好每一个架子上都是一段区间,然后只需要统计每个点向左向右最长延伸的区间。 所以我们预处理出每个点以左、以右最大能延伸的长度(最多能选几个差值不超过k的) 然后枚举每个点作为断点,sum取max即可 1 #include<cstdio> 2 #include<cstring> 阅读全文