荆轲将会臭名昭著

首先 $15$ 做法很简单,那就是直接 `cout<<-1`

考虑用 BFS 来解思路很简单,但是怎么求每个士兵的控制范围呢?

直接暴力时间复杂度是 $O(nma^2)$ 当然过不了一定会TLE。

所以,只需要差分+前缀和即可。

说起来简单,实现起来也简单。

然后,单打广搜大家应该都会了,可是出题人的恶魔 $18$ 点可以让你的代码慢到爆炸!

怎么剪枝呢?也很简单。

只需将当前步数大于之前已走到终点点数的点删去就可以了。

就这么简单,但我还是打了5个多小时。

然后...

正片开始!

起初,神创造了差分。标记数组是空虚混沌的,渊面黑暗,神的灵运行在差分的左右端点上。

for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
scanf("%s",s);
if(s[0]=='S')
{
sx=i;
sy=j;
}
else if(s[0]=='T')
{
tx=i;
ty=j;
}
else if(s[0]!='.')
{
pers[i][j]=true;
int len=strlen(s),num=0;
for(int k=0;k<len;k++)
{
num=num*10+s[k]-'0';
}
for(int t=max(1,i-num+1);t<=min(n,i+num-1);t++)
{
int l=max(1,j-num+1+abs(i-t));
int r=min(m,j+num-1-abs(i-t));
cov[t][l]++;
cov[t][r+1]--;
}
}
}
}

神说差分数组要有值,与是差分数组变有了值。

for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cov[i][j]+=cov[i][j-1];
}
}

神看这值是对的,与是就把差分数组的预处理分为两段。有晚上,有早晨,是第一日。

for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
scanf("%s",s);
if(s[0]=='S')
{
sx=i;
sy=j;
}
else if(s[0]=='T')
{
tx=i;
ty=j;
}
else if(s[0]!='.')
{
pers[i][j]=true;
int len=strlen(s),num=0;
for(int k=0;k<len;k++)
{
num=num*10+s[k]-'0';
}
for(int t=max(1,i-num+1);t<=min(n,i+num-1);t++)
{
int l=max(1,j-num+1+abs(i-t));
int r=min(m,j+num-1-abs(i-t));
cov[t][l]++;
cov[t][r+1]--;
}
}
}
} for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cov[i][j]+=cov[i][j-1];
}
}

神说数组之间要有 BFS 将其应用,神就造出了 BFS,将 BFS 以外叫做#?,BFS 以内叫做?#,这样就成了,神称 BFS 为函数,有晚上,有早晨,是第二日。

