BZOJ5324 JXOI2018守卫(区间dp)
对于每个区间[l,r],显然右端点r是必须放置守卫的。考虑其不能监视到的点,构成一段段区间。一个非常显然但我就是想不到的性质是,对于这样的某个区间[x,y],在(y+1,r)内的点都是不能监视到这个区间内的任何一点的,证明考虑一下斜率之间的关系即可。于是该区间的最右一个守卫可以放置在y,也可以放置在y+1,这样可以得到一个显然的区间dp,暴力dp是O(n3)的,固定右端点后移动左端点同时记录答案就可以优化到O(n2)。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
#define N 5010
#define inf 1000000010
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<''||c>'')) c=getchar();return c;}
int gcd(int n,int m){return m==?n:gcd(m,n%m);}
int read()
{
int x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
int n,a[N],f[N][N],tot;
int main()
{
#ifndef ONLINE_JUDGE
freopen("bzoj5324.in","r",stdin);
freopen("bzoj5324.out","w",stdout);
const char LL[]="%I64d\n";
#else
const char LL[]="%lld\n";
#endif
n=read();
for (int i=;i<=n;i++) a[i]=read();
memset(f,,sizeof(f));
for (int i=;i<=n;i++)
{
double k=inf;
int ans=;f[i][i]=;tot^=;
for (int j=i-;j;j--)
if ((double)(a[i]-a[j])/(i-j)<k) f[j][i]=ans,tot^=ans,k=(double)(a[i]-a[j])/(i-j);
else
{
int x=j;
while (x>&&(double)(a[i]-a[x-])/(i-x+)>=k) x--;
for (int k=j;k>=x;k--) tot^=f[k][i]=ans+min(f[k][j],f[k][j+]);
ans+=min(f[x][j],f[x][j+]);j=x;
}
}
cout<<tot;
return ;
}
BZOJ5324 JXOI2018守卫(区间dp)的更多相关文章
- JXOI2018守卫 区间DP
		链接 https://loj.ac/problem/2545 思路 f[i][j]表示i到j区间的最小监视人数 可以预处理出来g[i][j],表示i能否监视到j (其实预处理的关系不大,完全可以直接判 ... 
- BZOJ5324 JXOI2018 守卫
		传送门 这是我见过的为数不多的良心九怜题之一 题目大意 给定一段$n$个点构成的折线,第$i$个折点的坐标是$(i,h_i)$,你可以在$i$点放置一个视野,定义$i$能看到$j$当且仅当$i$处有视 ... 
- 【BZOJ5324】[JXOI2018]守卫(动态规划)
		[BZOJ5324][JXOI2018]守卫(动态规划) 题面 BZOJ 洛谷 题解 既然只能看到横坐标在左侧的点,那么对于任意一个区间\([l,r]\)而言,\(r\)必须被选. 假设\(r\)看不 ... 
- BZOJ5324 & 洛谷4563 & LOJ2545:[JXOI2018]守卫——题解
		https://www.lydsy.com/JudgeOnline/problem.php?id=5324 https://www.luogu.org/problemnew/show/P4563 ht ... 
- [JXOI2018]守卫
		嘟嘟嘟 正如某题解所说,这题很有误导性:我就一直在想凸包. 随便一个数据,就能把凸包hack掉: 这样我们的点G就gg了. 所以正解是什么呢?dp. 题解看这位老哥的吧,我感觉挺好懂的:题解 P456 ... 
- 【BZOJ-4380】Myjnie      区间DP
		4380: [POI2015]Myjnie Time Limit: 40 Sec Memory Limit: 256 MBSec Special JudgeSubmit: 162 Solved: ... 
- 【POJ-1390】Blocks      区间DP
		Blocks Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 5252 Accepted: 2165 Descriptio ... 
- 区间DP LightOJ 1422 Halloween Costumes
		http://lightoj.com/volume_showproblem.php?problem=1422 做的第一道区间DP的题目,试水. 参考解题报告: http://www.cnblogs.c ... 
- BZOJ1055: [HAOI2008]玩具取名[区间DP]
		1055: [HAOI2008]玩具取名 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1588 Solved: 925[Submit][Statu ... 
随机推荐
- python数据分析的工具环境
			python做数据分析的优势: 拥有大量的库为数据分析和处理提供了完整的工具链 随着库还在不断的增加的同时, 算法的实现也更加的创新.Numpy, matplotlib, scipy,scikit-l ... 
- 13-调试Dockerfile
			包括 Dockerfile 在内的任何脚本和程序都会出错.有错并不可怕,但必须有办法排查,所以本节讨论如何 debug Dockerfile. 先回顾一下通过 Dockerfile 构建镜像的过程: ... 
- CF刷题-Codeforces Round #481-F. Mentors
			题目链接:https://codeforces.com/contest/978/problem/F 题目大意: n个程序员,k对仇家,每个程序员有一个能力值,当甲程序员的能力值绝对大于乙程序员的能力值 ... 
- Unity3D Shader 学习笔记(二):ShaderLab的结构和基本属性
			(一) ShaderLab: 什么是ShaderLab: Unity3D支持的Shader种类包括: 1.Surface Shader:表面着色器 2.Vertex & Fragment Sh ... 
- 使用Amplify Shader Editor优化特效Shader
			ASE相对于Shader Forge生成的代码更加干净, 用于制作特效的再合适不过,以下是使用ASE优化一个SF制作特效的经过: ## 分析美术用SF制作的Shader 懒得装SF, 直接分析代码可知 ... 
- Egret入门(一)--简介
			关于Egret 构建2D游戏,开源. TS + JS 完成打包后可以转换成HTML5的游戏(跨平台) Egret特点 1. 优秀的设计思想 2. 高效的渲染模块 3. 完善的配套工具 4. 灵活的工作 ... 
- NO--16  vue之父子组件传值
			先创建项目并运行 vue init webpack-simple templatecd templatenpm inpm run dev 一.子组件访问父组件的数据 方式一 :子组件直接访问父组件的数 ... 
- 使用AD对Linux客户端进行身份验证
			https://technet.microsoft.com/zh-cn/library/2008.12.linux.aspx 
- ats编译中增加透明度 选项
			在大多数情况下,如果环境支持透明度,则configure将自动启用它.对于其他环境,可能需要 配置configure 选项. --enable-posix-cap 这实现了POSIX功能,这是透明度所 ... 
- Win7-64位PowerDesigner下MySQLODBC驱动问题
			操作系统:win7-64位,PowerDesigner15.1(以下简称PD), MYSQL-ODBC-64驱动.安装完MYSQL-ODBC-64却找不到相关驱动,用PD反导数据库,却找不到Mysql ... 
