题目链接

  我也不知道为什么脑子一抽就想了个堆优化……然后贼慢……

  因为上午听不懂wys的电音专场(快速傅立叶变换),然后就做了这么一道题。

  首先朴素DP很sb都能秒出。就是枚举时刻、位置(两维)然后转移。

  观察发现这是O(TNM)的,可以通过50%的数据。

  然后……(喂题目提示得太明显了吧)发现时间段只有200个,跟50%的T是一样的

  这简直就是明说:“快往O(KNM)上想!”

  然后我就不知道为啥想了个O(KNMlogn),qwq。

  枚举时刻改为枚举时间段,每个时间段枚举位置用堆优化(其实应该用单调队列)转移得出答案。

  虽然题目水+我的方法慢+我是sb+实现方法诡异+调了很久,1A还是很高兴的。

  (实现方法智障……可以当成锻炼代码能力嘛qwq)

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cctype>
#define maxn 205
using namespace std;
inline long long read(){
long long num=,f=;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-') f=-;
ch=getchar();
}
while(isdigit(ch)){
num=num*+ch-'';
ch=getchar();
}
return num*f;
} struct Node{
int dat,pos;
bool operator <(const Node a)const{
return dat>a.dat;
}
bool operator <=(const Node a)const{
return dat>=a.dat;
}
}; struct Heap{
Node heap[];int size;
Heap(){ size=;}
inline void push(Node x){
heap[++size]=x;
register int i=size,k;
while(i>){
k=i>>;
if(heap[k]<=heap[i]) return;
swap(heap[i],heap[k]);
i=k;
}
return;
}
inline bool empty(){ return !size; }
inline Node top(){ return heap[]; }
inline void clear(){size=;}
inline void pop(){
heap[]=heap[size--];
register int i=,k;
while((i<<)<=size){
k=i<<;
if(k<size&&heap[k|]<heap[k]) k|=;
if(heap[i]<=heap[k]) return;
swap(heap[i],heap[k]);
i=k;
}
}
}; Heap s[maxn]; int last,now=;
int f[maxn][maxn][];
char mp[maxn][maxn]; struct Line{
int from,to,dir;
bool operator <(const Line a)const{ return from<a.from; }
}q[maxn]; int main(){
int n=read(),m=read(),sx=read(),sy=read(),e=read();
for(int i=;i<=n;++i) scanf("%s",mp[i]+);
for(int i=;i<=e;++i) q[i]=(Line){read(),read(),read()};
sort(q+,q+e+);
memset(f,-/,sizeof(f));
f[sx][sy][last]=;
for(int i=;i<=e;++i){
int from=q[i].from,to=q[i].to,dir=q[i].dir;
if(dir<)
for(int j=;j<=m;++j){
s[j].clear();
if(dir==){
int cnt=;
for(int k=n;k;--k){
f[k][j][now]=-;
cnt++;
if(mp[k][j]=='x'){
s[j].clear();
continue;
}
if(s[j].empty()){
f[k][j][now]=f[k][j][last];
s[j].push((Node){f[k][j][last]-cnt,k});
continue;
}
Node ret=s[j].top();
while((!s[j].empty())&&ret.pos-k>to-from+){
s[j].pop();
ret=s[j].top();
}
if(s[j].empty()){
f[k][j][now]=f[k][j][last];
s[j].push((Node){f[k][j][last]-cnt,k});
continue;
}
//printf("%d %d %d %d\n",k,j,ret.pos,f[ret.pos][j][last]+ret.pos-k);
f[k][j][now]=max(f[k][j][last],f[ret.pos][j][last]+ret.pos-k);
s[j].push((Node){f[k][j][last]-cnt,k});
}
}
else{
int cnt=;
for(int k=;k<=n;++k){
f[k][j][now]=-;
cnt++;
if(mp[k][j]=='x'){
s[j].clear();
continue;
}
if(s[j].empty()){
f[k][j][now]=f[k][j][last];
s[j].push((Node){f[k][j][last]-cnt,k});
continue;
}
Node ret=s[j].top();
while((!s[j].empty())&&k-ret.pos>to-from+){
s[j].pop();
ret=s[j].top();
}
if(s[j].empty()){
f[k][j][now]=f[k][j][last];
s[j].push((Node){f[k][j][last]-cnt,k});
continue;
}
f[k][j][now]=max(f[k][j][last],f[ret.pos][j][last]+k-ret.pos);
s[j].push((Node){f[k][j][last]-cnt,k});
}
}
}
else
for(int j=;j<=n;++j){
s[j].clear();
if(dir==){
int cnt=;
for(int k=;k<=m;++k){
f[j][k][now]=-;
cnt++;
if(mp[j][k]=='x'){
s[j].clear();
continue;
}
if(s[j].empty()){
f[j][k][now]=f[j][k][last];
s[j].push((Node){f[j][k][last]-cnt,k});
continue;
}
Node ret=s[j].top();
while((!s[j].empty())&&k-ret.pos>to-from+){
s[j].pop();
ret=s[j].top();
}
if(s[j].empty()){
f[j][k][now]=f[j][k][last];
s[j].push((Node){f[j][k][last]-cnt,k});
continue;
}
//printf("%d %d %d\n",j,k,f[j][ret.pos][last]+k-ret.pos);
f[j][k][now]=max(f[j][k][last],f[j][ret.pos][last]+k-ret.pos);
s[j].push((Node){f[j][k][last]-cnt,k});
}
}
else{
int cnt=;
for(int k=m;k;--k){
f[j][k][now]=-;
cnt++;
if(mp[j][k]=='x'){
s[j].clear();
continue;
}
if(s[j].empty()){
f[j][k][now]=f[j][k][last];
s[j].push((Node){f[j][k][last]-cnt,k});
continue;
}
Node ret=s[j].top();
while((!s[j].empty())&&ret.pos-k>to-from+){
s[j].pop();
ret=s[j].top();
}
if(s[j].empty()){
f[j][k][now]=f[j][k][last];
s[j].push((Node){f[j][k][last]-cnt,k});
continue;
}
//printf("%d %d %d\n",j,k,f[j][ret.pos][last]+ret.pos-k);
f[j][k][now]=max(f[j][k][last],f[j][ret.pos][last]+ret.pos-k);
s[j].push((Node){f[j][k][last]-cnt,k});
}
}
}
swap(now,last);
}
int ans=;
for(int i=;i<=n;++i)
for(int j=;j<=m;++j) ans=max(ans,f[i][j][last]);
printf("%d\n",ans);
return ;
}

