【BZOJ5324】[JXOI2018]守卫(动态规划)
【BZOJ5324】[JXOI2018]守卫(动态规划)
题面
题解
既然只能看到横坐标在左侧的点,那么对于任意一个区间\([l,r]\)而言,\(r\)必须被选。
假设\(r\)看不到若干个区间,其中一个区间是\([x,y]\),因为\(y+1\)能够被看到,所以\([y+2,r]\)这一段一定看不到\([x,y]\)。因此\(y,y+1\)中必须要选择一个。
先预处理出任意两点之间能够互相看到,这个东西的复杂度是\(O(n^2)\)的。
设\(f[l][r]\)表示区间\([l,r]\)的答案。
固定右端点,向左扫,每次求出当前的看不到的区间,那么\(f[l][r]=1+\sum min(f[x][y],f[x][y+1])\)。
这样子的时间复杂度就是\(O(n^2)\)的了。
#include<iostream>
#include<cstdio>
using namespace std;
#define MAX 5050
inline int read()
{
int x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
int n,ans,a[MAX],f[MAX][MAX];
bool g[MAX][MAX];
int main()
{
n=read();
for(int i=1;i<=n;++i)a[i]=read();
for(int i=1;i<=n;++i)
for(int j=i-1,lst=0;j;--j)
if(!lst||1ll*(a[i]-a[j])*(i-lst)<1ll*(a[i]-a[lst])*(i-j))
g[i][j]=g[j][i]=true,lst=j;
for(int i=1;i<=n;++i)
for(int j=i,s=1,lst=0;j;--j)
{
if(g[i][j]){if(!g[i][j+1])s+=min(f[j+1][lst],f[j+1][lst+1]);f[j][i]=s;}
else{if(g[i][j+1])lst=j;f[j][i]=s+min(f[j][lst],f[j][lst+1]);}
ans^=f[j][i];
}
printf("%d\n",ans);
return 0;
}
【BZOJ5324】[JXOI2018]守卫(动态规划)的更多相关文章
- BZOJ5324 JXOI2018守卫(区间dp)
对于每个区间[l,r],显然右端点r是必须放置守卫的.考虑其不能监视到的点,构成一段段区间.一个非常显然但我就是想不到的性质是,对于这样的某个区间[x,y],在(y+1,r)内的点都是不能监视到这个区 ...
- BZOJ5324 JXOI2018 守卫
传送门 这是我见过的为数不多的良心九怜题之一 题目大意 给定一段$n$个点构成的折线,第$i$个折点的坐标是$(i,h_i)$,你可以在$i$点放置一个视野,定义$i$能看到$j$当且仅当$i$处有视 ...
- [JXOI2018]守卫
嘟嘟嘟 正如某题解所说,这题很有误导性:我就一直在想凸包. 随便一个数据,就能把凸包hack掉: 这样我们的点G就gg了. 所以正解是什么呢?dp. 题解看这位老哥的吧,我感觉挺好懂的:题解 P456 ...
- BZOJ5324 & 洛谷4563 & LOJ2545:[JXOI2018]守卫——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=5324 https://www.luogu.org/problemnew/show/P4563 ht ...
- 洛谷P4563 [JXOI2018]守卫(dp)
题意 题目链接 Sol 非常有意思的题目. 我们设\(f[l][r]\)表示区间\([l,r]\)的答案. 显然\(r\)位置一定有一个保镖 同时不难观察到一个性质:拿\([1, n]\)来说,设其观 ...
- JXOI2018守卫 区间DP
链接 https://loj.ac/problem/2545 思路 f[i][j]表示i到j区间的最小监视人数 可以预处理出来g[i][j],表示i能否监视到j (其实预处理的关系不大,完全可以直接判 ...
- [洛谷P4563][JXOI2018]守卫
题目大意:有一段$n(n\leqslant5\times10^3)$个点的折线,特殊点可以覆盖它以及它左边的它可以“看见”的点(“看见”指连线没有其他东西阻挡).定义$f_{l,r}$为区间$[l,r ...
- yyb省选前的一些计划
突然意识到有一些题目的计划,才可以减少大量查水表或者找题目的时间. 所以我决定这样子处理. 按照这个链接慢慢做. 当然不可能只做省选题了. 需要适时候夹杂一些其他的题目. 比如\(agc/arc/cf ...
- 【JXOI2018】守卫
[JXOI2018]守卫 参考题解:https://blog.csdn.net/dofypxy/article/details/80196942 大致思路就是:区间DP.对于\([l,r]\)的答案, ...
随机推荐
- PHP中多个文件包含的问题 (一)
使用require或者include来包含文件时,包含的文件的内容相对性,这个很容易搞混,所以记录一下. 这个相对性包括 __DIR__,__FILE__,$_SERVER['PHP_SELF'],$ ...
- 【学习总结】Git学习-参考廖雪峰老师教程六-分支管理
学习总结之Git学习-总 目录: 一.Git简介 二.安装Git 三.创建版本库 四.时光机穿梭 五.远程仓库 六.分支管理 七.标签管理 八.使用GitHub 九.使用码云 十.自定义Git 期末总 ...
- 文件搜索神器之everything
之前我提到了,在本地快速的进行文件的检索是平常工作中必要的部分,一个好的搜索软件会大大的提升我们的工作效率.就是它,everything,官方的网站地址是http://www.voidtools.co ...
- js上传视频(jquery.form.js)
// 上传目标触发点 <input type="file" class="upvideo" name="upvideo" id=&qu ...
- 一、npm基础
一.什么是npm? npm 是模块管理工具,可以下载.更新第三方模块,也可以发布自己的模块共替他人使用,主要目的在于分享和重用代码: 二.下载安装node,更新npm node 下载网址 https ...
- array_column函数
<?php $arr = [ [ 'id'=>1, 'name'=>'wang', 'age'=>10 ], [ 'id'=>2, 'name'=>'yong', ...
- mysql中的几种日志了解
前言 MySQL中有以下日志文件,分别是: 1:重做日志(redo log) 2:回滚日志(undo log) 3:二进制日志(binlog) 4:错误日志(errorlog) 5:慢查询日志(slo ...
- [转帖]前端-chromeF12 谷歌开发者工具详解 Network篇
前端-chromeF12 谷歌开发者工具详解 Network篇 https://blog.csdn.net/qq_39892932/article/details/82493922 blog 也是原作 ...
- Bootstrap 面板(Panels)
一.面板组件用于把 DOM 组件插入到一个盒子中.创建一个基本的面板,只需要向 <div> 元素添加 class .panel 和 class .panel-default 即可,如下面的 ...
- Dreamweaver怎样用Edge Web Fonts功能
https://jingyan.baidu.com/article/37bce2beb3af6f1002f3a2c9.html