$n \leq 1e9$,$n*2$的网格里有$m_1+m_2 \leq 1e6$个障碍物,现有一坦克从$(0,1)$出发要到$(n+1,1/2)$,他每秒可以换行(纵坐标1变2或2变1)也可以发炮弹,然后会强制往前走一格(横坐标+1),一次炮弹打一个障碍,炮弹装载时间$t \leq n$,一开始炮弹没装好。问是否可以到达终点,若可以输出过程中的所有转弯和打炮操作的位置。

比较接地气的一个题。虽然没做出来但大爱。

首先可以把打炮看成“攒步数”,怎么讲呢?比如说坦克在某段时间一直往前走不换行,走到一个障碍物就不得不打他一下,那么他在撞到这障碍物前至少有$t$步空闲。类似地,两个障碍物就$2t$,$k$个就$kt$,就好比在攒步数,然后到障碍物处花掉。而换了行的话,由于不可以换行立即猛发炮弹(尽管之前攒了很多步数但刚换行最多只能打一发),因此步数将变成$min(当前步数,t)$。基于此可以进行一个dp:$f(i,j)$表示在格子$(i,j)$攒的步数,无法到达即$-1$。注意分是否是障碍物转移,因为一行有障碍物时另一行的坦克不可能直接撞上来。这样就得到了$O(n)$的解法。

$However$,这里$n$大大的!必须把复杂度与障碍物数联系起来!

其实dp的主要瓶颈在换行,如果不换行完全可以枚举每个障碍物,到那里$f(i,j)-=t$即可。那换行咋整啊?

yy可得:存在一最优策略使得换行操作一定在某个障碍物后进行。如下图所示,黑色块是某个转弯前的最后一个块,绿色的线路和红色线路攒的步数是一样的,但由于换行之后dp数组会对$t$取$min$,因此不如红色线路。

是一个贪心策略。这种dp+贪心是比较新颖的套路。

转移时注意,因为我表示的状态是“每个障碍物的下一列”,如果下一列有障碍物要提前打掉。

 //#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
//#include<map>
#include<math.h>
//#include<time.h>
//#include<complex>
#include<algorithm>
using namespace std; int n,m1,m2,t;
#define maxn 2000011
bool turn[][maxn]; int list[][maxn],f[][maxn];
struct BO{int pos,type;}bo[maxn],ans[maxn]; int lb=;
int lans,tt[maxn],ltt;
bool cmp(const BO a,const BO b) {return a.pos<b.pos;} int main()
{
scanf("%d%d%d%d",&n,&m1,&m2,&t);
for (int i=;i<=m1;i++) scanf("%d",&list[][i]);
for (int i=;i<=m2;i++) scanf("%d",&list[][i]);
for (int i=,j=;;)
{
if (i>m1) {for (;j<=m2;j++) bo[++lb]=(BO){list[][j],}; break;}
if (j>m2) {for (;i<=m1;i++) bo[++lb]=(BO){list[][i],}; break;}
if (list[][i]<list[][j]) bo[++lb]=(BO){list[][i++],};
else if (list[][i]>list[][j]) bo[++lb]=(BO){list[][j++],};
else bo[++lb]=(BO){list[][i++],},j++;
} f[][]=f[][]=; bo[].pos=-; bo[lb+].pos=n+; bo[lb+].type=;
for (int i=;i<=lb;i++)
{
if (bo[i-].pos!=bo[i].pos-)
{
f[][i]=f[][i-]==-?-:f[][i-]+(bo[i].pos-bo[i-].pos)-;
f[][i]=f[][i-]==-?-:f[][i-]+(bo[i].pos-bo[i-].pos)-;
if (bo[i].type== || bo[i].type==) f[][i]=max(-,f[][i]-t);
if (bo[i].type== || bo[i].type==) f[][i]=max(-,f[][i]-t);
f[][i]=f[][i]==-?-:f[][i]+;
f[][i]=f[][i]==-?-:f[][i]+;
}
else f[][i]=f[][i-],f[][i]=f[][i-];
if (bo[i+].pos==bo[i].pos+)
{
if (bo[i+].type== || bo[i+].type==) f[][i]=max(-,f[][i]-t);
if (bo[i+].type== || bo[i+].type==) f[][i]=max(-,f[][i]-t);
}
f[][i]=f[][i]==-?-:f[][i]+;
f[][i]=f[][i]==-?-:f[][i]+;
if (bo[i+].pos!=bo[i].pos+ || bo[i+].type== || bo[i+].type==)
{if (f[][i]<min(t,f[][i])) turn[][i]=,f[][i]=min(t,f[][i]);}
if (bo[i+].pos!=bo[i].pos+ || bo[i+].type== || bo[i+].type==)
{if (f[][i]<min(t,f[][i])) turn[][i]=,f[][i]=min(t,f[][i]);}
}
if (f[][lb]==- && f[][lb]==-) {puts("No"); return ;}
puts("Yes");
int now=; if (f[][lb]==-) now=; lans=ltt=; int cnt=;
for (int i=lb;i;i--)
{
if (turn[now][i])
{
tt[++ltt]=bo[i].pos+;
for (int j=bo[i].pos++t-f[now][i];cnt;j+=t,cnt--) ans[++lans]=(BO){j,now};
now^=; if (bo[i+].pos==bo[i].pos+ && (bo[i+].type==now || bo[i+].type==)) cnt++;
}
if (bo[i].type==now || bo[i].type==) cnt++;
}
if (now==) tt[++ltt]=;
for (int j=t;cnt;j+=t,cnt--) ans[++lans]=(BO){j,now};
printf("%d\n",ltt);
for (int i=ltt;i;i--) printf("%d ",tt[i]); puts("");
sort(ans+,ans++lans,cmp);
printf("%d\n",lans);
for (int i=;i<=lans;i++) printf("%d %d\n",ans[i].pos,ans[i].type+);
return ;
}

