Codeforces Round #658 (Div. 2) a,b,c1,c2

昨天真是自闭的一天 hdu 牛客 cf 全部挤在一天
打到cf的时候整个人都麻木了 感觉
完全没思路 然后自闭睡觉了
今天早上一起来发现就有思路了。。。。
依然还是掉大分哎
果然还是要休息好 脑子才灵光

A. Common Subsequence

题目思路

直接找两个数组相同的一个元素就行

ac代码

#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <math.h>
#include <string.h>
#include <vector>
#include <stack>
#include <queue>
#include <map>
#include <set>
#include <utility>
#define pi 3.1415926535898
#define ll long long
#define lson rt<<1
#define rson rt<<1|1
#define eps 1e-6
#define ms(a,b) memset(a,b,sizeof(a))
#define legal(a,b) a&b
#define print1 printf("111\n")
using namespace std;
const int maxn = 3e4+10;
const int inf = 0x3f3f3f3f;
const ll llinf =0x3f3f3f3f3f3f3f3f;
const int mod = 1e9+7;
 
int vis[maxn];
 
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n,m;
        ms(vis,0);
        scanf("%d%d",&n,&m);
        int index=-1;
        for(int i=1;i<=n;i++)
        {
            int x;
            scanf("%d",&x);
            vis[x]=1;
        }
        for(int i=1;i<=m;i++)
        {
            int x;
            scanf("%d",&x);
            if(vis[x]==1)
                index=x;
        }
        if(index==-1)
            printf("NO\n");
        else
        {
            printf("YES\n");
            printf("1 %d\n",index);
        }
    }
}

B. Sequential Nim

这题昨天也卡了挺久的 思考到非1的数那里就思路就断了
一直在想特判 还是题目做少了 没什么感觉
这种题一般都有个通解 不会需要太多特判

题目思路

如果数组只有1 那么根据1的个数直接判断胜负就好
如果有非1数 那么先到达非1数的赢 可以自己去想一想

ac代码

#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <math.h>
#include <string.h>
#include <vector>
#include <stack>
#include <queue>
#include <map>
#include <set>
#include <utility>
#define pi 3.1415926535898
#define ll long long
#define lson rt<<1
#define rson rt<<1|1
#define eps 1e-6
#define ms(a,b) memset(a,b,sizeof(a))
#define legal(a,b) a&b
#define print1 printf("111\n")
using namespace std;
const int maxn = 1e5+10;
const int inf = 0x3f3f3f3f;
const ll llinf =0x3f3f3f3f3f3f3f3f;
const int mod = 1e9+7;
 
int a[maxn];
 
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n,flag=0;
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
            if(a[i]!=1&&flag==0)
                flag=i;
        }
        if(flag==0)
        {
            if(n%2==1)
                printf("First\n");
            else
                printf("Second\n");
        }else
        {
            if(flag%2==1)
                printf("First\n");
            else
                printf("Second\n");
        }
    }
}

C1. Prefix Flip (Easy Version)

这题昨晚上也是到中间思路断了 然后自闭睡觉了
挺可惜的

题目思路

因为题目没有给步数限制 所以可以一位一位的修改
题目是用前缀修改 所以从后往前修改可以保证修改好的数不被影响到
所以我们从后往前记录 如果当前位 a[i]!=b[i]
那么我们将a串1到i翻转 在将1修改 在翻转1到i
这时候a[i]就等于b[i]了
我们重复上述操作 知道完成整个字符串 就是答案了

ac代码

#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <math.h>
#include <string.h>
#include <vector>
#include <stack>
#include <queue>
#include <map>
#include <set>
#include <utility>
#define pi 3.1415926535898
#define ll long long
#define lson rt<<1
#define rson rt<<1|1
#define eps 1e-6
#define ms(a,b) memset(a,b,sizeof(a))
#define legal(a,b) a&b
#define print1 printf("111\n")
using namespace std;
const int maxn = 2e3+10;
const int inf = 0x3f3f3f3f;
const ll llinf =0x3f3f3f3f3f3f3f3f;
const int mod = 1e9+7;
 
char a[maxn],b[maxn];
int ans[maxn<<1];
 
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n;
        scanf("%d",&n);
        scanf("%s%s",a+1,b+1);
        int cnt=0;
        for(int i=n;i>=1;i--)
        {
            if(a[i]!=b[i])
            {
                ans[++cnt]=i;
                if(i!=1)
                {
                    ans[++cnt]=1;
                    ans[++cnt]=i;
                }
 
            }
        }
        printf("%d ",cnt);
        for(int i=1;i<=cnt;i++)
            printf("%d ",ans[i]);
        printf("\n");
    }
}

C2. Prefix Flip (Hard Version)

题目思路

这题看的别人的题解 才知道咋做的
因为题目限制了不大于2n行动步数 我们需要改方法
根据2n 我们很容易能想到对于整个串做两次从1到n的操作
那么我们可以先用n个操作将a串变成同一个字符
然后记录当前时刻串的样子
再去跟b串每个位置作比较 从后往前保证修改过的值不被影响
每次修改后记录当前位置往前的串的样子
重复这些操作 最后就能完成题目给的任务了
还有这题的n的范围变了 记得改 不然会re

ac代码

#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <math.h>
#include <string.h>
#include <vector>
#include <stack>
#include <queue>
#include <map>
#include <set>
#include <utility>
#define pi 3.1415926535898
#define ll long long
#define lson rt<<1
#define rson rt<<1|1
#define eps 1e-6
#define ms(a,b) memset(a,b,sizeof(a))
#define legal(a,b) a&b
#define print1 printf("111\n")
using namespace std;
const int maxn = 1e5+10;
const int inf = 0x3f3f3f3f;
const ll llinf =0x3f3f3f3f3f3f3f3f;
const int mod = 1e9+7;
 
char a[maxn],b[maxn];
int ans[maxn<<1];
 
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n,cnt=0;
        scanf("%d",&n);
        scanf("%s%s",a+1,b+1);
        for(int i=1;i<n;i++)
        {
            if(a[i]!=a[i+1])
                ans[++cnt]=i;
        }
        char now=a[n];
        for(int i=n;i>=1;i--)
        {
            if(b[i]!=now)
            {
                ans[++cnt]=i;
                now=b[i];
            }
        }
        printf("%d ",cnt);
        for(int i=1;i<=cnt;i++)
            printf("%d ",ans[i]);
        printf("\n");
    }
}

你可能感兴趣的:(Codeforces Round #658 (Div. 2) a,b,c1,c2)