T1
解题思路
这似乎是小学数学知识???mod 9就相当于各位之和mod 9,打表求了个逆元,等差数列求和公式就行了。
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> using namespace std; typedef long long LL; inline LL rd(){ LL x=0,f=1;char ch=getchar(); while(!isdigit(ch)) {f=ch=='-'?0:1;ch=getchar();} while(isdigit(ch)) {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();} return f?x:-x; } LL l,r; int q; int main(){ scanf("%d",&q); while(q--){ l=rd(),r=rd(); printf("%lld ",(r-l+1)%9*(l%9+r%9)%9*5%9); } return 0; }
T2
解题思路
最短路,求出哈利在1点与T1点到其他点的最短路,再求出罗恩在一点与T1点到其他点的最短路,然后分类讨论就行了。
// luogu-judger-enable-o2 #include<iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std; const int MAXN = 50005; const int MAXM = 100005; inline int rd(){ int x=0,f=1;char ch=getchar(); while(!isdigit(ch)) {f=ch=='-'?0:1;ch=getchar();} while(isdigit(ch)) {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();} return f?x:-x; } int n,m,head[MAXN],cnt,k,T1,T2,ans; int to[MAXM<<1],nxt[MAXM<<1],val[MAXM<<1]; int dis[MAXN][5]; //dis[x][1] 哈利1 dis[x][2] 罗恩1 dis[x][3] 哈利x dis[x][4] 罗恩x bool lim[MAXN],vis[MAXN]; queue<int> Q; inline void add(int bg,int ed,int w){ to[++cnt]=ed,nxt[cnt]=head[bg],val[cnt]=w,head[bg]=cnt; } void spfa_Harry(int st,int now){ memset(vis,false,sizeof(vis)); dis[st][now]=0;Q.push(st);vis[st]=1; register int x,u; while(!Q.empty()){ x=Q.front();Q.pop();vis[x]=0; for(register int i=head[x];i;i=nxt[i]){ u=to[i]; if(dis[x][now]+val[i]<dis[u][now]){ dis[u][now]=dis[x][now]+val[i]; if(!vis[u]){vis[u]=1;Q.push(u);} } } } } void spfa_Ron(int st,int now){ memset(vis,false,sizeof(vis)); dis[st][now]=0;vis[st]=1;Q.push(st); int x,u; while(!Q.empty()){ x=Q.front();Q.pop();vis[x]=0; for(register int i=head[x];i;i=nxt[i]){ u=to[i];if(lim[u]) continue; if(dis[x][now]+val[i]<dis[u][now]){ dis[u][now]=dis[x][now]+val[i]; if(!vis[u]) {vis[u]=1;Q.push(u);} } } } } int main(){ memset(dis,0x3f,sizeof(dis)); n=rd(),m=rd(),k=rd();int x,y,z; for(int i=1;i<=k;i++) lim[rd()]=1; for(int i=1;i<=m;i++){ x=rd(),y=rd(),z=rd(); add(x,y,z),add(y,x,z); } T1=rd(),T2=rd(); spfa_Harry(1,1);spfa_Harry(T1,2); spfa_Ron(1,3);spfa_Ron(T1,4); ans=min(min(max(dis[T1][1],dis[T2][3]),max(dis[T2][1],dis[T1][3])) ,min(min(dis[T1][1],dis[T2][1])+dis[T2][2],min(dis[T1][3],dis[T2][3])+dis[T2][4])); cout<<ans<<endl; return 0; }
T3
解题思路
大模拟,感觉没有时间复杂度难。
#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<queue> #include<algorithm> using namespace std; const int MAXN = 205; int n,m,c,k,cnt,mp[MAXN][MAXN]; int hx[MAXN],hy[MAXN],food,wx[MAXN],wy[MAXN]; int sx[4]={0,0,-1,1},sy[4]={-1,1,0,0}; bool exist[MAXN]; char s[MAXN][MAXN],zz[MAXN][MAXN]; struct Snack{ int num,len; }S[MAXN]; void dfs(int x,int y){ S[cnt].len++; mp[x][y]=cnt;bool flag=0; for(register int i=0;i<=3;i++){ int xx=x+sx[i],yy=y+sy[i]; if(xx<=0 || xx>n || yy<=0 || yy>m) continue; if(s[xx][yy]!='#' || mp[xx][yy]==cnt) continue; flag=1;dfs(xx,yy); } if(!flag) wx[cnt]=x,wy[cnt]=y; } void die(int x,int y,int id){ mp[x][y]=-1; for(register int i=0;i<=3;i++){ int xx=x+sx[i],yy=y+sy[i]; if(xx<=0 || xx>n || yy<=0 || yy>m) continue; if(mp[xx][yy]!=id) continue; die(xx,yy,id); } } inline bool pd(int x,int y){ if(x>0 && x<=n && y>0 && y<=m && mp[x][y]<=0) return true; return false; } inline bool cmp(Snack A,Snack B){ if(A.len==B.len) return A.num<B.num; return A.len>B.len; } int main(){ scanf("%d%d%d",&n,&m,&k); for(int i=1;i<=n;i++) scanf("%s",s[i]+1); for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ if(s[i][j]=='&') mp[i][j]=-1,food++; if(s[i][j]=='@'){ cnt++; hx[cnt]=i,hy[cnt]=j; dfs(i,j);exist[cnt]=1; S[cnt].num=cnt; } } } // for(int i=1;i<=n;i++){ // for(int j=1;j<=m;j++) // cout<<mp[i][j]<<" "; // cout<<endl; // } for(int i=1;i<=cnt;i++) scanf("%s",zz[i]+1); for(int i=1;i<=k;i++) for(int j=1;j<=cnt;j++){ if(!exist[j]) continue; if(zz[j][i]=='D') { hy[j]++; if(!pd(hx[j],hy[j])) { die(hx[j],hy[j]-1,j); food+=S[j].len; exist[j]=0;S[j].len=0; continue; } if(mp[hx[j]][hy[j]]==-1){ food--;S[j].len++; mp[hx[j]][hy[j]]=j; continue; } mp[hx[j]][hy[j]]=j; for(register int t=0;t<=3;t++){ int xx=wx[j]+sx[t],yy=wy[j]+sy[t]; if(mp[xx][yy]==j) { mp[wx[j]][wy[j]]=0; wx[j]=xx,wy[j]=yy; break; } } } if(zz[j][i]=='A') { hy[j]--; if(!pd(hx[j],hy[j])) { die(hx[j],hy[j]+1,j); food+=S[j].len; exist[j]=0;S[j].len=0; continue; } if(mp[hx[j]][hy[j]]==-1){ food--;S[j].len++; mp[hx[j]][hy[j]]=j; continue; } mp[hx[j]][hy[j]]=j; for(register int t=0;t<=3;t++){ int xx=wx[j]+sx[t],yy=wy[j]+sy[t]; if(mp[xx][yy]==j) { mp[wx[j]][wy[j]]=0; mp[xx][yy]=1; wx[j]=xx,wy[j]=yy; break; } } } if(zz[j][i]=='W') { hx[j]--; if(!pd(hx[j],hy[j])) { die(hx[j]+1,hy[j],j); food+=S[j].len; exist[j]=0;S[j].len=0; continue; } if(mp[hx[j]][hy[j]]==-1){ food--;S[j].len++; mp[hx[j]][hy[j]]=j; continue; } mp[hx[j]][hy[j]]=j; for(register int t=0;t<=3;t++){ int xx=wx[j]+sx[t],yy=wy[j]+sy[t]; if(mp[xx][yy]==j) { mp[wx[j]][wy[j]]=0; mp[xx][yy]=1; wx[j]=xx,wy[j]=yy; break; } } } if(zz[j][i]=='S') { hx[j]++; if(!pd(hx[j],hy[j])) { die(hx[j]-1,hy[j],j); food+=S[j].len; exist[j]=0;S[j].len=0; continue; } if(mp[hx[j]][hy[j]]==-1){ food--;S[j].len++; mp[hx[j]][hy[j]]=j; continue; } mp[hx[j]][hy[j]]=j; for(register int t=0;t<=3;t++){ int xx=wx[j]+sx[t],yy=wy[j]+sy[t]; if(mp[xx][yy]==j) { mp[wx[j]][wy[j]]=0; mp[xx][yy]=1; wx[j]=xx,wy[j]=yy; break; } } } } sort(S+1,S+1+cnt,cmp); // for(int i=1;i<=n;i++){ // for(int j=1;j<=m;j++) // cout<<mp[i][j]<<" "; // cout<<endl; // } for(int i=1;i<=cnt;i++) printf("%d %d ",S[i].len,S[i].num); printf("%d",food); return 0; }