void bfs()
{
queue<node>q;
q.push(#??#);
}

...

OK,95分大成!

满分做法啊...

[好好研究](https://www.luogu.com.cn/discuss/281304)[.](https://www.luogu.com.cn/paste/fpmecy7i)

当然,上面说了,自己改吧!

我把95分的贴出来,100的就不贴了。

const int N=360,M=20;
int n,m,c1,c2,dist;
int sx,sy,tx,ty;
int cov[N][N];
bool pers[N][N];
struct node
{
int x,y,u1,u2;
node(int v1,int v2,int v3,int v4) :
x(v1),y(v2),u1(v3),u2(v4) {}
};
int d[N][N][M][M];
int vis[N][N][M][M];
const int dx[8]={-1,0,1,0,-1,1,1,-1},dy[8]={0,1,0,-1,1,1,-1,-1};
bool cmp(int x,int y)
{
return 1<=x&&x<=n&&1<=y&&y<=m;
}
void bfs()
{
queue<node>q;
d[sx][sy][0][0]=0;
vis[sx][sy][0][0]=true;
q.push((node){sx,sy,0,0});
while(!q.empty())
{
node u=q.front();
q.pop();
for(int i=0;i<8;i++)
{
int nx=u.x+dx[i];
int ny=u.y+dy[i];
if(cmp(nx,ny)&&!pers[nx][ny])
{
//cout<<nx<<" "<<ny<<" "<<u.x<<" "<<u.y<<" ";
if(cov[nx][ny])
{
if(u.u1+1<=c1&&!vis[nx][ny][u.u1+1][u.u2])
{
d[nx][ny][u.u1+1][u.u2]=d[u.x][u.y][u.u1][u.u2]+1;
vis[nx][ny][u.u1+1][u.u2]=true;
//cout<<nx<<" "<<ny<<"\n";
q.push((node){nx,ny,u.u1+1,u.u2});
}
}
else
{
if(!vis[nx][ny][u.u1][u.u2])
{
d[nx][ny][u.u1][u.u2]=d[u.x][u.y][u.u1][u.u2]+1;
vis[nx][ny][u.u1][u.u2]=true;
//cout<<nx<<" "<<ny<<"\n";
q.push((node){nx,ny,u.u1,u.u2});
}
}
}
}
if(u.u2+1<=c2)
{
for(int i=0;i<4;i++)
{
int nx=u.x+dx[i]*dist,ny=u.y+dy[i]*dist;
if(cmp(nx,ny)&&!pers[nx][ny])
{
if(cov[nx][ny])
{
if(u.u1+1<=c1&&!vis[nx][ny][u.u1+1][u.u2+1])
{
d[nx][ny][u.u1+1][u.u2+1]=d[u.x][u.y][u.u1][u.u2]+1;
vis[nx][ny][u.u1+1][u.u2+1]=true;
//cout<<nx<<" "<<ny<<"\n";
q.push((node){nx,ny,u.u1+1,u.u2+1});
}
}
else
{
if(!vis[nx][ny][u.u1][u.u2+1])
{
d[nx][ny][u.u1][u.u2+1]=d[u.x][u.y][u.u1][u.u2]+1;
vis[nx][ny][u.u1][u.u2+1]=true;
//cout<<nx<<" "<<ny<<"\n";
q.push((node){nx,ny,u.u1,u.u2+1});
}
}
}
}
}
}
return ;
}
int main()
{
cin>>n>>m>>c1>>c2>>dist;
char s[4];
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
scanf("%s",s);
if(s[0]=='S')
{
sx=i;
sy=j;
}
else if(s[0]=='T')
{
tx=i;
ty=j;
}
else if(s[0]!='.')
{
pers[i][j]=true;
int len=strlen(s),num=0;
for(int k=0;k<len;k++)
{
num=num*10+s[k]-'0';
}
for(int t=max(1,i-num+1);t<=min(n,i+num-1);t++)
{
int l=max(1,j-num+1+abs(i-t));
int r=min(m,j+num-1-abs(i-t));
//cout<<l<<" "<<r<<"\n";
cov[t][l]++;
cov[t][r+1]--;
}
}
}
}
//cout<<"qidian "<<sx<<" "<<sy<<" zhongdian "<<tx<<" "<<ty<<"\n";
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cov[i][j]+=cov[i][j-1];
}
}
/*for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cout<<cov[i][j]<<" ";
}
cout<<"\n";
}*/
bfs();
int t=n*m,u1,u2;
for(int i=0;i<=max(c1,c2);i++)
{
for(int j=0;j<=max(c1,c2);j++)
{
if(vis[tx][ty][j][i]&&d[tx][ty][j][i]<t)
{
t=d[tx][ty][j][i];
u1=j;
u2=i;
} }
}
if(t==n*m)
{
cout<<-1;
}
else
{
cout<<t<<" "<<u1<<" "<<u2;
}
return 0;
}

