郑州寄 8.13

前言

业精于勤荒于嬉,行成于思毁于随

正文(模拟赛)

卦象:大吉

感受:原来 大吉 = 100pts,没什么可说的,今天达成了这辈子最重大的决策失误——打 T2 的暴力。T1 不必多言,一个小时码完了(然而被卡常,获得 80pts)。后开 T2、T3、T4,最后一题出题人的语文包信竞教练教的,T3 感觉可能是一些神秘复杂度题,就没有写,所以就写 T2。感觉时间充裕,决策先打暴力再写正解,暴力用来对拍。结果暴力写挂,没时间写正解了,最后十来分钟才把暴力写完,结果 40pts 还挂了 20pts,真是吐了

T1

ST 表改成前缀 max 就过了

T2

\(f_{i,j,S}\) 表示到 \(i,j\) 状压最后两步为 \(S(0 \le S \le 3)\) 的方案数

转移不说了,一堆细节特判

死因:忘记判断“马”是否越界了……

贴个代码辅助理解

点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e3+5,M=1e4+5,MOD=998244353;
int n,m,x[M],y[M],f[N][N][5];bool a[N][N];
const int dx4[]={0,-1,0,1},dy4[]={-1,0,1,0};
const int dx8[]={-1,1,2,2,1,-1,-2,-2};
const int dy8[]={2,2,1,-1,-2,-2,-1,1};
inline void ADD(int &x,int y){
    x%=MOD;y%=MOD;x=(x+y)%MOD;
    return;
}
inline bool inbound(int x,int y){return x>=1&&x<=n&&y>=1&&y<=n;}
inline bool ini(int x,int y){
    for(int i=0;i<8;i++){
        int nx=x+dx8[i],ny=y+dy8[i];
        if(!inbound(nx,ny)||!a[nx][ny])continue;
        if(!a[nx+dx4[i/2]][ny+dy4[i/2]])return false;
    }
    return true;
}
inline bool judge(int x,int y){
    for(int i=0;i<8;i++){
        if(i==5||i==6)continue;
        int nx=x+dx8[i],ny=y+dy8[i];
        if(!inbound(nx,ny)||!a[nx][ny])continue;
        if(!a[nx+dx4[i/2]][ny+dy4[i/2]])return false;
    }
    return true;
}
inline void trans(int x,int y){
    if(!judge(x,y))return;
    bool o1=((x>2&&y>1)?a[x-2][y-1]:0);
    bool o2=((x>1&&y>2)?a[x-1][y-2]:0);
    bool o=((x>1&&y>1)?a[x-1][y-1]:0);
    if(o||(!o1&&!o2))ADD(f[x][y][0],(x>1?f[x-1][y][0]:0));
    if(o||!o2)ADD(f[x][y][0],(x>1?f[x-1][y][2]:0));
    if(!o2)ADD(f[x][y][2],(x>1?f[x-1][y][1]:0));
    if(!o1)ADD(f[x][y][2],(x>1?f[x-1][y][3]:0));
    if(!o2)ADD(f[x][y][1],(y>1?f[x][y-1][0]:0));
    if(!o1)ADD(f[x][y][1],(y>1?f[x][y-1][2]:0));
    if(o||!o1)ADD(f[x][y][3],(y>1?f[x][y-1][1]:0));
    if(o||(!o1&&!o2))ADD(f[x][y][3],(y>1?f[x][y-1][3]:0));
    return;
}
signed main(){
    freopen("centrallimit.in","r",stdin);
    freopen("centrallimit.out","w",stdout);
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    cin>>n>>m;n++;
    for(int i=1;i<=m;i++){
        cin>>x[i]>>y[i];x[i]++,y[i]++;
        if(x[i]!=1||y[i]!=1)a[x[i]][y[i]]=true;
    }
    if(!ini(1,1)){cout<<0<<endl;return 0;}
    f[1][2][1]=ini(1,2);f[2][1][0]=ini(2,1);
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            if(i+j<=3)continue;
            trans(i,j);
        }
    }

    // for(int i=1;i<=n;i++){
    //     for(int j=1;j<=n;j++){
    //         cerr<<"Zyx "<<i<<' '<<j<<": ";
    //         for(int S=0;S<=3;S++)cerr<<f[i][j][S]<<' ';
    //         cerr<<endl;
    //     }
    // }

    int ans=0;
    for(int S=0;S<=3;S++)ADD(ans,f[n][n][S]);
    cout<<ans<<'\n';
    return 0;
}

T3

抱歉,\(0\) 个人想写

T4

离线,按时间倒序扫描线,然后依次插入

剩下的就是树套树维护……

据说是 混合果汁 这道题目上树

小结

加训用脚能力

正文(加餐)

杂题选讲,难绷

关键词:启发式搜索,估价函数,扫描线,复杂度平衡,DP

搜索题其实都写过(当初为了出一套搜索模拟赛,所以就都有写)

扫描线的部分 shr 也讲的差不多了

至于杂题选讲,那么就仁者见仁智者见智咯!

后记

世界孤立我任它奚落

完结撒花!

posted @ 2025-08-13 20:43  sunxuhetai  阅读(7)  评论(0)    收藏  举报