T1潜伏者
简单模拟题,没什么好讲的。

1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 char ch[102],yu[102],mi[102]; 5 int len1,len2,sum=0,len3,to[27],fr[27]; 6 int main(){ 7 scanf("%s",ch+1); 8 len1=strlen(ch+1); 9 scanf("%s",yu+1); 10 len2=strlen(yu+1); 11 scanf("%s",mi+1); 12 len3=strlen(mi+1); 13 if(len1!=len2)return printf("Failed"),0; 14 for(int i=1;i<=len1;i++){ 15 int p=ch[i]-'A'+1,tt=yu[i]-'A'+1; 16 if(to[p]){ 17 if(tt!=to[p])return printf("Failed"),0; 18 continue; 19 } 20 if(fr[tt]){ 21 if(p!=fr[tt])return printf("Failed"),0; 22 continue; 23 } 24 sum++;to[p]=tt;fr[tt]=p; 25 } 26 if(sum!=26)return printf("Failed"),0; 27 for(int i=1;i<=len3;i++) 28 printf("%c",to[mi[i]-'A'+1]+'A'-1); 29 return 0; 30 }
T2HankSon的趣味题
题目就是求满足gcd(x,a0)=a1且lcm(x,b0)=b1的x的个数,如果把a0,a1,b0,b1分解质因数,即:
a0=p1k1+p2k2+...pnkn
a1=p1o1+p2o2+...pnon
b0=p1g1+p2g2+...pngn
b1=p1q1+p2q2+...pnqn
那么当k1==o1且g1==q1且o1<=q1时,x%p1o1-q1=0;--->ans*=o1-q1+1;
当(k1==o1&&g1==q1&&o1>q1)||(k1!=o1&&g1!=q1&&o1!=q1)时,无解。
那么就需要先筛一遍素数,因为>=5e4的素数最多只会在每个数中出现一次,所以只用筛到5e4就够了。

1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 const int N=5e4+10; 5 int read(){ 6 int ans=0,f=1;char c=getchar(); 7 while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();} 8 while(c>='0'&&c<='9'){ans=ans*10+c-48;c=getchar();} 9 return ans*f; 10 } 11 int prime[50005],cnt=0,a0,a1,b0,b1; 12 bool ok[N]; 13 void make_prime(){ 14 ok[0]=ok[1]=1; 15 for(int i=2;i<=N-10;i++){ 16 if(!ok[i])prime[++cnt]=i; 17 for(int j=1;j<=cnt&&i*prime[j]<=N-10;j++){ 18 ok[i*prime[j]]=1; 19 if(i%prime[j]==0)break; 20 } 21 } 22 } 23 int sum; 24 void solve(int x){ 25 int c0=0,c1=0,c2=0,c3=0; 26 while(a0%x==0){a0/=x;c0++;} 27 while(a1%x==0){a1/=x;c1++;} 28 while(b0%x==0){b0/=x;c2++;} 29 while(b1%x==0){b1/=x;c3++;} 30 if(c1==c0&&c2==c3){ 31 if(c1>c3)sum=0; 32 else sum*=c3-c1+1; 33 } 34 else if(c1!=c0&&c2!=c3&&c1!=c3)sum=0; 35 } 36 int main(){ 37 make_prime(); 38 int tt=read(); 39 while(tt--){ 40 sum=1; 41 a0=read();a1=read();b0=read();b1=read(); 42 for(int i=1;i<=cnt;i++){solve(prime[i]);if(!sum)break;} 43 if(b1>1)solve(b1); 44 printf("%d ",sum); 45 } 46 return 0; 47 }
T3最优贸易
建正、反向边,边权为指向点的价格,跑两遍SPFA:
1.求每个点到终点最大值,表示从这个点出发到达终点可以卖出的最大价格;
2.求每个点到起点最小值,表示到这个点之前可以买到的最小价格。
最后枚举每个点求max即可。

1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #define mem(a,p) memset(a,p,sizeof(a)) 5 const int M=1e6+10,N=1e5+10; 6 int n,m,first[N],wi[N],dis[N],fir[N],tot=0,sum=0,q[N],di[N]; 7 bool ok[N]; 8 struct node{int ne,to;}e[M],tt[M]; 9 int min(int x,int y){return x>y?y:x;} 10 int max(int x,int y){return x>y?x:y;} 11 int read(){ 12 int ans=0,f=1;char c=getchar(); 13 while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();} 14 while(c>='0'&&c<='9'){ans=ans*10+c-48;c=getchar();} 15 return ans*f; 16 } 17 void ins(int u,int v){e[++tot]=(node){first[u],v};first[u]=tot;} 18 void inss(int u,int v){tt[++sum]=(node){fir[u],v};fir[u]=sum;} 19 void spfa(int p){ 20 ok[n]=1;int h=0,t=1; 21 if(!p)dis[n]=wi[n],q[0]=n; 22 else di[1]=wi[1],q[0]=1; 23 while(h!=t){ 24 int x=q[h++];if(h>=n)h=0; 25 if(p){ 26 for(int i=first[x];i;i=e[i].ne){ 27 int to=e[i].to; 28 int mx=min(di[x],wi[to]); 29 if(di[to]>mx){ 30 di[to]=mx; 31 if(!ok[to]){ 32 ok[to]=1;q[t]=to; 33 if(di[to]<di[q[h]])std::swap(q[h],q[t]); 34 t++;if(t>=n)t=0; 35 } 36 } 37 } 38 } 39 else{ 40 for(int i=fir[x];i;i=tt[i].ne){ 41 int to=tt[i].to; 42 int mx=max(dis[x],wi[to]); 43 if(dis[to]<mx){ 44 dis[to]=mx; 45 if(!ok[to]){ 46 ok[to]=1;q[t]=to; 47 if(dis[to]>dis[q[h]])std::swap(q[h],q[t]); 48 t++;if(t>=n)t=0; 49 } 50 } 51 } 52 } 53 ok[x]=0; 54 } 55 } 56 int main(){ 57 n=read();m=read(); 58 for(int i=1;i<=n;i++)wi[i]=read(); 59 for(int i=1,a,b,z;i<=m;i++){ 60 a=read();b=read();z=read(); 61 ins(a,b);inss(b,a); 62 if(z-1)ins(b,a),inss(a,b); 63 } 64 mem(di,127); 65 spfa(0); 66 spfa(1); 67 int mx=0; 68 for(int i=1;i<=n;i++){ 69 int p=dis[i]-di[i]; 70 mx=max(p,mx); 71 } 72 printf("%d",mx); 73 return 0; 74 }
T4靶形数独
懒得写......本来是打算学一波DLX再来写的,但是看起来没什么时间了就弃坑吧......->v->