首页 > 其他分享 >P4563 [JXOI2018] 守卫

P4563 [JXOI2018] 守卫

时间:2023-12-05 14:36:53浏览次数:38  
标签:P4563 覆盖 斜率 int JXOI2018 pos 守卫 maxn min

题目传送门 [JXOI2018] 守卫

思路

区间dp。

设状态 $f_{l,r}$ 为在区间 $[l,r]$ 内要放的最少保镖数量。

看到题面第一眼的感觉是不会判两点能否连接。

第二眼发现可以用斜率判。

令 $k_{l,r}$ 为横坐标为 $l,r$ 的两点连线斜率。

有 $k_{l,r}=\frac{h_r-h_l}{r-l}$。

手搓几组样例,得 $\forall x\in[l,r)$,有 $k_{l,r}<k_{x,r}$ 。即对于 $x\in[l,r)$,$(x,r)$ 的连线斜率最小。

且若 $a$ 对于 $b$ 可见,且 $h_c>h_b,c>a$,则 $a$ 对于 $c$ 可见。

令 $p={p_1,p_2\cdots p_m}$ 为 $r$ 点当前能够覆盖的点集。注:下文中 $p$ 按照从右至左斜率单调递减的顺序排序。

注:能被覆盖的点可能不连续。但能被覆盖的点的斜率可以保证从右至左单调递减。

若想为点集连续,可能会导致 “$p$ 为 $r$ 点当前能够覆盖的最远点” 的错误贪心思路。喜提20pt。

如图,$r=G$ 时,$p={E,D,B}$。

接下来是这题个人认为比较难处理的地方。

由于 $p$ 不一定连续,故 $[p_{i+1}+1,p_i-1]$ 对于 $r$ 不可见。

由上述性质得,对于 $j\in[p_i,r)$,$j=p_i$ 是唯一可以覆盖 $[p_{i+1}+1,p_i-1]$ 中至少一个点的点。 即在区间 $(p_{i+1},p_i)$ 右侧唯一能够覆盖到此区间的点为 $p_i$。(有点绕,建议自己手玩一下。)

如图,以 $A$ 为右端点,$[D,A]$ 中能覆盖 $[G,E]$ 的唯一点为 $D$。

当然,也可以选择在 $p_i-1$ 处放置保镖,从内部将点覆盖。

如在点 $E$ 放置保镖。

故 $p_i,p_i-1$ 至少有一处要放置保镖。

这样就成功的将区间 $[p_{i+1}+1,p_i]$ 或 $[p_{i+1}+1,p_i-1]$ 转换为了一个子问题。

区间 $[p_{k+1}+1,p_k-1]$ 的代价即为 $$f_{p_{i+1}+1,p_i-1}=\min{f_{p_{i+1}+1,p_i-1},f_{p_{i+1}+1,p_i}}$$

此时有转移方程:

$$f_{l,r}=\sum\limits_{i=1}^m\min{f_{p_{i+1}+1,p_i-1},f_{p_{i+1}+1,p_i}}$$

时间复杂度 $O(n^3)$,能拿 $70$ pts。

考虑优化。

  • 因为 $p_i$ 是在 $[p_i,r)$ 中与 $r$ 点连线斜率最小的,所以对于$x\in[l,p_i)$,若存在 $f_{x,r}<f_{p_i,r}$,则 $p_{i+1}=x$。 可以考虑将 $p_i$ 在循环里滚动处理。

  • 可以注意到根据上述转移,当处理至 $p$ 点时,区间 $[p,r]$ 可以保证被完全覆盖。有转移方程
    $$f_{l,r}=\min{f_{l,p-1,f_{l,p}}}+f_{p+1,r}$$

干掉一个线性时间复杂度。时间复杂度 $O(n^2)$。

具体实现上有问题的话可以看代码。

#pragma GCC optimize(2)
#include <bits/stdc++.h>
#define eps 1.0000
typedef long long ll;
const int maxn = 5020;
const ll inf = 1e18;
int n;
int h[maxn];
ll f[maxn][maxn], res;
bool check(int a, int b, int p){
	double ka = (h[p] - h[a]) * eps / (p - a);
	double kb = (h[p] - h[b]) * eps / (p - b);
	return ka < kb;
}
int main(){
	scanf("%d", &n);
	for(int i = 1; i <= n; i++) scanf("%d", &h[i]), f[i][i] = 1;
	for(int r = 1; r <= n; r++){
		int pos = -1;
		for(int l = r - 1; l >= 1; l--){
			if(pos == -1 || check(l, pos, r)) pos = l;
			f[l][r] = std::min(f[l][pos - 1], f[l][pos]) + f[pos + 1][r];
		}
	}
	for(int i = 1; i <= n; i++)
		for(int j = i; j <= n; j++)
			res ^= f[i][j];
	printf("%lld", res);
	return 0;
}

