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;
}
标签:ll,make,Warp,fo,pair,include,abc265e,lld
From: https://www.cnblogs.com/ganking/p/17661991.html