Codeforces Round #668 (Div. 2)

前20分钟做题,后面看题,二题战士,赛后补题www

A - Permutation Forgery

直接逆序输出即可

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#pragma GCC optimize(2)
#include<iostream>
#include<algorithm>
using namespace std;
int n;
int a[110];
int main()
{
    
    
    IO;
    int T;
    cin>>T;
    while(T--)
    {
    
    
        cin>>n;
        for(int i=0;i<n;i++) cin>>a[i];
        reverse(a,a+n);
        for(int i=0;i<n;i++) cout<<a[i]<<' ';
        cout<<endl;
    }
    return 0;
}

B - Array Cancellation

考虑一个数组中的一个负数,如何至少花费多少代价变为0。
如果前面没有正数必须要花费硬币,否则就和前面的正数抵消。对于花费硬币就和最后面的正数抵消,维护前缀和瞎搞一下即可。

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#pragma GCC optimize(2)
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=100010;
int n;
ll a[N];
ll s[N];
int main()
{
    
    
    IO;
    int T;
    cin>>T;
    while(T--)
    {
    
    
        cin>>n;
        for(int i=1;i<=n;i++) cin>>a[i];
        for(int i=1;i<=n;i++) s[i]=s[i-1]+a[i];
        ll res=0;
        for(int i=1;i<=n;i++)
            if(a[i]<0) res-=min(0ll,s[i-1]+res+a[i]);
        cout<<res<<endl;
    }
    return 0;
}

C - Balanced Bitstring

这题一直没想出来,赛后看题解也想了一会儿,我好菜啊
考虑对于长度为 k k k的窗口在原串上移动,移动的过程中最前面的字符被弹出窗口 s [ i ] s[i] s[i],新加入一个字符 s [ i + k ] s[i+k] s[i+k],如果要保证窗口内 1 1 1的数量和 0 0 0的数量不变,那么必须满足 s [ i ] = s [ i + k ] s[i]=s[i+k] s[i]=s[i+k],如果上述条件满足能够保证所有长度为 k k k的子串 1 1 1的数量和 0 0 0的数量相等,在只需判断第一个窗口内 1 1 1的个数和 0 0 0的个数是否不大于 k 2 \frac{k}{2} 2k即可

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#pragma GCC optimize(2)
#include<iostream>
#include<algorithm>
using namespace std;
const int N=300010;
int n,k;
int a[N];
int main()
{
    
    
    IO;
    int T;
    cin>>T;
    while(T--)
    {
    
    
        cin>>n>>k;
        for(int i=0;i<=n;i++) a[i]=-1;
        string s;
        cin>>s;
        bool ok=1;
        for(int i=0;i<n;i++)
        {
    
    
            int j=i%k;
            if(s[i]=='?') continue;
            else
            {
    
    
                if(a[j]==-1)
                    a[j]=s[i]-'0';
                else
                {
    
    
                    if(a[j]!=s[i]-'0')
                        ok=0;
                }
            }
        }
        if(ok)
        {
    
    
            int cnt0=0,cnt1=0;
            for(int i=0;i<k;i++) 
                cnt0+=a[i]==0,cnt1+=a[i]==1;
            if(cnt0>k/2||cnt1>k/2) ok=0;
        }
        if(ok) cout<<"YES"<<endl;
        else cout<<"NO"<<endl;
    }
    return 0;
}

D - Tree Tag

Bob想要赢的充要条件
① 最初的 d i s t ( a , b ) > d a dist(a,b) >da dist(a,b)>da
如果不满足,第一步直接就可以到b所在的点
② 树的直径 > 2 × d a >2×da >2×da
如果不满足,a可以想办法跳到树的中心,然后就在一步之内到达任意点
d b > 2 × d a db>2×da db>2×da
如果不满足,每次a想办法与b保持da的距离,那么b一定不断远离a,知道不能远离的时候就不能跳出范围,然后就输了。
这也太难想了吧,想出来的都是神仙

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#pragma GCC optimize(2)
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
typedef pair<ll,ll> pll;
const int N=100010;
int n,a,b,da,db;
int h[N],e[N*2],ne[N*2],idx;
int dep[N];
int dlen;
void add(int a,int b)
{
    
    
    e[idx]=b;
    ne[idx]=h[a];
    h[a]=idx++;
}
int dfs1(int u,int fa)//树的直径
{
    
    
    int d1=0,d2=0;
    for(int i=h[u];i!=-1;i=ne[i])
    {
    
    
        int j=e[i];
        if(j==fa) continue;
        int d=1+dfs1(j,u);
        if(d>d1) d2=d1,d1=d;
        else if(d>d2) d2=d;
    }
    dlen=max(dlen,d1+d2);
    return d1;
}
void dfs2(int u,int fa)//求初始的dist(a,b)
{
    
    
    dep[u]=dep[fa]+1;
    for(int i=h[u];i!=-1;i=ne[i])
    {
    
    
        int j=e[i];
        if(j==fa) continue;
        dfs2(j,u);
    }
}
int main()
{
    
    
    IO;
    int T;
    cin>>T;
    while(T--)
    {
    
    
        cin>>n>>a>>b>>da>>db;
        for(int i=1;i<=n;i++) h[i]=-1,dep[i]=0;
        idx=0;dlen=0;
        for(int i=1;i<n;i++) 
        {
    
    
            int a,b;
            cin>>a>>b;
            add(a,b),add(b,a);
        }
        dfs1(1,0);
        dfs2(a,0);
        int dist=dep[b]-dep[a];
        if(dist>da&&dlen>2*da&&db>2*da) cout<<"Bob"<<endl;
        else cout<<"Alice"<<endl;
    }
    return 0;
}

要加油哦~

猜你喜欢

转载自blog.csdn.net/Fighting_Peter/article/details/108444671