首页 > 其他分享 >Educational Codeforces Round 168 (Rated for Div. 2)

Educational Codeforces Round 168 (Rated for Div. 2)

时间:2024-08-06 10:39:22浏览次数:7  
标签:Educational Rated int 结点 Codeforces ++ weights && 权值

没有时间参赛 直接补几道简单题吧~

B. Make Three Regions

题意:给一个2行的字符串,有block和其他东西,问把一个位置变成block让联通的部分变成3个部分,有多少种方法

思路:找规律,找所哟符合条件的块即可

void solve(){
	int n;
	cin >> n;

	array<string, 2> s;
	cin >> s[0] >> s[1];

	int ans = 0;
	for (int i = 1; i < n - 1; ++i) {
		for (int j = 0; j < 2; ++j) {
			if (s[j][i] == '.' && s[j][i - 1] == 'x' && s[j][i + 1] == 'x' &&
				s[j ^ 1][i] == '.' && s[j ^ 1][i - 1] == '.' && s[j ^ 1][i + 1] == '.'
			)  {
				ans ++;
			}
		}
	}

	cout << ans << '\n';
}

C. Even Positions

题意:给定长度为n的括号字符串,下标1~n,并且所有奇数位置上的字符让自己填。字符串的代价是匹配括号的距离。求所有填充字符的方法中最小的距离。

思路:一眼贪心,首先字符串要合法。在合法的前提下,肯定是如果有左括号就直接填右。如果没有左,就填左。

总结:这个算法的正确性证明比较有趣。 会不会出现按照这个策略填充,会出现到了最后左右括号数量不相等的情况?

void solve(){
	int n;
	cin >> n;
	string s;
	cin >> s;

	int cnt = 0;
	for (int i = 0; i < n; ++i) {
		if (s[i] == '_') {
			if (!cnt) {
				cnt ++;
				s[i] = '(';
			}
			else {
				s[i] = ')';
				cnt --;
			}
		}
		else {
			cnt += (s[i] == '(' ? 1 : -1);
		}
	}

	int ans = 0;
	for (int i = 0; i < n; ++i) {
		if (s[i] == '(') {
			ans -= i;
		}
		else {
			ans += i;
		}
	}

	cout << ans << '\n';
}

D. Maximize the Root

题意:给定一颗树,每个结点有权值。每次操作可以将以当前结点v的子树中,所有的子节点权值-1,然后v的权值+1。不限操作次数的操作后,root根的编号为1的最大权值是多少?

思路:操作过程中要求结点权值不能为负数,所以结点1的权值增加的幅度,就是树中所有的结点,经过操作后值最小的最大值。于是问题转化为,经过若干次操作后,权值最小的结点,最大是多少。 直接dfs遍历,统计当前子树中权值最小的结点,分两种情况讨论。如果当前结点权值<最小权值结点,则当前结点权值变大,否则不变。

总结:一开始理解错题了,以为权值减小的结点只跟与当前结点直接相连的子节点有关。后来tc过不去才发现是子树中所有的结点都要操作,丢。

void solve(){
    int n;
    cin >> n;
    
    vector<vector<int>> al(n + 1);
    vector<long long> weights(n + 1);
    for (int i = 1; i <= n; ++i) {
        cin >> weights[i];
    }
    
    for (int i = 2; i <= n; ++i) {
        int p;
        cin >> p;
        al[p].push_back(i);
    }

    auto dfs = [&](auto&& self, int u)->long long {
        long long x = INF_LL;
        for (const auto& v : al[u]) {
            x = min(self(self, v), x);
        }
        if (x!= INF_LL) {
            if (u == 1) {
                weights[u] += x;
            }
            else if (x > weights[u]) {
                weights[u] = (weights[u] + x) / 2;
            }
            else {
                weights[u] = x;
            }
        }
        return weights[u];
    };

    cout << (dfs(dfs, 1)) << '\n';
}

有模板写程序就是好用

https://github.com/yxc-s/programming-template

标签:Educational,Rated,int,结点,Codeforces,++,weights,&&,权值
From: https://www.cnblogs.com/yxcblogs/p/18344682

