A - Strings
按题意模拟t+s即可.
#include <bits/stdc++.h> using namespace std; int main() { string s,t; cin>>s>>t; string ans=t+s; cout<<ans<<endl; return 0; }
B - Greedy Takahashi
分情况进行模拟即可,先用a,再用b.
#include <bits/stdc++.h> using namespace std; typedef long long ll; int main() { ll a,b,k; cin>>a>>b>>k; if(k>=a+b) { cout<<0<<' '<<0<<'\n'; } else if(k>=a) { cout<<0<<' '<<b-(k-a)<<'\n'; } else { cout<<a-k<<' '<<b<<'\n'; } return 0; }
C - Next Prime
随便使用一个筛法筛取2e5的质数,可以暴力遍历,可以二分得到答案.
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N=2e5+5; bool vis[N]; int prime[N],id; int main() { int x; cin>>x; for(int i=2;i<=N-5;i++) { if(vis[i]) continue; prime[++id]=i; for(int j=i;j<=N-5;j+=i) { vis[j]=true; } } for(int i=1;i<=id;i++) { if(prime[i]>=x) { cout<<prime[i]<<endl; break; } } return 0; }
D - Prediction and Restriction
题目读错很多次,简单的贪心即可解决,因为只有重复获得贡献的点下次才不会有贡献,这样贪心一下即可.
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N=2e5+5; char s[N]; int val[N],win[N]; int main() { int n,k; cin>>n>>k; int ans=0; cin>>val['r']>>val['s']>>val['p']; scanf("%s",s+1);int len=strlen(s+1); for(int i=1;i<=len;i++) { if(i>k&&win[i-k]&&s[i]==s[i-k]) continue; else if(s[i]=='r') ans+=val['p']; else if(s[i]=='p') ans+=val['s']; else ans+=val['r']; win[i]=1; }cout<<ans<<'\n'; return 0; }
E - Handshake
二分第m大的值,然后这个第m大的值数量可能不止这么多,然后控制下数量即可.
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N=1e5+50; ll n,m,a[N],sum[N]; int main() { cin>>n>>m; for(int i=1;i<=n;i++) cin>>a[i]; ll l=1,r=2e5,ans=0,num;sort(a+1,a+1+n); for(int i=1;i<=n;i++) sum[i]=sum[i-1]+a[i]; while(l<=r) { ll mid=(l+r)>>1;num=0; for(int i=1;i<=n;i++) { num+=n-(lower_bound(a+1,a+1+n,mid-a[i])-a-1); } if(num>=m) { l=mid+1; ans=max(ans,mid); } else r=mid-1; }ll res=0;num=0; for(int i=1;i<=n;i++) { ll cnt=lower_bound(a+1,a+1+n,ans-a[i])-a; res+=sum[n]-sum[cnt-1]; res+=(n-cnt+1)*a[i]; num+=(n-cnt+1); } if(num>m) cout<<res-ans*(num-m)<<'\n'; else cout<<res<<'\n'; return 0; }
F - Surrounded Nodes
考虑一共有个图,对于每个点,然后每个点是白色的情况有,然后它被计算贡献的情况且当它的大于两颗子树黑色的点,但是可以容斥的减去对立面一颗子树,和都没有即可.
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N=2e5+50; const int mod=1e9+7; vector<int>g[N]; ll ans=0,sz[N],n; ll qp(ll a,ll b) { ll res=1; while(b) { if(b&1) res=res*a%mod; a=a*a%mod; b>>=1; }return res; } void dfs(int u,int fa) { sz[u]=1;ll tot=qp(2,n-1); for(int v:g[u]) { if(v==fa) continue; dfs(v,u);sz[u]+=sz[v]; tot-=(qp(2,sz[v])-1),tot=(tot%mod+mod)%mod; }tot-=qp(2,n-sz[u]),tot=(tot%mod+mod)%mod; ans+=tot,ans%=mod; } int main() { cin>>n; for(int i=1;i<n;i++) { int u,v;cin>>u>>v; g[u].push_back(v); g[v].push_back(u); }dfs(1,1); ll fm=qp(qp(2,n),mod-2); cout<<ans*fm%mod<<'\n'; return 0; }