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;
}