Educational Codeforces Round 65 (Rated for Div. 2) A,B,C,D

第一次写交互题,幸得大神指点,要不然这一场就真的得掉很多分了。

A. Telephone Number

传送门

只要是第一个8后面的数字个数大于等于11就可以

#include 
using namespace std;
const int maxn = 3e5 + 10;
char s[maxn];
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int n;
        scanf("%d",&n);
        string s;
        cin >> s;
        int i;
        for(i = 0;i < n; i++)
        {
            if(s[i] == '8')
                break;
        }
        if(n - i >= 11)
            printf("YES\n");
        else
            printf("NO\n");
    }
    return 0;
}

B. Lost Numbers

交互题,给你了6个数字,让你通过4次询问确定这6个数字的排列。

#include
using namespace std;
int a[6] = {4, 8, 15, 16, 23, 42},ans[5];
int main()
{
#ifndef ONLINE_JUDGE
    freopen("in","r",stdin);
#endif
    for(int i = 1; i <= 4; i++)
    {
        printf("? %d %d\n", i, i + 1);
        fflush(stdout);
        scanf("%d",&ans[i]);
    }
    while(next_permutation(a, a+6))
    {
        if(a[1] * a[0] == ans[1] && a[2] * a[1] == ans[2] && a[3] * a[2] == ans[3] && a[4] * a[3] == ans[4])
            break;
    }
    cout << "!";
    for(int i = 0; i < 6; i++)
        printf(" %d", a[i]);
    cout << "\n";
    return 0;
}

C. News Distribution

传送门

就是一个简单的并查集,在合并的时候需要维护一个数组来记录当前节点所在的集合的节点个数。

#include
using namespace std;
const int maxn = 5e5+10;
int pre[maxn],x[maxn],ans[maxn];
int Find(int x)
{
    if (x != pre[x])
        pre[x] = Find(pre[x]);
    return pre[x];
}
void combine(int a, int b)
{
    int fa = Find(a);
    int fb = Find(b);
    if (fa == fb)
        return;
    pre[fb] = fa;
    ans[fa] += ans[fb];
}
int main()
{
    int n,m;
    cin >> n >> m;
    for (int i = 1; i <= n; i++)
    {
        pre[i] = i;
        ans[i] = 1;
    }
    int a;
    for (int j = 0; j < m; j++)
    {
        cin >> a;
        for (int i = 0; i < a; i++)
        {
            cin >> x[i];
            if (i >= 1)
                combine(x[i - 1], x[i]);
        }
    }
    for (int i = 1; i <= n; i++)
        cout << ans[Find(i)] << " ";
    return 0;
}

D. Bicolored RBS

传送门

题目让两种括号的深度之差尽可能的小,就先跑一遍求出最大深度,然后深度分一半,一半是一种,另一半是另一种。

#include
using namespace std;
typedef long long ll;
const int maxn = 2e5+10;
int mp[maxn];
string s;
int main()
{
	#ifndef ONLINE_JUDGE
	freopen("in.txt","r",stdin);
	#endif
	int n;
	cin >> n >> s;
	int tmp = 0,ans = 0;
	for(int i = 0;i < n; i++)
	{
		if(s[i] == '(')
		{
			tmp++;
			mp[i] = tmp;
		}	
		else
		{
			mp[i] = tmp;
			tmp--;
		}	
		ans = max(ans,tmp);
	}
	ans = ans / 2;
	for(int i = 0;i < n; i++)
	{
		if(mp[i] > ans)
			printf("1");
		else
			printf("0");
	}
	printf("\n");
	return 0;
}

 

你可能感兴趣的:(CF,比赛题解)