Codeforces936D. World of Tank的更多相关文章

  1. [ASE]项目介绍及项目跟进——TANK BATTLE·INFINITE

    童年的记忆,大概是每周末和小伙伴们围坐在电视机前,在20来寸的电视机屏幕里守卫着这个至今都不知道是什么的白色大鸟. 当年被打爆的坦克数量估计也能绕地球个三两圈了吧. 十几年过去了,游戏从2D-3D,画 ...

  2. poj3635Full Tank?[分层图最短路]

    Full Tank? Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7248   Accepted: 2338 Descri ...

  3. Codeigniter整合Tank Auth权限类库的教程

    Codeigniter整合Tank Auth权限类库的教程一开始找了很多CodeIgniter的类库,觉得都不怎么样,后来干脆自己通过CI的钩子系统写了权限管理.但是还是不怎么满意,后来有人推荐tan ...

  4. poj 3635 Full Tank? ( bfs+dp思想 )

    Full Tank? Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5857   Accepted: 1920 Descri ...

  5. hdu 4445 Crazy Tank (暴力枚举)

    Crazy Tank Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  6. Aquarium Tank(csu1634+几何+二分)Contest2087 - 湖南多校对抗赛(2015.05.24)-G

    Aquarium Tank Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 15  Solved: 4[Submit][Status][Web Board ...

  7. Full Tank? POJ - 3635 (bfs | 最短路)

    After going through the receipts from your car trip through Europe this summer, you realised that th ...

  8. POJ 3635 - Full Tank? - [最短路变形][手写二叉堆优化Dijkstra][配对堆优化Dijkstra]

    题目链接:http://poj.org/problem?id=3635 题意题解等均参考:POJ 3635 - Full Tank? - [最短路变形][优先队列优化Dijkstra]. 一些口胡: ...

  9. POJ 3635 - Full Tank? - [最短路变形][优先队列优化Dijkstra]

    题目链接:http://poj.org/problem?id=3635 Description After going through the receipts from your car trip ...

随机推荐

  1. [BZOJ2705][SDOI2012]Longge的问题 数学

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2705 首先分析得题目所求$gcd(i,N)$的取值只可能是$N$的因子,则有$$Ans=\ ...

  2. viewport实现html页面动态缩放/meta viewport/viewport

    页面默认缩放比例为1,最小宽度为375px,在小于375px出现水平滚动条的时候重新计算显示比例缩小界面, <!DOCTYPE html> <html lang="en&q ...

  3. flask_第一个程序

    安装flask sudo pip3 install flask falsk最小应用 from flask import Flask app = Flask(__name__) @app.route(' ...

  4. 如何快速上手基础的CSS3动画

    前言 说起CSS3动画,就必须说说 transform,translate,transition,animation这4个属性,transform主要定义元素的动作,比如旋转.倾斜.位移等,trans ...

  5. 初探node.js

    一.定义及优势 定义:Node.js是一个基于 Chrome V8 引擎 的 JavaScript 运行时,它以事件驱动为基础实现了非阻塞模型. 优势:由于Web场景下的大多数任务(静态资源读取.数据 ...

  6. [BZOJ3207]:花神的嘲讽(分块解法)

    题目传送门 题目描述:背景花神是神,一大癖好就是嘲讽大J,举例如下:“哎你傻不傻的![hqz:大笨J]”“这道题又被J屎过了!!”“J这程序怎么跑这么快!J要逆袭了!”…… 描述这一天DJ在给吾等众蒟 ...

  7. TWaver可视化编辑器的前世今生(二)3D编辑器

    接着昨天的继续说哈. 作为一款高效.轻量.自带编辑功能小组件,TWaver Java在电信网管界一炮而红,在各大运营商的OSS,BSS,NMS系统中随处可见. 采用了TWaver图形组件的上海世博会监 ...

  8. SQL的几种连接

    1. 内连接 结果: 从左表中取出每一条记录,去右表中与所有的记录进行匹配: 匹配必须是某个条件是左表中与右表中相同,才会保留结果,否则不保留: 1.等值连接:在连接条件中使用等于号(=)运算符比较被 ...

  9. 分页语句where条件中的子查询有or关键字优化

    背景 开发说: 有段SQL语句,去掉order by很快,有order by之后,查询1小时都无法返回结果. 我叫他把SQL扔给我看下. SQL代码及执行计划 select * from (selec ...

  10. kvm安装图终端界面及形界面安装系统

    1.图形界面安装: qemu-img create -f qcow2 /kvm/os/vm-01.qcow2 16G mkdir -p /kvm/iso cd /kvm/iso 上传事先下载好的镜像文 ...