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