1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
| #include <iostream> #include <algorithm> #include <cstring> using namespace std; typedef long long ll; const ll N=3010; ll n,m,dp[N][N],object; char oper; void debug() { for(int i=1;i<=m;i++) { for(int j=1;j<=n;j++) cout<<dp[i][j]<<" "; cout<<endl; } } ll cal(char op,ll L,ll R,ll obj) { ll res=0; if(op=='L') { ll zhenMove=abs(L-obj); ll fanMove=n-zhenMove; if(obj<L) { if(R<L && R>obj) res+=fanMove; else res+=zhenMove; }else { if(R>L && R<obj) res+=fanMove; else res+=zhenMove; } }else { ll zhenMove=abs(R-obj); ll fanMove=n-zhenMove; if(obj<R) { if(L<R && L>obj) res+=fanMove; else res+=zhenMove; }else { if(L>R && L<obj) res+=fanMove; else res+=zhenMove; } } return res; }
int main() { ios::sync_with_stdio(false); cin.tie(0);cout.tie(0); cin>>n>>m; int opup=0; memset(dp,0x3f,sizeof(dp)); ll inf = dp[0][0]; dp[0][2]=0; ll opupObj=1; for(int i=1;i<=m;i++) { cin>>oper>>object; int op= oper=='L'? 0:1; for(int j=1;j<=n;j++) { if(dp[i-1][j]==inf) continue;
if(op==opup && op==0) { ll l=opupObj,r=j; ll pos= object%n+1; if(r!=object) dp[i][r]=min(dp[i-1][j]+cal(oper,l,r,object),dp[i][r]); if(pos!=l) dp[i][pos]=min(dp[i-1][j]+cal(oper,l,pos,object)+cal('R',l,r,pos),dp[i][pos]); pos= object==1 ? n:object-1; if(pos!=l) dp[i][pos]=min(dp[i-1][j]+cal(oper,l,pos,object)+cal('R',l,r,pos),dp[i][pos]); }else if(op==opup && op==1) { ll l=j,r=opupObj; ll pos= object%n+1; if(l!=object) dp[i][l]=min(dp[i-1][j]+cal(oper,l,r,object),dp[i][l]); if(pos!=r) dp[i][pos]=min(dp[i-1][j]+cal(oper,pos,r,object)+cal('L',l,r,pos),dp[i][pos]); pos= object==1 ? n:object-1; if(pos!=r) dp[i][pos]=min(dp[i-1][j]+cal(oper,pos,r,object)+cal('L',l,r,pos),dp[i][pos]); }else if(op==1 && opup==0) { ll l=opupObj,r=j; ll pos= object%n+1; if(l!=object) dp[i][l]=min(dp[i-1][j]+cal(oper,l,r,object),dp[i][l]); if(pos!=r) dp[i][pos]=min(dp[i-1][j]+cal(oper,pos,r,object)+cal('L',l,r,pos),dp[i][pos]); pos= object==1 ? n:object-1; if(pos!=r) dp[i][pos]=min(dp[i-1][j]+cal(oper,pos,r,object)+cal('L',l,r,pos),dp[i][pos]); }else if(op==0 && opup==1) { ll l=j,r=opupObj; ll pos= object%n+1; if(r!=object) dp[i][r]=min(dp[i-1][j]+cal(oper,l,r,object),dp[i][r]); if(pos!=l) dp[i][pos]=min(dp[i-1][j]+cal(oper,l,pos,object)+cal('R',l,r,pos),dp[i][pos]); pos= object==1 ? n:object-1; if(pos!=l) dp[i][pos]=min(dp[i-1][j]+cal(oper,l,pos,object)+cal('R',l,r,pos),dp[i][pos]); } } opup=op;opupObj=object; } ll ans=inf; for(int i=1;i<=n;i++) { ans=min(ans,dp[m][i]); }
cout<<ans<<endl; }
|