bzoj1499 [NOI2005]瑰丽华尔兹

bzoj1499 [NOI2005]瑰丽华尔兹


这题面是什么鬼。。。

  1. 没卵用
  2. cogs上:随着“强弱弱”的节奏,托尼的晕船症也奇迹般地一点一点恢复。
    bzoj上:随着“嘣嚓嚓”的节奏,托尼的晕船症也奇迹般的消失了。
    洛谷上:根本没有这段题面
    2333333333333
  3. bzoj上:当1900的音乐获得邮轮上所有人的欢迎时,他才8岁,而此时的他已经乘着海轮往返欧美大陆50余次了。
    欧美大陆???长见识了
  4. 这题tm居然是lrj出的= =(OTZ)

扯淡结束
这题不就是dp吗?
f[i][j][k]表示i时间段 piano到了点(j,k) 求piano这一段滑行的最长距离
\(f[i][j]=\sum f[i'][j']+dist\)
\(i',j'\)表示能转移过来的点
于是暴力dp出炉

// It is made by XZZ
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define rep(a,b,c) for(rg int a=b;a<=c;a++)
#define drep(a,b,c) for(rg int a=b;a>=c;a--)
#define erep(a,b) for(rg int a=fir[b];a;a=nxt[a])
#define il inline
#define rg register
#define vd void
typedef long long ll;
il int gi(){
    rg int x=0;rg char ch=getchar();
    while(ch<'0'||ch>'9')ch=getchar();
    while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
    return x;
}
const int maxx=201;
const int X[]={23333,-1,1,0,0},Y[]={23333,0,0,-1,1};
int n,m,_x,_y,k,inf;
int f[2][maxx][maxx];
int s[maxx],t[maxx],p[maxx];
char c[maxx][maxx];
il vd Max(int&a,int b){a=max(a,b);}
int main(){
    n=gi(),m=gi(),_x=gi(),_y=gi(),k=gi();
    rep(i,1,n)scanf("%s",c[i]+1);
    rep(i,1,k)s[i]=gi(),t[i]=gi(),p[i]=gi();
    memset(f[0],-127,sizeof f[0]);inf=-f[0][0][0];
    f[0][_x][_y]=0;
    int now=0;
    rep(i,1,k){
        now^=1;
        memset(f[now],-127,sizeof f[now]);
        rep(j,1,n)rep(l,1,m){
            if(c[j][l]=='x')continue;
            static int lim,x,y;
            lim=t[i]-s[i]+1,x=j,y=l;
            rep(o,0,lim){
                if(x==0||x==n+1||y==0||y==m+1)break;
                if(c[x][y]=='x')break;
                Max(f[now][j][l],o+f[now^1][x][y]);
                x-=X[p[i]],y-=Y[p[i]];
            }
        }
    }
    int ans=-inf;
    rep(i,1,n)rep(j,1,m)Max(ans,f[now][i][j]);
    printf("%d\n",ans);
    return 0;
}

傻B了什么优化都不加竟然A了。。。
暴力A了就A了吧……用暴力A掉此题对于写程序的人来说没有任何益处,对lrj更没坏处
不过05年的渣渣机子跑不过23333
然后
不会单调队列
加了决策优化
时间变成原来的一半啊。。。
提交记录

// It is made by XZZ
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define rep(a,b,c) for(rg int a=b;a<=c;a++)
#define drep(a,b,c) for(rg int a=b;a>=c;a--)
#define erep(a,b) for(rg int a=fir[b];a;a=nxt[a])
#define il inline
#define rg register
#define vd void
typedef long long ll;
il int gi(){
    rg int x=0;rg char ch=getchar();
    while(ch<'0'||ch>'9')ch=getchar();
    while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
    return x;
}
const int maxx=201;
const int X[]={23333,-1,1,0,0},Y[]={23333,0,0,-1,1};
int n,m,_x,_y,k,inf;
int f[2][maxx][maxx];
int s[maxx],t[maxx],p[maxx];
char c[maxx][maxx];
il vd Max(int&a,int b){a=max(a,b);}
int main(){
    n=gi(),m=gi(),_x=gi(),_y=gi(),k=gi();
    rep(i,1,n)scanf("%s",c[i]+1);
    rep(i,1,k)s[i]=gi(),t[i]=gi(),p[i]=gi();
    memset(f[0],-127,sizeof f[0]);inf=-f[0][0][0];
    f[0][_x][_y]=0;
    int now=0;
    rep(i,1,k){
        now^=1;
        memset(f[now],-127,sizeof f[now]);
        if(p[i]==1)rep(l,1,m){
                int lst=-1;
                drep(j,n,1){
                    if(c[j][l]=='x')continue;
                    static int lim,x,y;
                    lim=min(t[i]-s[i]+1,lst+1),x=j,y=l;
                    rep(o,0,lim){
                        if(x==0||x==n+1||y==0||y==m+1)break;
                        if(c[x][y]=='x')break;
                        if(f[now][j][l]<o+f[now^1][x][y])lst=o,f[now][j][l]=o+f[now^1][x][y];
                        x-=X[p[i]],y-=Y[p[i]];
                    }
                }
            }
        else if(p[i]==2)rep(l,1,m){
                int lst=-1;
                rep(j,1,n){
                    if(c[j][l]=='x')continue;
                    static int lim,x,y;
                    lim=min(t[i]-s[i]+1,lst+1),x=j,y=l;
                    rep(o,0,lim){
                        if(x==0||x==n+1||y==0||y==m+1)break;
                        if(c[x][y]=='x')break;
                        if(f[now][j][l]<o+f[now^1][x][y])lst=o,f[now][j][l]=o+f[now^1][x][y];
                        x-=X[p[i]],y-=Y[p[i]];
                    }
                }
            }
        else if(p[i]==3)rep(j,1,n){
                int lst=-1;
                drep(l,m,1){
                    if(c[j][l]=='x')continue;
                    static int lim,x,y;
                    lim=min(t[i]-s[i]+1,lst+1),x=j,y=l;
                    rep(o,0,lim){
                        if(x==0||x==n+1||y==0||y==m+1)break;
                        if(c[x][y]=='x')break;
                        if(f[now][j][l]<o+f[now^1][x][y])lst=o,f[now][j][l]=o+f[now^1][x][y];
                        x-=X[p[i]],y-=Y[p[i]];
                    }
                }
            }
        else rep(j,1,n){
                int lst=-1;
                rep(l,1,m){
                    if(c[j][l]=='x')continue;
                    static int lim,x,y;
                    lim=min(t[i]-s[i]+1,lst+1),x=j,y=l;
                    rep(o,0,lim){
                        if(x==0||x==n+1||y==0||y==m+1)break;
                        if(c[x][y]=='x')break;
                        if(f[now][j][l]<o+f[now^1][x][y])lst=o,f[now][j][l]=o+f[now^1][x][y];
                        x-=X[p[i]],y-=Y[p[i]];
                    }
                }
            }
    }
    int ans=-inf;
    rep(i,1,n)rep(j,1,m)Max(ans,f[now][i][j]);
    printf("%d\n",ans);
    return 0;
}

更新:题面来自于电影《海上钢琴师》评分巨高

posted @ 2017-10-05 09:22  菜狗xzz  阅读(213)  评论(1编辑  收藏  举报