牛客周赛 Round 56

牛客周赛 Round 56

\(A\) 牛客 NC277678 面包店故事 \(AC\)

  • 选择结构。

    点击查看代码
    int main()
    {
        int x,y,n;
        cin>>x>>y>>n;
        if(x+y<=n)
        {
            cout<<"YES"<<endl;
        }
        else
        {
            cout<<"NO"<<endl;
        }
        return 0;
    }
    

\(B\) 牛客 NC277594 放课后故事 \(AC\)

  • 顺序结构。

    点击查看代码
    int main()
    {
        ll n,m,k,x,sum=0,i;
        cin>>n>>m>>k;
        for(i=1;i<=n;i++)
        {
            cin>>x;
            sum+=x;
        }
        cout<<min(m+1,sum/k)<<endl;
        return 0;
    }
    

\(C\) 牛客 NC277217 异或故事 \(AC\)

  • 考虑钦定一个数 \(b\) ,然后令 \(c=a \bigoplus b\)

  • 不妨让 \(b,c \le a\) 那么 \(b=\operatorname{lowbit}(a)\) 是个不错的选择。

  • 特判 \(2^{k}(k \in \mathbb{N})\) 的情况。

    点击查看代码
    int lowbit(int x)
    {
        return (x&(-x));
    }
    int main()
    {
        int t,x,i;
        cin>>t;
        for(i=1;i<=t;i++)
        {
            cin>>x;
            if(x==1)
            {
                cout<<2<<" "<<(x^2)<<endl;
            }
            else
            {
                if(__builtin_popcount(x)==1)
                {
                    cout<<1<<" "<<(x^1)<<endl;	
                }
                else
                {
                    cout<<lowbit(x)<<" "<<(x^lowbit(x))<<endl;
                }
            }
        }
        return 0;
    }
    

\(D\) 牛客 NC277596 构造故事 \(AC\)

  • 排序后枚举相邻 \(3\) 个数判断即可。

    点击查看代码
    ll a[10010];
    int main()
    {
        ll t,n,ans,i,j;
        cin>>t;
        for(j=1;j<=t;j++)
        {
            cin>>n;
            ans=-1;
            for(i=1;i<=n;i++)
            {
                cin>>a[i];
            }
            sort(a+1,a+1+n);
            for(i=n;i>=3;i--)
            {
                if(a[i-2]+a[i-1]>a[i])
                {
                    ans=max(ans,a[i-2]+a[i-1]+a[i]);
                }
            }
            cout<<ans<<endl;
        }
        return 0;
    }
    

\(E\) 牛客 NC277601 约会故事 \(AC\)

  • 将时间转化成 \(4\) 位数后就是一个简单的小模拟了。

  • 注意开心的起止时间不在同一天的情况。

    点击查看代码
    int happy[3000];
    map<string,int>vis;
    char tmp[10];
    string s;
    int val(char x)
    {
        return x-'0';
    }
    int to(char s[])
    {
        return val(s[1])*1000+val(s[2])*100+val(s[4])*10+val(s[5]);
    }
    int main()
    {
        int n,m,q,st,ed,x,i,j,k;
        cin>>n>>m;
        for(i=1;i<=n;i++)
        {
            cin>>(tmp+1);
            st=to(tmp);
            cin>>(tmp+1);
            ed=to(tmp);
            if(st==ed)
            {
                fill(happy+0,happy+2600,1);
            }
            else
            {
                if(st<ed)
                {
                    fill(happy+st,happy+ed+1,1);
                }
                else
                {
                    fill(happy+st,happy+2600,1);
                    fill(happy+0,happy+ed+1,1);
                }
            }
        }
        for(i=1;i<=m;i++)
        {
            cin>>s;
            vis[s]=1;
        }
        cin>>q;
        for(i=1;i<=q;i++)
        {
            cin>>(tmp+1);
            x=to(tmp);
            cin>>(tmp+1);
            st=to(tmp);
            cin>>(tmp+1);
            ed=to(tmp);
            cin>>s;
            if(0<=x&&x<=159)
            {
                if(happy[x]==0)
                {
                    cout<<"Loser xqq"<<endl;
                }
                else
                {
                    if(st>ed||vis.find(s)==vis.end())
                    {
                        cout<<"Joker xqq"<<endl;
                    }
                    else 
                    {
                        cout<<"Winner xqq"<<endl;
                    }
                }
            }
            else
            {
                cout<<"Loser xqq"<<endl;
            }
        }
        return 0;
    }
    

\(F\) 牛客 NC277160 不是烤串故事

  • 考虑处理出 \(s\) 的正串、反串哈希。接着二分哈希 \(check\) 时判断是否需要和前面的拼起来。

  • 多试几个模数,防止被卡。

    点击查看代码
    const ll mod=1000003579,base=13331;
    ll a[1000010],b[1000010],c[1000010],jc[1000010];
    char s[1000010],ss[1000010],t[1000010];
    void sx_hash(char s[],ll a[],ll len)
    {
        for(ll i=0;i<=len;i++)
        {
            a[i]=(i==0)?0:((a[i-1]*base%mod+s[i])%mod);
        }
    }
    ll ask_hash(ll a[],ll l,ll r)
    {
        return (a[r]-a[l-1]*jc[r-l+1]%mod+mod)%mod;
    }
    bool check(ll mid,ll i,ll n)
    {
        if(mid>i)
        {
            return (ask_hash(b,n-i+1,n)*jc[mid-i]%mod+ask_hash(a,i+1,mid))%mod==ask_hash(c,1,mid);
        }
        else
        {
            return ask_hash(b,n-i+1,n-i+mid)==ask_hash(c,1,mid);
        }
    }
    int main()
    {
        ll T,n,l,r,mid,ans,maxx,pos,i,j;
        cin>>T;
        for(i=0;i<=1000000;i++)
        {
            jc[i]=(i==0)?1:(jc[i-1]*base%mod);
        }
        for(j=1;j<=T;j++)
        {
            maxx=0;
            pos=1;
            cin>>n>>(s+1)>>(t+1);
            for(i=1;i<=n;i++)
            {
                ss[i]=s[n-i+1];
            }
            sx_hash(s,a,n);
            sx_hash(ss,b,n);
            sx_hash(t,c,n);
            for(i=1;i<=n;i++)
            {
                l=1;
                r=n;
                ans=0;
                while(l<=r)
                {
                    mid=(l+r)/2;
                    if(check(mid,i,n)==true)
                    {
                        l=mid+1;
                        ans=mid;
                    }
                    else
                    {
                        r=mid-1;
                    }
                }
                if(ans>maxx)
                {
                    maxx=ans;
                    pos=i;
                }
            }
            cout<<maxx<<" "<<pos<<endl;
        }
        return 0;
    }
    

总结

  • \(F\) 没立刻明白反转是什么意思,尝试 \(KMP,Trie\) 树,后缀数组无果。最后发现还得是二分哈希。

后记

  • \(E\) 没明确说明开心的起止时间不在同一天时怎么处理,感觉和没说开心的开始时间与结束时间相等怎么处理一样恶劣。
posted @ 2024-08-19 12:01  hzoi_Shadow  阅读(27)  评论(0编辑  收藏  举报
扩大
缩小