专栏文章

题解:CF1202C You Are Given a WASD-string...

CF1202C题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@miq83slq
此快照首次捕获于
2025/12/04 00:30
3 个月前
此快照最后确认于
2025/12/04 00:30
3 个月前
查看原文

CF1202C You Are Given a WASD-string...

*2100
给你一个操作序列,求在任意位置插入一个 tt\in WASD,使得包含路径的最小矩形的面积最小。
s2×105|s|\le 2\times 10^5
简单题,插入一个操作仅会将后面所有到达的位置向相应方向移动一格,于是记录前后缀相应坐标的最大最小值,然后求解时直接给后缀加上相应位移再计算面积即可。枚举所有的空隙以及操作符,时间复杂度 O(n)O(n)
CPP
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+7;
char s[maxn]; int dx[maxn],dy[maxn];
int posx[maxn],posy[maxn];
int pxmi[maxn],pymi[maxn];
int pxmx[maxn],pymx[maxn];
int sxmi[maxn],symi[maxn];
int sxmx[maxn],symx[maxn];
int dxl[]={1,-1,0,0},dyl[]={0,0,-1,1};
void solve(){
    cin>>s; int n=strlen(s);
    for(int i=1;i<=n;i++) dx[i]=s[i-1]=='W'?-1:(s[i-1]=='S'?1:0),dy[i]=s[i-1]=='A'?-1:(s[i-1]=='D'?1:0);
    for(int i=1;i<=n;i++){
        posx[i]=posx[i-1]+dx[i];
        posy[i]=posy[i-1]+dy[i];
        pxmi[i]=min(pxmi[i-1],posx[i]);
        pxmx[i]=max(pxmx[i-1],posx[i]);
        pymi[i]=min(pymi[i-1],posy[i]);
        pymx[i]=max(pymx[i-1],posy[i]);
    }
    sxmi[n]=sxmx[n]=posx[n];
    symi[n]=symx[n]=posy[n];
    for(int i=n-1;~i;i--){
        sxmi[i]=min(sxmi[i+1],posx[i]);
        sxmx[i]=max(sxmx[i+1],posx[i]);
        symi[i]=min(symi[i+1],posy[i]);
        symx[i]=max(symx[i+1],posy[i]);
    }
    long long ans=1ll*(pxmx[n]-pxmi[n]+1)*(pymx[n]-pymi[n]+1);
    for(int i=0;i<=n;i++){
        for(int j=0;j<4;j++){
            int tx=dxl[j],ty=dyl[j];
            int xl=min(sxmi[i]+tx,pxmi[i]),xr=max(sxmx[i]+tx,pxmx[i]);
            int yl=min(symi[i]+ty,pymi[i]),yr=max(symx[i]+ty,pymx[i]);
            ans=min(ans,1ll*(xr-xl+1)*(yr-yl+1));
        }
    }
    cout<<ans<<'\n';
}
signed main(){
    int T; cin>>T; while(T--) solve();
    return 0;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...