BZOJ5324 JXOI2018 守卫】的更多相关文章

对于每个区间[l,r],显然右端点r是必须放置守卫的.考虑其不能监视到的点,构成一段段区间.一个非常显然但我就是想不到的性质是,对于这样的某个区间[x,y],在(y+1,r)内的点都是不能监视到这个区间内的任何一点的,证明考虑一下斜率之间的关系即可.于是该区间的最右一个守卫可以放置在y,也可以放置在y+1,这样可以得到一个显然的区间dp,暴力dp是O(n3)的,固定右端点后移动左端点同时记录答案就可以优化到O(n2). #include<iostream> #include<cstdio…
传送门 这是我见过的为数不多的良心九怜题之一 题目大意 给定一段$n$个点构成的折线,第$i$个折点的坐标是$(i,h_i)$,你可以在$i$点放置一个视野,定义$i$能看到$j$当且仅当$i$处有视野且$j\leq i$且$(i,h_i)$到$(j,h_j)$的连线段除了两个端点都严格地在折线上方.一段区间$[L,R]$对答案的贡献是能看到至少整个$[L,R]$的需要的视野最小数量,求所有区间答案的异或和. 题解 考虑一段区间$[L,R]$,$R$一定要选,对于每一个$R$端点看不到的点$x$…
[BZOJ5324][JXOI2018]守卫(动态规划) 题面 BZOJ 洛谷 题解 既然只能看到横坐标在左侧的点,那么对于任意一个区间\([l,r]\)而言,\(r\)必须被选. 假设\(r\)看不到若干个区间,其中一个区间是\([x,y]\),因为\(y+1\)能够被看到,所以\([y+2,r]\)这一段一定看不到\([x,y]\).因此\(y,y+1\)中必须要选择一个. 先预处理出任意两点之间能够互相看到,这个东西的复杂度是\(O(n^2)\)的. 设\(f[l][r]\)表示区间\([…
嘟嘟嘟 正如某题解所说,这题很有误导性:我就一直在想凸包. 随便一个数据,就能把凸包hack掉: 这样我们的点G就gg了. 所以正解是什么呢?dp. 题解看这位老哥的吧,我感觉挺好懂的:题解 P4563 [[JXOI2018]守卫] #include<cstdio> #include<iostream> #include<cmath> #include<algorithm> #include<cstring> #include<cstdli…
https://www.lydsy.com/JudgeOnline/problem.php?id=5324 https://www.luogu.org/problemnew/show/P4563 https://loj.ac/problem/2545 题目见上. 参考:https://blog.csdn.net/dofypxy/article/details/80196942 区间dp,设f[i][j]为[i,j]的答案,see[i][j]为i是否能看到j. 显然see数组可以O(n^2)处理,…
题意 题目链接 Sol 非常有意思的题目. 我们设\(f[l][r]\)表示区间\([l,r]\)的答案. 显然\(r\)位置一定有一个保镖 同时不难观察到一个性质:拿\([1, n]\)来说,设其观察不到的某个区间为\([l_k, r_k]\),那么\(r_k\)与\(r_k + 1\)一定有一个保镖,而且每段区间的贡献都是独立的. 这样我们可以预处理出任意两个点是否能看见(直接记上一个能看到的位置然后比较斜率). 然后直接枚举\(r\),不断把\(l\)往左移动更新答案,这样可以保证更新的时…
链接 https://loj.ac/problem/2545 思路 f[i][j]表示i到j区间的最小监视人数 可以预处理出来g[i][j],表示i能否监视到j (其实预处理的关系不大,完全可以直接判断,不过比较不能加=) 一个区间\([l,r]\),一定会选r,显然 然后只要管r不能监视的地方\([x,y]\)(多个) 加上f[x][y]或者f[x][y+1]的贡献 %%attack 菜误 题目都没读清楚 一边写一边想,改了又改,调了又调(虽然比sb数据结构调的快) 代码ps:我的数组貌似是反…
题目大意:有一段$n(n\leqslant5\times10^3)$个点的折线,特殊点可以覆盖它以及它左边的它可以“看见”的点(“看见”指连线没有其他东西阻挡).定义$f_{l,r}$为区间$[l,r]$最少需要的特殊点个数,求:$\sum\limits_{l=1}^n\sum\limits_{r=l}^nf_{l,r}$ 题解:可以用斜率来判断是否可以看见.发现$r$一定要设一个关键点,而若一个极大区间$[l',r']$在$r$处看不见,那么一定要在$r'$或$r'+1$处设一个关键点,所以$…
突然意识到有一些题目的计划,才可以减少大量查水表或者找题目的时间. 所以我决定这样子处理. 按照这个链接慢慢做. 当然不可能只做省选题了. 需要适时候夹杂一些其他的题目. 比如\(agc/arc/cf\)的题目,以及\(loj\)上的一些省的集训题目,还有\(uoj\)的各种\(round\)的题目. 大块大块的做题记录就在这里记录一下,省选后再来看结果,至少努力过就不曾后悔了不是吗? 首先先是省选题的记录,然后有比赛的记录,做到每周至少完成一整场\(CF\)或者\(AtCoder\)比赛的题解…
[JXOI2018]守卫 参考题解:https://blog.csdn.net/dofypxy/article/details/80196942 大致思路就是:区间DP.对于\([l,r]\)的答案,\(r\)肯定要放守卫,然后\(r\)不能看到的一些连续区间\([l_k,r_k]\)是相互独立的.所以\(f_{l,r}=\sum min \{ f_{l_k,r_k},f_{l_k,r_k+1} \}+1\) 代码: #include<bits/stdc++.h> #define ll lon…