相关文章

  • CodeForces-765F
    首先,如果你写过P9058的话,应该会想到支配点对这个trick,我们不妨将此题的套路搬到这套题上.定义点对\((i,j),a_i\lea_j\),当\((i,j)\)被支配当且仅当存在\(i<k<j\)满足\(a_i\lea_k\lea_j\)。相应的,一个有效的点对\((i,j)\),其中\(i\)满足\(i\)最大且\(a_i<a_j\)。......
  • Codeforces Round 963 (Div. 2) A - C 详细题解(思路加代码,C++,Python) -- 来自灰名
    比赛链接:Dashboard-CodeforcesRound963(Div.2)-Codeforces之后有实力了再试试后面的题目,现在要做那些题,起码要理解一个多小时题目A:链接:Problem-A-Codeforces题目大意理解:        极少数不考翻译能读懂的cf题目(bushi)每个测试用例第一行一个n,......
  • Codeforces Round 963 (Div. 2) D题解
    CodeforcesRound963D题目描述给定两个正整数n和k以及另一个由n个整数组成的数组a。在一次操作中,可以选择a中大小为k的任意一个子数组,然后将其从数组中删除,而不改变其他元素的顺序。更正式地说,假设(l,r)是对子数组a[l],a[l+1],...,a[r]的操作,使得r-l+1......
  • Codeforces Round 963 (Div. 2) 补题记录(A~D,F1)
    不会做F1.不会做F1.不会做F1.不会做F1.不会做F1.不会做F1.不会做F1.不会做F1.不会做F1.不会做F1.不会做F1.不会做F1.不会做F1.不会做F1.不会做F1.不会做F1.不会做F1.不会做F1.不会做F1.不会做F1.不会做F1.不会做F1.A直接计算每一个选项最多对多少个题加起......
  • Codeforces Round 891 (div.3) D题解析
    CodeForcesRound898(div4)D题.StrongVertices大致思路对于题目的给的式子,au-av>=bu-bv,我们可以通过移项得到au-bu>=av-bv,这样就能够构造出来一个ai-bi的项出来对于构造出来的项,我们可以遍历一遍用数组把每一个项存起来,找到值最大的项,值最大的项所对应的下标就是强顶......
  • Educational Codeforces Round 168 (Rated for Div. 2)-7.30复盘
    A.StrongPassword简单题,找到相同的两个相邻字母之间插一个跟他们不同的大写字母即可inlinevoidsolve(){ cin>>s; intid=0; charhh=''; for(inti=1;i<s.size();i++){ if(s[i-1]==s[i]){ id=i;break; } } for(inti=0;i<26;i++){ if(s[id]!='a'+i&a......
  • Educational Codeforces Round 168 (Rated for Div. 2)
    题目链接:EducationalCodeforcesRound168(RatedforDiv.2)总结:题目较简单,但是发挥很一般。A,B题一直读假题,卡了半个小时;C题用char存int,难绷了。A.StrongPasswordtag:模拟voidsolve(){strings;cin>>s;for(inti=1;i<s.size();i++){......
  • Codeforces Round 891 (Div. 3)
    比赛链接完成度:4/7这场比赛相对于上次那场909div3,题目描述清楚许多(可能是出简单了)。首先是B题,一道模拟四舍五入的题目题目B这题就是简单模拟,我们需要读入一个数字字符串,把他输入到一个数组当中,然后从低位到高位找大于等于5的数,如果找到了,那么之前的数包括这个数都变成0,下一......
  • CodeForces-808#D 题解
    思路分析分析样例1:3132原数组被分成1和32两部分,将2移到左边即可。我们设左边部分的和为\(s1\),右边为\(s2\),可以发现对于任何分割方式,只有满足\(s1\pmx=s2\mpx\)才可以继续讨论答案是否成立。推论1:由于\(x\ina\)(\(a\)为题目所给数列),因此\(|\s1-s2......
  • Codeforces Round 909 (Div. 3)--题目描述无法名状
    好吧,可能是我的文字功底太弱了,首先滴就是这个B题题目链接我一开始还以为这个能排序,就是算排完序之后的最大差,但是仔细一看题目,好像不要求使用排序,于是就尝试暴力做法。我发现的暴力做法是枚举k,直到k==n/2为止,当时是因为没有开longlong导致WA了,后面发现时间不是怎么多就没有......