#include<cstdio>
#include<iostream>
using namespace std;
const int N=2e2+10;
int n,m,k,T,a[N][N],x,y,Walk,IQ;
int dx[8]={-1,-1,0,1,1,1,0,-1},dy[8]={0,1,1,1,0,-1,-1,-1};
bool b[N][N],Dig[N][N];
int main(){
scanf("%d%d%d",&n,&m,&k);Walk=k;
for(register int i=1;i<=n;i++)
for(register int j=1;j<=m;j++)
scanf("%d",&a[i][j]);
for(register int i=1;i<=n;i++)
for(register int j=1;j<=m;j++)
scanf("%d",&b[i][j]);
scanf("%d",&T);
while(T--){
scanf("%d%d",&x,&y);
if(!b[x][y]||Dig[x][y]||(!a[x][y]&&Walk<10)){printf("-1 -1\n");return 0;}
Dig[x][y]=true;
for(register int i=0;i<=7;i++)b[x+dx[i]][y+dy[i]]=true;
if(!a[x][y])Walk-=10,IQ+=10;
else Walk=min(Walk+a[x][y],k);
}
printf("%d %d\n",Walk,IQ);return 0;
}
#include<cstdio>
#include<iostream>
using namespace std;
const int N=5e5+10;
int n,a[N],fa[N],head[N],cnt,pre[N],ans;
struct edge{int nxt,to;}ed[N];
inline void addedge(int x,int y){ed[++cnt].to=y;ed[cnt].nxt=head[x];head[x]=cnt;}
inline void DFS(int u){
pre[u]=ans;
for(register int i=head[u];i;i=ed[i].nxt)
if(a[u]==a[ed[i].to])DFS(ed[i].to);
}
int main(){
scanf("%d",&n);
for(register int i=1;i<=n;i++)scanf("%d",&a[i]);
for(register int i=1;i<=n;i++){
if(i!=1)addedge(fa[i],i);
for(register int j=(i<<1);j<=n;j+=i)
if(!fa[j])fa[j]=i;else if(a[i]!=a[j])fa[j]=i;
}
for(register int i=1;i<=n;i++)if(!pre[i])++ans,DFS(i);
printf("%d\n",ans);return 0;
}
\[dis[i][j+1]|=dis[k][j],dis[i][j][k]==1\]
#include<cstdio>
#include<iostream>
#include<bitset>
using namespace std;
const int N=1e2+10;
const int LOG=31;
int n,m,U,V,l,a,b,Q;
bitset<N>dis[N][33],ans,tmp;
int main(){
scanf("%d%d",&n,&m);
for(register int i=1;i<=m;i++)
scanf("%d%d",&U,&V),dis[U][0][V]=1;
for(register int j=0;j<=LOG;j++)
for(register int i=1;i<=n;i++)
for(register int k=1;k<=n;k++)
if(dis[i][j][k])dis[i][j+1]|=dis[k][j];//若数组紧贴着LOG开这里加一会超过范围!!!
scanf("%d",&Q);
while(Q--){
scanf("%d%d%d",&l,&a,&b);
ans.reset();ans[a]=1;
for(register int i=0;i<=LOG;i++){
if(!(l>>i))break;
if((l>>i)&1){
tmp=ans;ans.reset();
for(register int j=1;j<=n;j++)if(tmp[j])ans|=dis[j][i];
}
}
puts(ans[b]? "YES":"NO");
}
return 0;
}
原文:https://www.cnblogs.com/ForwardFuture/p/9866333.html