摘要: link 试题分析 数据结构板子题。其中只需要维护区间覆盖,区间查询的线段树。而这是在一棵树中,所以考虑树链剖分。 然后就真是板子了。 #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> using na 阅读全文
posted @ 2018-12-20 13:10 siruiyang_sry 阅读(136) 评论(0) 推荐(0) 编辑
摘要: link 试题分析 我们发现普通$dp$时间复杂度为$O(h \times w)$的,会$T$的很惨。而这个又无法通过优化,所以呢就要改变$dp$策略。 观察到$n\leq 2000$,所以我们需要设计出一个关于不能走的$dp$。 part1 排列组合应用 $C_i^j$的意思大家都知道把,但是这道 阅读全文
posted @ 2018-12-19 19:55 siruiyang_sry 阅读(384) 评论(0) 推荐(0) 编辑
摘要: link 一道非常类似的题目(link) 试题大意 给你一棵含有$n$个节点的有边权森林,问每次连边将会用$L$的代价,问你若此图通过加边成为树时的最小直径。$n \leq 5\times 10^5$ 试题分析 我们可以发现若两棵树要是在合并连接的点一定与树的中心有关。树的中心指对于当$i$为根时, 阅读全文
posted @ 2018-12-19 15:31 siruiyang_sry 阅读(239) 评论(0) 推荐(0) 编辑
摘要: link 题目大意 每次找到没有被询问过的第k小的数。共$n$个询问,答案不超过$n$。$(n\leq 10^5)$ 试题分析 其实是一个线段树的板子,然后用一下主席树的思想就行。 #include<iostream> #include<cstdio> #include<cstring> #incl 阅读全文
posted @ 2018-12-18 20:49 siruiyang_sry 阅读(185) 评论(0) 推荐(0) 编辑
摘要: link 试题分析 我们发现$dp(t,s1,s2,s3)$表示在$t$时刻$3$个人的位置。发现时间复杂度为$O(n \times L^3)$。不仅会$T$还会$MLE$,所以需要优化$dp$。我们发现当次$dp$合法时,肯定会有一项是到达的那个位置,所以可以优化掉一维。只需要把那个必须要经过的位 阅读全文
posted @ 2018-12-18 20:12 siruiyang_sry 阅读(260) 评论(0) 推荐(0) 编辑
摘要: link 试题分析 发现每个小朋友最多只能看到$5$个动物所以考虑状压$dp$。我们定义$f(i,j)$为第$i$个位置从此往后$5$个人的最喜欢数量。所以只要预处理出对于每个点从后$5$个会让多少小朋友高兴即可 #include<iostream> #include<cstdio> #includ 阅读全文
posted @ 2018-12-18 18:26 siruiyang_sry 阅读(291) 评论(0) 推荐(0) 编辑
摘要: link 题目大意 给你一个长度为$n$的数字串,其中$-1$的表示可以填$1$~$k$中任意一个数,其余数的范围也是从$1$~$k$。而对于连续$len$个数都不是相等的。问有多少种方案。 试题分析 容易发现此题是一个计数类$dp$。我们定义$f(i,j)$表示第$i$位选$j$的方案数,$ans 阅读全文
posted @ 2018-12-17 19:04 siruiyang_sry 阅读(381) 评论(0) 推荐(0) 编辑
摘要: link 试题分析 可以容易发现此题维护的是一个数据结构,支持区间加,区间除,区间查询最大值。其实就是在$\log$级复杂度内维护除法操作。 我们发现当除数很大或者此串序列大小差不多时,我们令$a_i$为原来,$b_i$为现在,则对于$[l,r]$中的任意一个数$i$,则出现$a_i-b_i$为恒值 阅读全文
posted @ 2018-12-15 23:55 siruiyang_sry 阅读(457) 评论(0) 推荐(0) 编辑
摘要: link 试题分析 其实可以发现我们选择切的顺序可以颠换。 所以我们可以设$dp(i,j)$表示为前$i$个共切$j$的最大得分,然后$dp(i,j)=max(dp(i-1,z)+s[z] \times (s[i]-s[z])),s[i]=\sum_{i=1}^i a_i$。 然后发现这是个斜率优化 阅读全文
posted @ 2018-12-14 20:59 siruiyang_sry 阅读(155) 评论(0) 推荐(0) 编辑
摘要: link 试题分析 做这种题就应该去先写个暴力代码 #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #include<climits> using namespace std; inline int 阅读全文
posted @ 2018-12-14 15:51 siruiyang_sry 阅读(183) 评论(0) 推荐(0) 编辑
摘要: link 维护一个上凸壳就行,普通的斜率优化。 若想要具体过程请参考以前博客 #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #define int long long using namespace 阅读全文
posted @ 2018-12-13 20:21 siruiyang_sry 阅读(143) 评论(0) 推荐(0) 编辑
摘要: link 其实是一个需要许多次换元的$dp$,比较简单。 我们通过层层操作以后得到式子$f[j]+s[j]=d[i]\times k[j]+s[i]-val[i]-d[i]\times k[i]+f[i]$ 然后会发现里面的横坐标$(X)$,纵坐标$(Y)$与斜率,然后发现还是维护下凸壳,然后就单调 阅读全文
posted @ 2018-12-12 21:05 siruiyang_sry 阅读(155) 评论(0) 推荐(0) 编辑
摘要: link 熟悉熟悉模板,其实就是主席树的板子,最后卡一卡空间即可 #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> using namespace std; inline int read(){ int 阅读全文
posted @ 2018-12-12 20:01 siruiyang_sry 阅读(157) 评论(0) 推荐(0) 编辑
摘要: link 试题分析 设$dp[i]$表示为去选择第$i$个位最后一个的总价值。复杂度:$O(n^2)$ 将$s[i]=\sum_{i=1}^i {c[i]}$,然后$a_i=s_i+i,b_i=s_i+i+1+L$,所以$dp[i]=min{dp[j]+(a[i]-b[j])^2}$ 得:$f[j] 阅读全文
posted @ 2018-12-12 16:19 siruiyang_sry 阅读(178) 评论(0) 推荐(0) 编辑
摘要: link 试题分析 一道斜率优化的dp 易得方程$f[j]=(S+t[i])\times c[j]+f[i]-t[i]\times c[i]+s\times c[n]$,为什么要写成这要,因为这样其实就可以将$min$拆掉,并且是一个函数形式,$(S+t[i])$为斜率,$f[i]-t[i]\tim 阅读全文
posted @ 2018-12-12 15:07 siruiyang_sry 阅读(186) 评论(0) 推荐(0) 编辑
摘要: link 题目大意 有一颗树,且每次询问包含$k$个特殊节点,问每个特殊节点能占领几个节点 试题分析 到底是道德的沦丧,还是人性的扭曲。 其实发现数据范围$\sum_{i=1}^q m_i \leq 3\times 10^5$想到了什么 虚树,所以应该怎么用虚树优化。 先将虚树建出来,这是基本操作, 阅读全文
posted @ 2018-12-10 22:16 siruiyang_sry 阅读(157) 评论(0) 推荐(0) 编辑
摘要: link 题目大意 若有一颗带边权的树,且每次询问$k$个节点,问$k$个节点均不与1号节点相连的最小边权。 试题分析 考虑暴力$dp$,设$dp_i$为处理好i的子树的最小边权,我们定义$val_i$为从$i$到根的最小边权,则$dp_i=min(\sum dp_v,val_i)$。 但是发现其实 阅读全文
posted @ 2018-12-10 15:14 siruiyang_sry 阅读(148) 评论(0) 推荐(0) 编辑
摘要: link 其实可以用$sum(i,j)$表示从$i$到$1$的$k$次方的值,然后就是$lca$的基本操作 注意,能一起干的事情就一起搞,要不会超时 #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> # 阅读全文
posted @ 2018-12-08 16:24 siruiyang_sry 阅读(142) 评论(0) 推荐(0) 编辑
摘要: link 其实就是一个比较简单的$IOI$题。简单$dp$就行,设$5$维$dp$即可 最后在滚动一下,判一下可行性即可。 #include<iostream> #include<cstring> #include<algorithm> #include<cstdio> using namespac 阅读全文
posted @ 2018-12-08 13:57 siruiyang_sry 阅读(146) 评论(0) 推荐(0) 编辑
摘要: link 其实就是再问你在任意行或列棋子数量不超过$2$,所以考虑$dp$维护这个结论 我们可以直接限制行,开维限制列,所以设$dp(i,j,k)$为前$i$行有$j$列有$1$个棋子,有$k$列有$2$个棋子 然后分类讨论一下这行取一个,两个,或者不取的个数。最后累加即可 详情见代码 #inclu 阅读全文
posted @ 2018-12-08 10:08 siruiyang_sry 阅读(152) 评论(0) 推荐(0) 编辑