P6474 [NOI Online #2 入门组] 荆轲刺秦王 题解的更多相关文章

  1. P6474 [NOI Online #2 入门组] 荆轲刺秦王

    P6474 [NOI Online #2 入门组] 荆轲刺秦王 bfs+差分+卡常 本来我其实是场内选手,但是因为记错提交时间,晚了半小时才交,交不上了,就自动降级为了场外选手 题面复杂,不简述了 首 ...

  2. P7473 [NOI Online 2021 入门组] 重力球

    P7473 [NOI Online 2021 入门组] 重力球 题意 给你一个正方形平面,某些位置有障碍,对于平面上两个球,每次你可以改变重力方向使两个球下落到最底端,求使两个球位置重合的最小改变重力 ...

  3. 洛谷 P6189 - [NOI Online #1 入门组]跑步(根号分治+背包)

    题面传送门 题意: 求有多少个数列 \(x\) 满足: \(\sum x_i=n\) \(x_i\geq x_{i+1}\) 答案对 \(p\) 取模. ...你确定这叫"入门"组 ...

  4. NOI Online 2021 入门组 T1

    Description 题目描述 Alice.Bob 和 Cindy 三个好朋友得到了一个圆形蛋糕,他们打算分享这个蛋糕. 三个人的需求量分别为 \(a, b, c\),现在请你帮他们切蛋糕,规则如下 ...

  5. [NOI 2020 Online] 入门组T1 文具采购(洛谷 P6188)题解

    原题传送门 题目部分:(来自于考试题面,经整理) [题目描述] 小明的班上共有 n 元班费,同学们准备使用班费集体购买 3 种物品: 1.圆规,每个 7 元. 2.笔,每支 4 元. 3.笔记本,每本 ...

  6. NOI Online #1 入门组 魔法

    全网都是矩阵快速幂,我只会倍增DP 其实这题与 AcWing 345. 牛站 还是比较像的,那题可以矩阵快速幂 / 倍增,这题也行. 先 \(Floyd\) 预处理两点之间不用魔法最短距离 \(d_{ ...

  7. [题解] [NOI Online 2021 入门组 T3] 重力球

    题目大意 在一个 \(n\times n\) 的矩形中,题目会给出 \(m\) 个障碍物.有两个小球,你可以选定四个方向(上下左右)的其中一个,小球会朝着这四个方向一直滚动,直到遇到障碍物或是矩形的边 ...

  8. P6189 [NOI Online #1 入门组] 跑步 (DP/根号分治)

    (才了解到根号分治这样的妙方法......) 将每个数当成一种物品,最终要凑成n,这就是一个完全背包问题,复杂度O(n2),可以得80分(在考场上貌似足够了......) 1 #include < ...

  9. 【NOI Online 2020】入门组 总结&&反思

    前言: 这次的NOI Online 2020 入门组我真的无力吐槽CCF的网站了,放段自己写的diss的文章,供一乐 如下:(考试后当天晚上有感而发) 今天是个好日子!!!(我都经历了什么...... ...

  10. NOI ONLINE 入门组 魔法 矩阵快速幂

    做了这道题我才发现NOI入门组!=NOIP普及组 题目链接 https://www.luogu.com.cn/problem/P6190 题意 给出一张有向图,你有K次机会可以反转一条边的边权,即让它 ...

随机推荐

  1. Win11本地部署FaceFusion3最强AI换脸,集成Tensorrt10.4推理加速,让甜品显卡也能发挥生产力

    FaceFusion3.0.0大抵是现在最强的AI换脸项目,分享一下如何在Win11系统,基于最新的cuda12.6配合最新的cudnn9.4本地部署FaceFusion3.0.0项目,并且搭配Ten ...

  2. Windows平台下安装与配置MySQL9

    要在Windows平台下安装MySQL,可以使用图行化的安装包.图形化的安装包提供了详细的安装向导,以便于用户一步一步地完成对MySQL的安装.本节将详细介绍使用图形化安装包安装MySQL的方法. 1 ...

  3. Windows应急响应-QQ巨盗病毒

    目录 病毒背景 样本分析 开启监控 感染病毒 分析病毒行为 C盘文件监控 D盘文件监控 进程监控排查 服务排查 启动项排查 查杀 1.杀掉进程 2.异常服务 3.映像劫持处理 4.hosts文件处理 ...

  4. Java日期时间API系列35-----Jdk8中java.time包中的新的日期时间API类应用,微秒和纳秒等更精确的时间格式化和解析。

    通过Java日期时间API系列1-----Jdk7及以前的日期时间类中得知,Java8以前除了java.sql.Timestamp扩充纳秒,其他类最大只精确到毫秒:Java8 time包所有相关类都支 ...

  5. 前端面试题axaios携带 cookies

    配置 axios.default.widthCredentials = true;

  6. 小程序的image组件

    mode属性:用来制定图片的裁剪和缩放模式:常用属性如下:

  7. kotlin函数和Lambda表达式——>高阶函数与lambda表达式

    1.高阶函数 高阶函数是将函数用作参数或返回值的函数. 一个不错的示例是集合的函数式⻛格的 fold,它接受一个初始累积值与一个接合函数,并通过将当前 累积值与每个集合元素连续接合起来代入累积值来构建 ...

  8. 云原生爱好者周刊:GitHub 官方文档终于开源了!

    云原生一周动态要闻: API 在 Kubernetes 1.22 中被删除 ContainIQ 公开发布 - Kubernetes 本地实时监控! Sophos 收购 Capsule8 开源项目推荐 ...

  9. KubeSphere Cloud 月刊|灾备支持 K8s 1.22+,轻量集群支持安装灾备和巡检组件

    功能升级 备份容灾服务支持 K8s v1.22+ 版本集群 随着 Kubernetes 近一年频繁的发版.升级,越来越多的用户开始部署并使用高版本的 Kubernetes 集群.备份容灾服务支持 Ku ...

  10. windows涉及所有协议及默认端口

    名称 协议 端口 说明 echo tcp/udp 7 echo服务 discard tcp/udp 9 用于连接测试的空服务 systat tcp/udp 11 链接端口系统状态 daytime tc ...