abc265e Warp

发布时间 2023-08-28 12:21:34作者: gan_coder

Warp
大概就是个dp
f[n][x][y]表示走了n步,第一种走了x次,第二种走了y次。

不过写来写去发现都会TLE,N^3怎么会TLE呢?
后面发现原来是map的写法一直有问题,
比如判断一个点是否可行,我是这样的

if (!h[make_pair(x,y)]) {

}

这样的话其实是相当于将(x,y)插入进去,所以就会变慢

正确的写法应该是

if (h.find(make_pair(x,y))==h.end()) {
}

那我以前用到map的题,究竟是怎么过的啊?

#include<algorithm>
#include<cstdio>
#include<cstring>
#include<set>
#include<queue>
#include<cmath>
#include<unordered_map>
#include<map>
#define fo(i,a,b) for (int (i)=(a);(i)<=(b);(i)++)
#define fd(i,b,a) for (int (i)=(b);(i)>=(a);(i)--)
#define mk(x,y) make_pair((x),(y))
#define mm(x,y,z) make_pair(make_pair((x),(y)),(z))
#define lc (o<<1)
#define rc ((o<<1)|1)
#define A puts("YES")
#define B puts("NO")

using namespace std;
typedef double db;
typedef long long ll;
const ll mo=998244353;
ll f[2][305][305];
map<pair<ll,ll>,bool> h;
ll p,q,n,m,u,v;
set<pair<ll,ll>> s;
ll a[10],b[10],x,y,xx,yy,w,pa,pb,pc,t[10],ans;
void add(ll &x,ll y){
	x+=y;
	if (x>=mo) x-=mo;
}
int main() {

//    freopen("data.in","r",stdin);
    scanf("%lld %lld",&n,&m);
  	fo(i,1,3) scanf("%lld %lld",&a[i],&b[i]);
  	
  	fo(i,1,m) {
  		scanf("%lld %lld",&x,&y);
  		h[mk(x,y)]=1;
	}
	
	p=1; q=0; f[1][0][0]=1;
	fo(T,0,n-1) {
		for (t[1]=0; t[1]<=T; t[1]++) {
			for (t[2]=0; t[2]<=T-t[1]; t[2]++) {
				t[3]=T-t[1]-t[2];
				
				x=y=0;
				fo(j,1,3) {
					x+=t[j]*a[j];
					y+=t[j]*b[j];
				}
				
				u=t[1];
				v=t[2];

				fo(j,1,3) {
					xx=x+a[j];
					yy=y+b[j];
					if (h.find(mk(xx,yy))==h.end()) {
						if (j==1) add(f[q][u+1][v], f[p][u][v]);
						if (j==2) add(f[q][u][v+1], f[p][u][v]);
						if (j==3) add(f[q][u][v], f[p][u][v]);
					}
				}
			}
		}
		fo(i,0,n) fo(j,0,n) f[p][i][j]=0;
		p^=1; q=1^p;
	}
	
	fo(i,0,n) fo(j,0,n) add(ans, f[p][i][j]);
	printf("%lld",ans);
	
  	
  	
	return 0;
}