初二婴儿,轻喷 qwq

我觉得这篇题解应该是题解区比较详细的?

标签:P4563,覆盖,斜率,int,JXOI2018,pos,守卫,maxn,min
From: https://www.cnblogs.com/CQWDX/p/17877121.html

相关文章

  • Wpf Prism 导航(参数传递,路由守卫,路由记录)
    十年河东,十年河西,莫欺少年穷学无止境,精益求精1、新建项目wpfApp5,添加Nuget引用,并初始化App.xaml及cs类 app.xaml如下:<Prism:PrismApplicationx:Class="WpfApp5.App"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="......
  • 博弈论——小偷与守卫混合纳什均衡精解(十九)
    从经济学角度上讲,对于理性的人,犯罪成本高于犯罪收益,自然就不会去犯罪。所以简单回答就是,违法成本变高会减少犯罪。使违法成本变高有很多方法,最直接最常见的就是严打,即加大对犯罪的处罚力度。小偷-守卫博弈有助于我们对这些方面的思考,该博弈在双方采用纯策略的情况下不存在纳什均衡......
  • RBAC导航守卫
    在写之前首先了解什么是导航守卫:Vue导航守卫是VueRouter提供的一种机制,用于在导航过程中对路由进行控制和管理。通过导航守卫,可以在路由跳转前、跳转后以及导航被确认时执行一些逻辑,比如进行权限验证、页面数据加载、页面跳转动画等操作。知道导航守卫之后就可以开始......
  • 利用路由守卫实现token过期后返回登录界面
    consttimeX=localStorage.getItem("time");//如果有时间戳存在会判断token是否过期if(timeX!==null){consttime=timeX.slice(1,-1)//获取了token的过期时间consttokenTime=newDate(time);constcurrentTimeUS=newDate();constcurrentTimeCN=newDate(cu......
  • 路由守卫中的白名单
    在写登录注册的路由守卫的时候,如果直接进行判断,会出现错误router.beforeEach((to,from,next)=>{if(VueCookies.get("token")){next()}else{next("/login")}})  所以要在判断的时候添加白名单,在路由守卫中使用白名单是一种常见的实践,允许你指定哪些路......
  • Vue-router的使用、路由守卫、localStorage
    一、路由的使用以后,就是组件的切换实现页面切换的效果-----》必须借助于vue-router来实现。在App.vue中:<router-view/>--->显示组件--->在router/index.js中配置<router-link:to="about_url">---->做页面组件的跳转的基本使用:1.写一个页面组件2.......
  • 守卫
    P4563[JXOI2018]守卫参考题解中的\(p/p-1\),而不是\(p-1\)是因为可以这样:如图,边界位置。对于斜率的更新:如图所示,每次斜率增大后,我们发现下面的阴影部分都是看不到的,就需要放置看守。......
  • 喜讯 | 智安零信任安全项目入选信通院“安全守卫者计划”优秀案例
    近日,中国信息通信研究院(以下简称“中国信通院”)主办的首届“SecGo云和软件安全大会”成功举办,会上重磅揭晓了“安全守卫者计划·零信任”优秀案例征集活动结果,深圳市智安网络有限公司与大庆油田信息技术公司联合申报的零信任项目,凭借为企业提供一种新型的安全边界访问技术模型,为海......
  • vue3 路由-导航守卫
    假设用户登录,在地址栏输入了Login,人性化的设计应该自动回到home页面。或者用户输入不存在路由,也应该回到home页面。这个时候需要用到vue-router的导航守卫功能。在我们封装的router.js文件下添加router.beforeEach……constrouter=createRouter({...})router.beforeEach......
  • Vue学习笔记:路由开发 Part 08 导航守卫
    vue-router提供的导航守卫主要用来通过跳转或取消的方式守卫导航。这里有很多方式植入路由导航中:全局的,单个路由独享的,或者组件级的。全局前置守卫可以使用 router.beforeEach 注册一个全局前置守卫。当一个导航触发时,全局前置守卫按照创建顺序调用。守卫是异步解析执行,此时导航......