重现地址:牛客重现赛
A.dreamstart的催促
这是快速幂的模板题,注意$(a + b)\% c = ((a\% c) + (b\% c))\% c$
1 # include <iostream> 2 # include <cstdio> 3 using namespace std; 4 const int maxn = 1e5+5; 5 const long long MOD = 10000019; 6 long long num[maxn]; 7 int N; 8 void Init() 9 { 10 for(int i=0;i<N;i++) 11 scanf("%lld",&num[i]); 12 } 13 long long getnum(long long a,long long b) 14 { 15 long long res = 1; 16 while(b) 17 { 18 if(b&1) res = res*a%MOD; 19 a = a*a%MOD; 20 b >>= 1; 21 } 22 return res; 23 } 24 void Solve() 25 { 26 long long ans = 0; 27 for(int i=0;i<N;i++) 28 ans += getnum(num[i],i+1); 29 ans = ans%MOD; 30 printf("%lld\n",ans); 31 } 32 int main() 33 { 34 while(scanf("%d",&N)!=EOF) 35 { 36 Init(); 37 Solve(); 38 } 39 return 0; 40 }
B.TRDD got lost again
一看就是BFS的搜索题,唯一特殊的移动的步幅为2。同时注意有两个坑:1.输入包含空格,用scanf会超时;2.题目卡空间,标记数组vis用bool不要用int
1 # include <iostream> 2 # include <cstdio> 3 # include <cstring> 4 # include <algorithm> 5 # include <queue> 6 using namespace std; 7 const int maxn = 6005; 8 char Map[maxn][maxn],c; 9 int N,M; 10 bool vis[maxn][maxn]; 11 int Sx,Sy,Tx,Ty; 12 int dx[4] = {0,2,0,-2}; 13 int dy[4] = {2,0,-2,0}; 14 struct Node 15 { 16 int x,y,t; 17 Node(){} 18 Node(int xx,int yy,int tt) 19 { 20 x = xx; 21 y = yy; 22 t = tt; 23 } 24 }; 25 void Init() 26 { 27 N = N*2+1; 28 M = M*2+1; 29 for(int i=0;i<N;i++) 30 { 31 getchar(); 32 for(int j=0;j<M;j++) 33 { 34 Map[i][j]=getchar(); 35 if(Map[i][j]=='S') 36 { 37 Sx=i; 38 Sy=j; 39 } 40 if(Map[i][j]=='T') 41 { 42 Tx=i; 43 Ty=j; 44 } 45 } 46 } 47 memset(vis,false,sizeof(vis)); 48 } 49 void Solve() 50 { 51 int ans = -1; 52 queue<Node> Q; 53 Q.push(Node(Sx,Sy,1)); 54 vis[Sx][Sy] = 1; 55 while(!Q.empty()) 56 { 57 Node temp = Q.front(); 58 Q.pop(); 59 if(Map[temp.x][temp.y] == 'T') 60 { 61 ans = temp.t; 62 break; 63 } 64 for(int i=0;i<4;i++) 65 { 66 int nx = temp.x+dx[i]; 67 int ny = temp.y+dy[i]; 68 int tempx = temp.x+dx[i]/2; 69 int tempy = temp.y+dy[i]/2; 70 if(nx>=1&&nx<N&&ny>=1&&ny<M) 71 { 72 if((Map[tempx][tempy]==' ')&&(Map[nx][ny]==' '||Map[nx][ny]=='T')) 73 if(!vis[nx][ny]) 74 { 75 Q.push(Node(nx,ny,temp.t+1)); 76 vis[nx][ny] = true; 77 } 78 } 79 } 80 } 81 if(ans>0) 82 printf("%d\n",ans); 83 else 84 printf("TRDD Got lost...TAT\n"); 85 } 86 int main() 87 { 88 while(scanf("%d%d",&N,&M)!=EOF) 89 { 90 Init(); 91 Solve(); 92 } 93 return 0; 94 }
C.Company
所有的村庄是一个树的结构,某个节点的答案来自于两个部分:1.该节点的所有子节点的答案和;2.该节点自身是否劳动力不足,不足就为1,否则为0
1 # include <iostream> 2 # include <cstdio> 3 # include <vector> 4 # include <cstring> 5 using namespace std; 6 const int maxn = 2e5+10; 7 int num[maxn],vis[maxn],ans[maxn]; 8 vector<int> G[maxn]; 9 int n,k; 10 void Init() 11 { 12 int u,v; 13 for(int i=1;i<=n;i++) 14 scanf("%d",&num[i]); 15 for(int i=0;i<maxn;i++) 16 G[i].clear(); 17 for(int i=0;i<n-1;i++) 18 { 19 scanf("%d%d",&u,&v); 20 G[u].push_back(v); 21 G[v].push_back(u); 22 } 23 memset(vis,0,sizeof(vis)); 24 memset(ans,0,sizeof(ans)); 25 } 26 void dfs(int x) 27 { 28 if(num[x]<=k) 29 ans[x]++; 30 for(int i=0;i<G[x].size();i++) 31 { 32 if(!vis[G[x][i]]) 33 { 34 vis[G[x][i]] = 1; 35 dfs(G[x][i]); 36 ans[x] += ans[G[x][i]]; 37 } 38 } 39 } 40 void Solve() 41 { 42 vis[1] = 1; 43 dfs(1); 44 for(int i=1;i<=n;i++) 45 { 46 if(i<n) 47 printf("%d ",ans[i]); 48 else 49 printf("%d\n",ans[i]); 50 } 51 } 52 int main() 53 { 54 while(scanf("%d%d",&n,&k)!=EOF) 55 { 56 Init(); 57 Solve(); 58 } 59 return 0; 60 }
D.A-B-C
一个简单模拟题
1 # include <iostream> 2 # include <cstdio> 3 using namespace std; 4 const int maxn = 5005; 5 int N,num[maxn]; 6 void Init() 7 { 8 for(int i=1;i<=N;i++) 9 scanf("%d",&num[i]); 10 } 11 void Solve() 12 { 13 int f = 0; 14 for(int i=1;i<=N;i++) 15 { 16 int l = num[i]; 17 int ll = num[l]; 18 if(i==num[ll]) 19 { 20 f = 1; 21 break; 22 } 23 } 24 if(f) printf("YES\n"); 25 else printf("NO\n"); 26 } 27 int main() 28 { 29 while(scanf("%d",&N)!=EOF) 30 { 31 Init(); 32 Solve(); 33 } 34 return 0; 35 }
E.PPY的字符串
模拟题,我用结构体存储字符串的信息,112333-》(2,1)(1,2)(3,3)
1 # include <iostream> 2 # include <cstdio> 3 # include <cstring> 4 using namespace std; 5 const int maxn = 1e5; 6 struct Node 7 { 8 char c; 9 int n; 10 Node(){} 11 Node(char cc,int nn) 12 { 13 c = cc; 14 n = nn; 15 } 16 }; 17 Node ss[maxn]; 18 char s[maxn]; 19 int N; 20 void change() 21 { 22 int k = 0; 23 char tempnum = s[0]; 24 int tempcnt = 1; 25 int L = strlen(s); 26 for(int i=1;i<L;i++) 27 { 28 if(s[i]==tempnum) 29 tempcnt++; 30 else 31 { 32 ss[k++] = Node(tempnum,tempcnt); 33 tempnum = s[i]; 34 tempcnt = 1; 35 } 36 } 37 ss[k++] = Node(tempnum,tempcnt); 38 int f = 0; 39 for(int i=0;i<k;i++) 40 { 41 s[f++] = char(ss[i].n+'0'); 42 s[f++] = ss[i].c; 43 } 44 s[f] = '\0'; 45 } 46 void Solve() 47 { 48 for(int i=0;i<N-1;i++) 49 change(); 50 printf("%d %s\n",strlen(s),s); 51 } 52 int main() 53 { 54 while(scanf("%s%d",s,&N)!=EOF) 55 { 56 Solve(); 57 } 58 return 0; 59 }
F.集训队的脱单大法
数据很水,暴力求解
1 # include <iostream> 2 # include <cstdio> 3 # include <cmath> 4 using namespace std; 5 const int maxn = 1e5+5; 6 int num[maxn]; 7 int n; 8 void Init() 9 { 10 for(int i=0;i<n;i++) 11 scanf("%d",&num[i]); 12 } 13 int getmax(int l,int r) 14 { 15 int res = -1; 16 for(int i=l;i<=r;i++) 17 res = max(res,num[i]); 18 return res; 19 } 20 void Solve() 21 { 22 int res = -1; 23 for(int i=0;i<n-1;i++) 24 { 25 int Lmax = getmax(0,i); 26 int Rmax = getmax(i+1,n-1); 27 res = max(res,abs(Lmax-Rmax)); 28 } 29 printf("%d\n",res); 30 } 31 int main() 32 { 33 while(scanf("%d",&n)!=EOF) 34 { 35 Init(); 36 Solve(); 37 } 38 return 0; 39 }
G.不想再WA了
数据很水,直接dfs
1 # include <iostream> 2 # include <cstdio> 3 using namespace std; 4 const int maxn = 105; 5 int cnt,N,s[maxn]; 6 void Init() 7 { 8 scanf("%d",&N); 9 cnt = 0; 10 } 11 bool judge() 12 { 13 for(int i=0;i+1<N;i++) 14 if(s[i]==3&&s[i+1]==1) 15 return false; 16 return true; 17 } 18 void dfs(int len) 19 { 20 if(len==N) 21 { 22 if(judge()) cnt++; 23 return; 24 } 25 else 26 { 27 for(int i=1;i<=3;i++) 28 { 29 s[len] = i; 30 dfs(len+1); 31 } 32 } 33 } 34 void Solve() 35 { 36 dfs(0); 37 printf("%d\n",cnt); 38 } 39 int main() 40 { 41 int T; 42 scanf("%d",&T); 43 while(T--) 44 { 45 Init(); 46 Solve(); 47 } 48 return 0; 49 }
H.Ricky’s RealDan’s Ricky
博弈题,找规律,只有娃娃机个数为 1 个, 并且里面的娃娃只有偶数个, 第一个人才能赢
1 # include <iostream> 2 # include <cstdio> 3 using namespace std; 4 const int maxn = 1e5+5; 5 int num[maxn]; 6 int main() 7 { 8 int T,n; 9 scanf("%d",&T); 10 while(T--) 11 { 12 scanf("%d",&n); 13 for(int i=0;i<n;i++) 14 scanf("%d",&num[i]); 15 if(n==1&&num[0]%2==0) 16 printf("Ricky is Winner\n"); 17 else 18 printf("RealDan is Winner\n"); 19 } 20 return 0; 21 }
I.小A的期末作业
纯模拟,注意最后输出50个就要加一个空行
1 # include <iostream> 2 # include <cstdio> 3 # include <cmath> 4 using namespace std; 5 int main() 6 { 7 int N; 8 while(scanf("%d",&N)!=EOF) 9 { 10 for(int i=0;i<2*N-1;i++) 11 { 12 int spL = N-1-abs(N-1-i); 13 for(int j=0;j<spL;j++) 14 printf(" "); 15 for(int j=0;j<N;j++) 16 printf("*"); 17 printf("\n"); 18 } 19 } 20 return 0; 21 }
J.怪盗基德 & 月之瞳宝石
模拟题,在星体和能源体的分布上,遍历每一个星体,找到与这个星体最近能源体的距离,在所有的最近距离中取最大的就是答案
1 # include <iostream> 2 # include <cstdio> 3 # include <algorithm> 4 # include <cmath> 5 using namespace std; 6 const int maxn = 1e5+10; 7 long long s[maxn],p[maxn]; 8 int n,m; 9 void Init() 10 { 11 for(int i=0;i<n;i++) 12 scanf("%lld",&s[i]); 13 for(int i=0;i<m;i++) 14 scanf("%lld",&p[i]); 15 } 16 void Solve() 17 { 18 sort(s,s+n); 19 sort(p,p+m); 20 long long ans,temp; 21 int j = 0; 22 ans = -1; 23 for(int i=0;i<n;i++) 24 { 25 while(p[j]<s[i]&&j<m-1) j++; 26 //printf("%d %d %d %d\n",j,p[j-1],s[i],p[j]); 27 if(j==0) temp = abs(p[j] - s[i]); 28 else temp = min(abs(p[j] - s[i]),abs(s[i] - p[j-1])); 29 //printf("%lld\n",temp); 30 ans = max(ans,temp); 31 } 32 printf("%lld\n",ans); 33 } 34 int main() 35 { 36 while(scanf("%d%d",&n,&m)!=EOF) 37 { 38 Init(); 39 Solve(); 40 } 41 return 0; 42 }
K.正方体
模拟题
1 # include <iostream> 2 # include <cstdio> 3 using namespace std; 4 int Map[4][5]; 5 void Init() 6 { 7 for(int i=0;i<3;i++) 8 for(int j=0;j<4;j++) 9 scanf("%d",&Map[i][j]); 10 } 11 void Solve() 12 { 13 int a,b; 14 for(int i=0;i<4;i++) 15 { 16 if(Map[0][i]!=0) a = Map[0][i]; 17 if(Map[2][i]!=0) b = Map[2][i]; 18 } 19 if(a!=b||Map[1][0]!=Map[1][2]||Map[1][1]!=Map[1][3]) 20 printf("No!\n"); 21 else 22 printf("Yes!\n"); 23 } 24 int main() 25 { 26 int T; 27 scanf("%d",&T); 28 for(int i=0;i<T;i++) 29 { 30 Init(); 31 Solve(); 32 if((i+1)%50==0) 33 printf("\n"); 34 } 35 return 0; 36 }
L.简单的分数
运用gcd公式通分,注意处理负号的问题
1 # include <iostream> 2 # include <cstdio> 3 # include <cmath> 4 using namespace std; 5 int op,a,b,c,d; 6 void Init() 7 { 8 scanf("%d%d%d%d%d",&op,&a,&b,&c,&d); 9 } 10 int gcd(int x,int y) 11 { 12 return y?gcd(y,x%y):x; 13 } 14 void Solve() 15 { 16 int bd = b*d; 17 int adbc = op==1?a*d+b*c:a*d-b*c; 18 int temp = gcd(abs(bd),abs(adbc)); 19 printf("%d/%d\n",adbc/temp,bd/temp); 20 } 21 int main() 22 { 23 int T; 24 scanf("%d",&T); 25 while(T--) 26 { 27 Init(); 28 Solve(); 29 } 30 return 0; 31 }
M.HJ浇花
运用差分标记能够很快很巧妙的处理区间处理的问题吗,推荐一个讲的清楚的博客
1 # include <iostream> 2 # include <cstdio> 3 # include <cstring> 4 using namespace std; 5 const int maxn = 1e6+10; 6 int num[maxn],sum[maxn],cnt[maxn]; 7 int n; 8 void Init() 9 { 10 memset(cnt,0,sizeof(cnt)); 11 memset(sum,0,sizeof(sum)); 12 memset(num,0,sizeof(num)); 13 } 14 void Solve() 15 { 16 int l,r; 17 for(int i=0;i<n;i++) 18 { 19 scanf("%d%d",&l,&r); 20 sum[l]++; 21 sum[r+1]--; 22 } 23 int res = 0; 24 num[0] = sum[0]; 25 cnt[num[0]]++; 26 for(int i=1;i<maxn;i++) 27 { 28 num[i] = num[i-1] + sum[i]; 29 cnt[num[i]]++; 30 } 31 for(int i=1;i<n;i++) 32 printf("%d ",cnt[i]); 33 printf("%d\n",cnt[n]); 34 } 35 int main() 36 { 37 while(scanf("%d",&n)!=EOF) 38 { 39 Init(); 40 Solve(); 41 } 42 return 0; 43 }