第一题,直接暴力。注意边界,可以直接平移矩形
#include<iostream>
#include<cstdio>
#define ll long long
using namespace std;
const int N=150;
int d,n;
int fl[N*3][N*3];
ll ans[N*3][N*3],max1,ans1;
int main(){
scanf("%d%d",&d,&n);
for(int i=1;i<=n;i++){
int x,y,k;
scanf("%d%d%d",&x,&y,&k);
x=x+N,y=y+N;
fl[x][y]=k;
}
for(int i=N;i<=128+N;i++)
for(int j=N;j<=128+N;j++)
for(int k=-d;k<=d;k++)
for(int l=-d;l<=d;l++)
ans[i][j]+=fl[i+k][j+l];
for(int i=N;i<=128+N;i++)
for(int j=N;j<=128+N;j++){
if(ans[i][j]>max1){
max1=ans[i][j];
ans1=0;
}
if(ans[i][j]==max1){
ans1++;
}
}
printf("%lld %lld",ans1,max1);
return 0;
}
至于第二题 正反向建图,后bfs
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,m,x,y,s,t,num,sum,f2;
int h[10050],fla[10050],fl[10050];
int q[5000000],zd[10050];
struct edge{
int next1;
int to1;
}a[5000000];
void bfs1(int x)
{
int hhh=1,ttt=1;
q[hhh]=x; fla[x]=1;
while(hhh<=ttt)
{
x=q[hhh];
for(int i=h[x];i>0;i=a[i].next1)
if(fla[a[i].to1]==0)
{
ttt++;
q[ttt]=a[i].to1;
fla[a[i].to1]=1;
}
hhh++;
}
}
void bfs2(int x,int y)
{
memset(q,0,sizeof(q));
int hd=1,tl=1;
q[hd]=x;
while(hd<=tl)
{
int x1=q[hd];
for(int i=h[x1];i>0;i=a[i].next1)
{
if(fla[a[i].to1]==1)
{
tl++;
q[tl]=a[i].to1;
zd[tl]=zd[hd]+1;
if(q[tl]==y){cout<<zd[tl]; f2=1;}
fla[q[tl]]=0;
}
}
hd++;
}
}
int main()
{
cin>>n>>m;
for(int i=1;i<=m;i++)
{
cin>>x>>y;
a[i].next1=h[y];
a[i].to1=x;
h[y]=i;
}
cin>>s>>t;
bfs1(t);
for(int i=1;i<=n;i++)
if(fla[i]==0)
for(int j=h[i];j>0;j=a[j].next1)
fl[a[j].to1]=1;
for(int i=1;i<=n;i++)
if(fla[i]!=0&&fl[i]==1)
fla[i]=0;
bfs2(t,s);
if(f2==0) cout<<"-1";
return 0;
}
第三题 取模思想 注意要有一个好质数!!!!!
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int p=2147483647;
char b[100500];
int n,m;
int l[150],r[150],ll,rr,numl[150],numr[150],suml,sumr;
long long ans=0,f[200],anss[1000500];
inline long long zn(int x){
long long ans=0,sum=1;
long long lb=strlen(b)-1;
while(lb>=x){
ans=(ans+((b[lb]-'0')*sum)%p)%p;
sum=(sum*10)%p;
lb--;
}
return ans;
}
inline void work(int x){
if(b[0]=='-') { rr++;numr[rr]=x;r[rr]=zn(1); }
else { ll++;numl[ll]=x;l[ll]=zn(0);}
}
int main(){
//freopen("ccc.in","r",stdin);
//freopen("ccc.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=0;i<=n;i++){
scanf("%s",b);
work(i);
}
for(int i=1;i<=m;i++){
f[0]=1;suml=0;sumr=0;
for(int j=1;j<=n;j++){
f[j]=(f[j-1]*i)%p;
}
for(int j=1;j<=ll;j++)
suml=(suml+l[j]*f[numl[j]]%p)%p;
for(int j=1;j<=rr;j++)
sumr=(sumr+r[j]*f[numr[j]]%p)%p;
if((suml%p)==(sumr%p)) ans++,anss[ans]=i;
}
printf("%lld\n",ans);
for(int i=1;i<=ans;i++)
printf("%lld\n",anss[i]);
return 0;
}