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;
}
京公网安备 11010502036488号