标签:华尔兹 int len 瑰丽 NOI2005 abs ans dp dis
在同一段时间段里滑动方向是一致的
由于有家具,所以我们每次滑动一格子。(特判的时候要注意边界
dp的 i,j 表示坐标的位置
我们的队列中如果比我们的答案要劣,那么我们就把它弹出来
在单调队列中,我们需要的往往是队头的优答案
dp[x][y] = max ( dp[x][y] , q[l].len + dis(x,y,q[l].x,q[l].y) )
#include<bits/stdc++.h> using namespace std; const int N=333; const int M=2e9+7; int dx[5]={-1,1,0,0}; int dy[5]={0,0,-1,1}; struct node { int len; int x,y; }q[N]; int n,m,x,y,k,ans; char mp[N][N]; int dp[N][N]; int dis(int xx,int yy,int xxx,int yyy) { return abs(xx-xxx)+abs(yy-yyy); } void solve(int x,int y,int len,int f) { int l=1,r=0; f--; while(1) { if(x<1||y<1||x>n||y>m) break; if(mp[x][y]=='x') l=1,r=0; else { while(l<=r&&dp[x][y]>q[r].len+dis(x,y,q[r].x,q[r].y)) r--; q[++r]=(node){dp[x][y],x,y}; while(l<=r&&(abs(x-q[l].x)>len||abs(y-q[l].y)>len)) l++; dp[x][y]=max(dp[x][y],q[l].len+dis(x,y,q[l].x,q[l].y)); ans=max(ans,dp[x][y]); } x+=dx[f]; y+=dy[f]; } return ; } int main() { ios::sync_with_stdio(false); cin>>n>>m>>x>>y>>k; for(int i=1;i<=n;i++) { cin>>mp[i]+1; } for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) dp[i][j]=-M; } dp[x][y]=0; for(int i=1;i<=k;i++) { int S,L,R,D; cin>>S>>R>>D; L=R-S+1; if(D==1) { for(int j=1;j<=m;j++) solve(n,j,L,D); } else if(D==2) { for(int j=1;j<=m;j++) solve(1,j,L,D); } else if(D==3) { for(int j=1;j<=n;j++) solve(j,m,L,D); } else if(D==4) { for(int j=1;j<=n;j++) solve(j,1,L,D); } } cout<<ans; return 0; }
%%lhm
标签:华尔兹,int,len,瑰丽,NOI2005,abs,ans,dp,dis 来源: https://www.cnblogs.com/Hehe-0/p/15306373.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。