郑州寄 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 也讲的差不多了
至于杂题选讲,那么就仁者见仁智者见智咯!
后记
世界孤立我任它奚落
完结撒花!