# AtCoder Beginner Contest 416
比赛链接
# A - Vacation Validation
模拟
| #include<bits/stdc++.h> | |
| #define int long long | |
| #define in inline | |
| #define ri register | |
| #define _123hh2 0 | |
| using namespace std; | |
| in int read() | |
| { | |
| int x=0,f=1;char ch=getchar();while(ch>'9'||ch<'0') {if(ch=='-') f=-1;ch=getchar();} | |
| while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}return x*f; | |
| } | |
| in void write(int x) {if(x<0) {x=-x;putchar('-');}if(x>9) write(x/10);putchar(x%10+'0');} | |
| signed main() | |
| { | |
| int n=read(),l=read(),r=read(); | |
| string awa;cin>>awa; | |
| int f=0; | |
| for(int i=l-1;i<r;i++) | |
|     { | |
| if(awa[i]=='x') {f=1;break;} | |
|     } | |
| if(f) cout<<"No"; | |
| else cout<<"Yes"; | |
| return _123hh2; | |
| } | 
# B - 1D Akari
贪心,能变成 o 就变
| #include<bits/stdc++.h> | |
| #define int long long | |
| #define in inline | |
| #define ri register | |
| #define _123hh2 0 | |
| using namespace std; | |
| in int read() | |
| { | |
| int x=0,f=1;char ch=getchar();while(ch>'9'||ch<'0') {if(ch=='-') f=-1;ch=getchar();} | |
| while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}return x*f; | |
| } | |
| in void write(int x) {if(x<0) {x=-x;putchar('-');}if(x>9) write(x/10);putchar(x%10+'0');} | |
| signed main() | |
| { | |
| string awa;cin>>awa; | |
| int f=1; | |
| for(int i=0;i<awa.size();i++) | |
|     { | |
| if(awa[i]=='#') {f=1;cout<<awa[i];} | |
| if(awa[i]=='.') | |
|         { | |
| if(f) cout<<'o'; | |
| else cout<<'.'; | |
| f=0; | |
|         } | |
|     } | |
| return _123hh2; | |
| } | 
# C - Concat (X-th)
注意到数据范围很小,我们可以直接暴力枚举所有可能拼接的字符串,排序后选第 小的字符串即可
| #include<bits/stdc++.h> | |
| #define int long long | |
| #define in inline | |
| #define ri register | |
| #define _123hh2 0 | |
| using namespace std; | |
| in int read() | |
| { | |
| int x=0,f=1;char ch=getchar();while(ch>'9'||ch<'0') {if(ch=='-') f=-1;ch=getchar();} | |
| while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}return x*f; | |
| } | |
| in void write(int x) {if(x<0) {x=-x;putchar('-');}if(x>9) write(x/10);putchar(x%10+'0');} | |
| string awa[11]; | |
| vector<string> qwq; | |
| signed main() | |
| { | |
| int n=read(),m=read(),k=read(); | |
| for(int i=1;i<=n;i++) cin>>awa[i]; | |
| sort(awa+1,awa+1+n); | |
| int chose[6]={0,1,1,1,1,1}; | |
| string now=""; | |
| for(int i=1;i<=m;i++) now+=awa[chose[i]]; | |
| qwq.push_back(now); | |
| for(int i=2;i<=pow(n,m);i++) | |
|     { | |
| chose[m]++; | |
| for(int j=m;j>=1;j--) | |
|         { | |
| if(chose[j]==n+1) chose[j]=1,chose[j-1]++; | |
|         } | |
| now=""; | |
| for(int j=1;j<=m;j++) now+=awa[chose[j]]; | |
| qwq.push_back(now); | |
|     } | |
| sort(qwq.begin(),qwq.end()); | |
| cout<<qwq[k-1]; | |
| return _123hh2; | |
| } | 
# D - Match, Mod, Minimize 2
我们先把两个序列的数对 取模,这样我们只需要求出使原式取模次数最多的方案
对于一个数 ,至少需要一个大于等于 的数才能使取模次数增加
不妨将任意一个序列排序并从大到小枚举这个序列的数 ,找在另一个序列的最小的大于等于 的数
| #include<bits/stdc++.h> | |
| #define int long long | |
| #define in inline | |
| #define ri register | |
| #define _123hh2 0 | |
| using namespace std; | |
| in int read() | |
| { | |
| int x=0,f=1;char ch=getchar();while(ch>'9'||ch<'0') {if(ch=='-') f=-1;ch=getchar();} | |
| while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}return x*f; | |
| } | |
| in void write(int x) {if(x<0) {x=-x;putchar('-');}if(x>9) write(x/10);putchar(x%10+'0');} | |
| const int maxn=3e5+5; | |
| int awa[maxn]; | |
| multiset<int> qwq; | |
| signed main() | |
| { | |
| int t=read(); | |
| while(t-->0) | |
|     { | |
| int n=read(),m=read(),ans=0; | |
| for(int i=1;i<=n;i++) awa[i]=(read()%m); | |
| for(int i=1;i<=n;i++) qwq.insert(read()%m); | |
| sort(awa+1,awa+1+n); | |
| for(int i=n;i>=1;i--) | |
|         { | |
| int now=awa[i]; | |
| int f=m-now; | |
| auto it=qwq.lower_bound(f); | |
| if(it==qwq.end()) it--; | |
| ans+=((*it+now)%m); | |
| qwq.erase(it); | |
|         } | |
| cout<<ans<<endl; | |
|     } | |
| return _123hh2; | |
| } | 
# E - Development
显然考虑
先用 将两点间距离 求出来
对于操作 1,直接改变 和 的值并跑一遍更新,这是经典做法
对于操作 2,如果单纯每次加点就对每个更新的边重新跑 的更新,复杂度是不允许的,但是注意到机场间是互连的,我们可以用一个源点 表示经过了机场,这样更新点 的时候只用更新 和 ,转换成了操作 1
注意这样做会导致坐飞机的时间加倍,因此我们可以把公路时间也加倍,最后统计答案的时候除以 2 就可以了
对于操作 3,直接输出即可
总复杂度 
注意:输入中包含重边,记得取 min
| #include<bits/stdc++.h> | |
| #define int long long | |
| #define in inline | |
| #define ri register | |
| #define _123hh2 0 | |
| using namespace std; | |
| in int read() | |
| { | |
| int x=0,f=1;char ch=getchar();while(ch>'9'||ch<'0') {if(ch=='-') f=-1;ch=getchar();} | |
| while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}return x*f; | |
| } | |
| in void write(int x) {if(x<0) {x=-x;putchar('-');}if(x>9) write(x/10);putchar(x%10+'0');} | |
| const int maxn=505; | |
| int awa[maxn][maxn],dp[maxn][maxn]; | |
| vector<int> D; | |
| signed main() | |
| { | |
| memset(dp,0x3f,sizeof(dp)); | |
| int n=read(),m=read(); | |
| for(int i=1;i<=m;i++) | |
|     { | |
| int u=read(),v=read(),w=read(); | |
| if(w*2>=dp[u][v]) continue; | |
| dp[u][v]=dp[v][u]=w*2; | |
|     } | |
| int k=read(),t=read(); | |
| for(int i=1;i<=k;i++) | |
|     { | |
| int x=read(); | |
| dp[x][n+1]=dp[n+1][x]=t; | |
|     } | |
| for(int i=1;i<=n+1;i++) dp[i][i]=0; | |
| for(int i=1;i<=n+1;i++) | |
|     { | |
| for(int j=1;j<=n+1;j++) | |
|         { | |
| for(int k=1;k<=n+1;k++) | |
|             { | |
| dp[j][k]=min(dp[j][k],dp[j][i]+dp[i][k]); | |
|             } | |
|         } | |
|     } | |
| int q=read(); | |
| while(q-->0) | |
|     { | |
| int op=read(); | |
| if(op==1) | |
|         { | |
| int u=read(),v=read(),x=read(); | |
| if(dp[u][v]<=x*2) continue; | |
| dp[u][v]=dp[v][u]=x*2; | |
| for(int i=1;i<=n+1;i++) | |
|             { | |
| for(int j=1;j<=n+1;j++) | |
|                 { | |
| dp[i][j]=min(dp[i][j],dp[i][u]+dp[v][j]+dp[u][v]); | |
| dp[i][j]=min(dp[i][j],dp[i][v]+dp[u][j]+dp[v][u]); | |
|                 } | |
|             } | |
|         } | |
| else if(op==2) | |
|         { | |
| int x=read(); | |
| D.push_back(x); | |
| int u=x,v=n+1; | |
| if(dp[u][v]<=t) continue; | |
| dp[u][v]=dp[v][u]=t; | |
| for(int i=1;i<=n+1;i++) | |
|             { | |
| for(int j=1;j<=n+1;j++) | |
|                 { | |
| dp[i][j]=min(dp[i][j],dp[i][u]+dp[v][j]+dp[u][v]); | |
| dp[i][j]=min(dp[i][j],dp[i][v]+dp[u][j]+dp[v][u]); | |
|                 } | |
|             } | |
|         } | |
|         else | |
|         { | |
| int ans=0; | |
| for(int i=1;i<=n;i++) | |
|             { | |
| for(int j=1;j<=n;j++) | |
|                 { | |
| if(dp[i][j]==0x3f3f3f3f3f3f3f3f) continue; | |
| ans+=dp[i][j]/2; | |
|                 } | |
|             } | |
| write(ans),puts(""); | |
|         } | |
|     } | |
| return _123hh2; | |
| } | 
