传送门

这是我见过的为数不多的良心九怜题之一

题目大意

给定一段$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$,若$x+1$能被看到,则一定要在$x+1$处或$x$处放置视野才行。

所以区间$DP$,预处理两点之间可否互相看到,枚举右端点,从右向左扫,对于最左侧连续的一段$r$看不到的点,设$[l,k]$是这段区间,则$F_{l,r}=\min\{F_{l,k},F_{l,k+1}\}+F_{k+1,r}$,否则$F_{l,r}=F_{l+1,r}$。

#include<bits/stdc++.h>
#define M 5020
#define LL long long
using namespace std;
int n,m,p[M],F[M][M],ans; bool can[M][M];
int read(){
int nm=0,fh=1; char cw=getchar();
for(;!isdigit(cw);cw=getchar()) if(cw=='-') fh=-fh;
for(;isdigit(cw);cw=getchar()) nm=nm*10+(cw-'0');
return nm*fh;
}
int main(){
n=read(); for(int i=1;i<=n;i++) p[i]=read(),F[i][i]=F[i-1][i]=1;
for(int i=1;i<=n;i++){
for(int ht=-1,j=1,pos=1;i+j<=n;j++){
if((LL)(ht-p[i])*(LL)j>=(LL)(p[i+j]-p[i])*(LL)pos) can[i][i+j]=false;
else can[i][i+j]=true,pos=j,ht=p[i+j];
}
} ans=1;
for(int r=3;r<=n;++r){
for(int last=0,l=r-2;l;--l){
if(can[l][r]) last=0,F[l][r]=F[l+1][r];
else if(last) F[l][r]=F[last+1][r]+min(F[l][last],F[l][last+1]);
else F[l][r]=F[l+1][r]+1,last=l; ans^=F[l][r];
}
} printf("%d\n",ans); return 0;
}

BZOJ5324 JXOI2018 守卫的更多相关文章

  1. BZOJ5324 JXOI2018守卫(区间dp)

    对于每个区间[l,r],显然右端点r是必须放置守卫的.考虑其不能监视到的点,构成一段段区间.一个非常显然但我就是想不到的性质是,对于这样的某个区间[x,y],在(y+1,r)内的点都是不能监视到这个区 ...

  2. 【BZOJ5324】[JXOI2018]守卫(动态规划)

    [BZOJ5324][JXOI2018]守卫(动态规划) 题面 BZOJ 洛谷 题解 既然只能看到横坐标在左侧的点,那么对于任意一个区间\([l,r]\)而言,\(r\)必须被选. 假设\(r\)看不 ...

  3. [JXOI2018]守卫

    嘟嘟嘟 正如某题解所说,这题很有误导性:我就一直在想凸包. 随便一个数据,就能把凸包hack掉: 这样我们的点G就gg了. 所以正解是什么呢?dp. 题解看这位老哥的吧,我感觉挺好懂的:题解 P456 ...

  4. BZOJ5324 & 洛谷4563 & LOJ2545:[JXOI2018]守卫——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=5324 https://www.luogu.org/problemnew/show/P4563 ht ...

  5. 洛谷P4563 [JXOI2018]守卫(dp)

    题意 题目链接 Sol 非常有意思的题目. 我们设\(f[l][r]\)表示区间\([l,r]\)的答案. 显然\(r\)位置一定有一个保镖 同时不难观察到一个性质:拿\([1, n]\)来说,设其观 ...

  6. JXOI2018守卫 区间DP

    链接 https://loj.ac/problem/2545 思路 f[i][j]表示i到j区间的最小监视人数 可以预处理出来g[i][j],表示i能否监视到j (其实预处理的关系不大,完全可以直接判 ...

  7. [洛谷P4563][JXOI2018]守卫

    题目大意:有一段$n(n\leqslant5\times10^3)$个点的折线,特殊点可以覆盖它以及它左边的它可以“看见”的点(“看见”指连线没有其他东西阻挡).定义$f_{l,r}$为区间$[l,r ...

  8. yyb省选前的一些计划

    突然意识到有一些题目的计划,才可以减少大量查水表或者找题目的时间. 所以我决定这样子处理. 按照这个链接慢慢做. 当然不可能只做省选题了. 需要适时候夹杂一些其他的题目. 比如\(agc/arc/cf ...

  9. 【JXOI2018】守卫

    [JXOI2018]守卫 参考题解:https://blog.csdn.net/dofypxy/article/details/80196942 大致思路就是:区间DP.对于\([l,r]\)的答案, ...

随机推荐

  1. python 可变参数函数定义* args和**kwargs的用法

    python函数可变参数 (Variable Argument) 的方法:使用*args和**kwargs语法.其中,*args是可变的positional arguments列表,**kwargs是 ...

  2. Miller-Rabin大素数测试模板

    根据费马小定理: 对于素数n,a(0<a<n),a^(n-1)=1(mod n) 如果对于一个<n的正整数a,a^(n-1)!=1(mod n),则n必不是素数. 然后就可以随机生成 ...

  3. 线性同余方程模板( A+C*x=B(mod D) )

    void extendgcd(long long a,long long b,long long &d,long long &x,long long &y) { ){d=a;x ...

  4. sgu Theodore Roosevelt【判断点是否在凸多边形内模板】

    链接: http://acm.sgu.ru/problem.php?contest=0&problem=253 http://acm.hust.edu.cn/vjudge/contest/vi ...

  5. iOS OC和JS的交互 javaScriptCore方法封装

    一.javaScriptCore javaScriptCore是一种JavaScript引擎,主要为webKit提供脚本处理能力,javaScriptCore是开源webkit的一部分,他提供了强大的 ...

  6. 我的Android进阶之旅------>介绍一款集录制与剪辑为一体的屏幕GIF 动画制作工具 GifCam

    由于上一篇文章:我的Android进阶之旅------>Android之动画之Frame Animation实例 中展示的是Frame动画效果,但是之前我是将图片截取下来,不好说明确切的动画过程 ...

  7. Symfony 使用KnpTimeBundle

    使用time_diff时出现:diff.ago.hour; 解决:1:引入"knplabs/knp-time-bundle": "^1.7",https://g ...

  8. 使用 Node.js 对文本内容分词和关键词抽取

    npm install nodejieba var nodejieba = require("nodejieba"); var result = nodejieba.cut(&qu ...

  9. SAP ATP邏輯可用性檢查

    [转http://tqmeng.blog.163.com/blog/static/169263916201162002414612/]SAP ATP邏輯可用性檢查1.可用性檢查群組OVZ2主要用於檢查 ...

  10. 用Visual Studio编辑Linux代码

    估计很多人都是用惯了Visual Studio的主,怎么也不适应Linux的一套编辑器,比如vim.source insight这些东西,可视化的eclipse效果还好点,但一般以远程共享一台Linu ...