【Luogu】P2254瑰丽华尔兹(堆优化DP)的更多相关文章

  1. 【BZOJ1499】[NOI2005]瑰丽华尔兹 单调队列+DP

    [BZOJ1499][NOI2005]瑰丽华尔兹 Description 你跳过华尔兹吗?当音乐响起,当你随着旋律滑动舞步,是不是有一种漫步仙境的惬意?众所周知,跳华尔兹时,最重要的是有好的音乐.但是 ...

  2. 洛谷P1725 琪露诺 (单调队列/堆优化DP)

    显然的DP题..... 对于位置i,它由i-r~i-l的位置转移过来,容易得到方程 dp[i]=dp[i]+max(dp[i−r],...,dp[i−l]). 第一种:n2的暴力,只能拿部分分. 1 ...

  3. 征途堆积出友情的永恒「堆优化dp」

    直接写题解: 很简单的dp暴力转移式子:f[i]=MAX{f[j]+max(tax[j],sum[i]-sum[j])} 观察式子,只有一个变量sum[i]; 而其他都为定量; 则考虑维护 两个定量: ...

  4. 单调队列优化DP || [NOI2005]瑰丽华尔兹 || BZOJ 1499 || Luogu P2254

    题外话:题目极好,做题体验极差 题面:[NOI2005]瑰丽华尔兹 题解: F[t][i][j]表示第t时刻钢琴位于(i,j)时的最大路程F[t][i][j]=max(F[t-1][i][j],F[t ...

  5. luogu P2254 [NOI2005]瑰丽华尔兹

    题目链接 luogu P2254 [NOI2005]瑰丽华尔兹 题解 为什么我我我不放放放bzoj的链接呢? 因为打的暴力啊,然后bzojT了呀QAQQQQQ(逃 然后luogu竟然过了呀呀呀 dp[ ...

  6. BZOJ 1499 [NOI2005] 瑰丽华尔兹 | 单调队列优化DP

    BZOJ 1499 瑰丽华尔兹 | 单调队列优化DP 题意 有一块\(n \times m\)的矩形地面,上面有一些障碍(用'#'表示),其余的是空地(用'.'表示).每时每刻,地面都会向某个方向倾斜 ...

  7. bzoj1499[NOI2005]瑰丽华尔兹 单调队列优化dp

    1499: [NOI2005]瑰丽华尔兹 Time Limit: 3 Sec  Memory Limit: 64 MBSubmit: 1802  Solved: 1097[Submit][Status ...

  8. 2018.09.10 bzoj1499: [NOI2005]瑰丽华尔兹(单调队列优化dp)

    传送门 单调队列优化dp好题. 这题其实很简单. 我们很容易想到一个O(T∗n∗m)" role="presentation" style="position: ...

  9. bzoj 1499 [NOI2005]瑰丽华尔兹——单调队列优化dp

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1499 简单的单调队列优化dp.(然而当时却WA得不行.今天总算填了坑) 注意滚动数组赋初值应 ...

随机推荐

  1. MySQL基础教程——创建数据库并插入数据

    本节将介绍 MySQL 新建数据库,新建表,插入数据以及基本数据类型的相关知识.本节实验将创建一个名为 mysql_shiyan 的数据库,其中有两张表 employee和 department. 1 ...

  2. thisnkphp添加二维码

    Rcode二维码生成类QRcode.class.php实例演示 <?php //import('@.Org.QRcode');//thinkphp include_once('QRcode.cl ...

  3. 阻止form元素内的input标签回车提交表单

    <form></form>标签内input元素回车会默认提交表单. 阻止回车默认提交表单: $('form').on('keydown', function (event) { ...

  4. Manifest文件

    Manifest文件是简单的文本文件,它告知浏览器缓存的内容(或不缓存的内容) Manifest文件可以分为三个部分: 1.CAHCEMANIFEST-在此标题下列出的文件将在首次下载后进行缓存. C ...

  5. 配置Xcode的Device Orientation、AppIcon、LaunchImage

    以下图片指出的 TARGETS→General 面板的信息. 下面我们讲讲根据 APP 需求配置我们的Xcode: 1.设置 Device Orientation,指定 APP 支持设备的方向 ,我们 ...

  6. bzoj4666 小z的胡话

    题目描述: bz 题解: 乱搞好题哇. 众所周知斐波那契数列是有循环节的. 我们可以搞出在模$10^x$下与所给得数同余的集合,那么在模$10^{x+1}$下,同余集合一定是原集合及循环若干循环节的大 ...

  7. DeepFaceLab小白入门(4):提取人脸图片!

    通过上面级片文章,你应该基本知道了换脸的流出,也能换出一个视频来.此时,你可能会产生好多疑问,比如每个环节点点到底是什么意思,那些黑漆漆屏幕输出的又是什么内容,我换脸效果这么差,该如何提升?等等,好奇 ...

  8. python可视化动态图表: 关于pyecharts的sankey桑基图绘制

    最近因工作原因,需要处理一些数据,顺便学习一下动态图表的绘制.本质是使具有源头的流动信息能够准确找到其上下级关系和流向. 数据来源是csv文件 导入成为dataframe之后,列为其车辆的各部件供应商 ...

  9. jsp常用动作

    jsp:include 动态包含: jsp:forward 转发: jsp:useBean 实例化bean对象: jsp:setProperty 设置一个属性值 jsp:getProperty 获取一 ...

  10. leetcode-12-stack

    409. Longest Palindrome Given a string which consists of lowercase or uppercase letters, find the le ...