Codeforces Round #659 (Div. 2)

日常爆零掉分wa

A. Common Prefixes

根据前一个字符串构造后一个字符串,从哪不同就从哪换

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#define debug(x) cout<<#x<<": "<
#include
#include
#include
using namespace std;
int main()
{
    IO;
    int T;
    cin>>T;
    while(T--)
    {
        int n;
        cin>>n;
        string s(200,'a');
        cout<<s<<endl;
        while(n--)
        {
            int j;
            cin>>j;
            s[j]=s[j]=='a'?'b':'a';
            cout<<s<<endl;
        }
    }
    return 0;
}

大佬博客题解
这方法太妙了啊!!!我什么时候能想出这么秒的方法

B1. Koa and the Beach (Easy Version)

动态规划
状态表示:f[i][j]表示在第j秒到达第i片海域是否合法
状态计算:可以从第i-1片海域花费1秒过来,或者在第i片海域原地等待1秒,即f[i][j]=f[i-1][j-1]|f[i][j-1]当然还要检查是否满足水位限制

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#define debug(x) cout<<#x<<": "<
#include
#include
using namespace std;
const int N=110,M=20010;
int f[N][M];
int d[N],p[2*N];
void init(int k)
{
    memset(f,0,sizeof f);
    for(int i=1;i<=k;i++) p[i]=i;
    for(int i=k+1;i<2*k;i++) p[i]=2*k-i;
    for(int i=0;i<2*k;i++) f[0][i]=1;
}
int main()
{
    IO;
    int T;
    cin>>T;
    while(T--)
    {
        int n,k,l;
        cin>>n>>k>>l;
        init(k);
        for(int i=1;i<=n;i++) cin>>d[i];
        for(int i=1;i<=n;i++)
            for(int j=1;j<2*k*n;j++)
            {
                f[i][j]=f[i-1][j-1]|f[i][j-1];
                if(d[i]+p[j%(2*k)]>l )f[i][j]=0;
            }
        bool ok=0;
        for(int i=0;i<2*k*n;i++) 
            if(f[n][i])
            {
                ok=1;
                break;
            }
        if(ok) cout<<"Yes"<<endl;
        else cout<<"No"<<endl;
    }
    return 0;
}

有一说一英语不好题目都没看懂-。-wtcl

C. String Transformation 1

对于A,B字符串如果存在A[i]>B[i]则无解,否则有解
用一个set记录每一个字符需要变成那些字符,每次贪心的让其变成最小需要变成的字符,重复操作。set自动排序去重

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#define debug(x) cout<<#x<<": "<
#include
#include
#include
#include
using namespace std;
typedef long long ll;
set<int> mp[26];
int main()
{
    IO;
    int T;
    cin>>T;
    while(T--)
    {
        
        int n;
        cin>>n;
        string a,b;
        cin>>a>>b;
        bool ok=1;
        for(int i=0;i<n;i++)
        {
            if(a[i]!=b[i])
            {
                if(a[i]>b[i])
                {
                    ok=0;
                    break;
                }
                else mp[a[i]-'a'].insert(b[i]-'a');
            }
        }
        if(!ok) 
        {
            for(int i=0;i<26;i++) mp[i].clear();
            cout<<-1<<endl;
            continue;
        }
        int res=0;
        for(int i=0;i<26;i++)
        {
            if(mp[i].empty()) continue;
            int ans=*mp[i].begin();//全变成最小的字符
            for(auto t:mp[i])
            {
                if(t==ans) continue;
                mp[ans].insert(t);//那么新变成的字符也需要变成其他的
            }
            res++;
            mp[i].clear();
        }
        cout<<res<<endl;
    }
    return 0;
}

虽然不会写,但是看到思路后自己能用set独立码出代码还是非常高兴的!!!渐渐熟悉STL(我是傻了吗-。-

D. GameGame

异或操作有结合律,可以按位考虑,我们每次从最高位考虑。
设当前位是 1 1 1的数字个数为 x x x,是 0 0 0的数字个数为 y y y
如果 x x x为偶数,则无论怎么选,最后两个得分在这个位都是一样的没必要考虑这一位。
如果 x x x为奇数,且 x m o d 4 = 1 x mod 4=1 xmod4=1,先手先选择一个1,然后后手选什么先手就选什么,先手最终该位一定是 1 1 1必胜;如果 x m o d 4 = 3 , x mod4 = 3, xmod4=3, y y y是偶数,则后手完全可以跟随先手的操作,最后先手在该位一定是偶数个1,异或结果为0,先手必输。如果 x m o d 4 = 3 x mod4 = 3 xmod4=3但是 y y y是奇数,那么先手一定能赢,先手先拿该位为0的数,使整个局势转移到上一情形中。

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#define debug(x) cout<<#x<<": "<
#include
#include
#include
#include
using namespace std;
typedef long long ll;
const int N=40;
int bit[N];
int main()
{
    IO;
    int T;
    cin>>T;
    while(T--)
    {
        int n;
        cin>>n;
        memset(bit,0,sizeof bit);
        for(int i=0;i<n;i++)
        {
            ll a;
            cin>>a;
            for(int j=0;j<=32;j++) bit[j]+=(a>>j&1);
        }
        int flag=0;
        for(int i=32;i>=0;i--)
            if(bit[i]&1)
            {
                int x=bit[i],y=n-bit[i];
                if(x%4==1)
                {
                    flag=1;
                }
                else 
                {
                    if(y&1) flag=1;
                    else flag=-1;
                }
                break;
            }
        if(flag==1) cout<<"WIN"<<endl;
        else if(flag==-1) cout<<"LOSE"<<endl;
        else cout<<"DRAW"<<endl;
    }
    return 0;
}

争取div2不爆0~~要加油哦!

你可能感兴趣的:(Codeforces)