首页 > 其他分享 >Codeforces Round 866 (Div. 2)

Codeforces Round 866 (Div. 2)

时间:2023-04-18 23:00:21浏览次数:50  
标签:ch area int Codeforces 866 maxH && Div mex

A. Yura's New Name

一个简单的 dp,状态是\(f[i][0/1]\)表示前\(i\)位变成合法的且最后一位是^_的最小代价。

如果是_只能从^转移过来,如果是^则都可以转移过来

#include <bits/stdc++.h>
using namespace std;

void solve(){
	string s;
	cin >> s;
	int n = s.size();
	if( n == 1 ){
		if( s == "_" ) cout << "2\n";
		else cout << "1\n";
		return;
	}
	vector< array<int,2> > f(n + 1 , { INT_MAX,INT_MAX}); 
	if( s[0] == '_' ) f[1][0] = 1 , f[1][1] = 2;
	else f[1][1] = 0 , f[1][0] = 1;
	for( int i = 2 ; i <= n ; i ++ ){
		if( s[i-1] == '_' ){
			if( f[i-1][1] != INT_MAX ) f[i][0] = f[i-1][1];
			if( f[i-1][1] != INT_MAX ) f[i][1] = f[i-1][1] + 1; 
		}else{
			f[i][1] = min( f[i-1][0] , f[i-1][1] );
			f[i][0] = f[i][1] + 1;
		}
	}
	cout << f[n][1] << "\n";
}

int main(){
	ios::sync_with_stdio(false) , cin.tie(nullptr) , cout.tie(nullptr);
	int t;
	cin >> t;
	while( t -- )
		solve();
	return 0;
}

B. JoJo's Incredible Adventures

把序列当成环,找到最长的连续 1 即可。手推一下就能发现最长连续的 1 出现的位置和答案无关。

#include <bits/stdc++.h>
using namespace std;

#define int long long

void solve(){
	string s;
	cin >> s;
	int n = s.size();
	if( s.find("0") == -1 ) {
		cout << n*n << "\n";
	}else{
		s = s + s;
		int m = 0;
		for( int i = 0 , t ; i < n ; i ++  ){
			if( s[i] == '1' ){
				t = 1;
				while( s[i + t] == '1' ) t ++;
				m = max( t , m );
				i = i + t - 1;
			} 
		}

		cout << (m/2ll+1ll)*((m+1ll) / 2ll) << "\n";
	}
	return ;
}

int32_t main(){
	ios::sync_with_stdio(false) , cin.tie(nullptr) , cout.tie(nullptr);
	int t;
	cin >> t;
	while( t -- )
		solve();
	return 0;
}

C. Constructive Problem

首先求一遍 mex,然后找到最左侧的 mex+1 和最右侧的 mex+1 然后把中间的全部变成 mex,再求一次 mex,如果加1 输出yes

#include <bits/stdc++.h>
using namespace std;

int read() {
    int x = 0, f = 1, ch = getchar();
    while ((ch < '0' || ch > '9') && ch != '-') ch = getchar();
    if (ch == '-') f = -1, ch = getchar();
    while (ch >= '0' && ch <= '9') x = (x << 3) + (x << 1) + ch - '0', ch = getchar();
    return x * f;
}

#define int long long

void solve(){
	int n = read();
	vector<int> a(n), b;
	for( auto & i : a) i = read();
	b = a;
	sort( b.begin(),b.end() );
	int mex = 0;
	for( auto i : b ){
		if( i < mex ) continue;
		else if( i == mex ) mex ++;
		else break;
	}
	int l = -1 , r = -1;
	for( int i = 0 ; i < n ; i ++ ){
		if( a[i] == mex + 1 ){
			if( l == -1 ) l = i;
			r = i;
		} 
	}
	if( l == -1 && r == -1 ){
		if( mex == n ) printf("No\n");
		else printf("Yes\n");
	}else{
		for( int i = l ; i <= r ; i ++ ) a[i] = mex+1;
		int newMex = 0;
		sort(a.begin(),a.end());
		for( auto i : a ){
			if( i < newMex ) continue;
			else if( i == newMex ) newMex ++;
			else break;
		}
		if( newMex == mex ) printf("Yes\n");
		else printf("No\n");
	}
	return ;
}

int32_t main(){
	for( int t = read() ; t ; t -- )
		solve();
	return 0;
}

D. The Butcher

首先第一刀切下的一定是最长的或最宽的。所以我们统计出所有块的\(maxH,maxW\)以及总面积\(area\)就知道的为二的两种情况。

怎么判断两种情况是否合法呢?

以\((maxH,\frac{area}{maxH})\)为例,前几刀一定是沿着\(w\)方向切得,此时矩形由至少一个\(maxH\)的块,可能有一些更小的块构成。把所有的\(maxH\)的块都删掉后,剩下的部分前几刀是沿着\(h\)方向切得,剩下的块组成的矩形就是\((maxH,w’)\),\(w'\)就是\(\frac{area}{maxH}\)减去删掉块的\(w\)剩下的部分。

此时矩形是有至少一个\(w’\)的方块,可能有一些更小的块构成的,然后删掉所有\(w’\)后剩下的部分前几刀是沿着\(w\)方向切得。

可以发现上述的操作实际是类似的,不断的操作就可以把块全部切开,如果切的过程中没有满足条件,或者没有切成\(n\)块都是不合法的。

#include<bits/stdc++.h>

using namespace std;

#define int long long
typedef long long ll;

int read() {
    int x = 0, f = 1, ch = getchar();
    while ((ch < '0' || ch > '9') && ch != '-') ch = getchar();
    if (ch == '-') f = -1, ch = getchar();
    while (ch >= '0' && ch <= '9') x = (x << 3) + (x << 1) + ch - '0', ch = getchar();
    return x * f;
}

void solve() {
    typedef map<int, multiset<int>> MAP;
    int n = read();
    MAP mapW, mapH;
    int maxW = 0, maxH = 0, area = 0;
    for (int w, h, i = 1; i <= n; i++) {
        w = read(), h = read();
        maxH = max(maxH, h), maxW = max(maxW, w);
        area += w * h;
        mapW[w].insert(h), mapH[h].insert(w);
    }

    auto check = [](int n, int w, int h, int f, MAP mapW, MAP mapH) -> bool {
        while (w > 0 && h > 0) {
            int tot = 0;
            if (f) { // w
                for (auto i: mapW[w]) {
                    mapH[i].erase(mapH[i].find(w));
                    tot += i, n--;
                }
                h -= tot, f = 0;
            } else {
                for (auto i: mapH[h]) {
                    mapW[i].erase(mapW[i].find(h));
                    tot += i, n--;
                }
                w -= tot, f = 1;
            }
            if (tot == 0) return false;
        }
        return n == 0;
    };
    set<pair<int, int> > res;
    if (area % maxW == 0 && check(n, maxW, area / maxW, 1, mapW, mapH))
        res.emplace(maxW, area / maxW);
    if (area % maxH == 0 && check(n, area / maxH, maxH, 0, mapW, mapH))
        res.emplace(area / maxH, maxH);
    cout << res.size() << "\n";
    for (auto [w, h]: res)
        cout << w << " " << h << "\n";
    return;


}

int32_t main() {
    for (int t = read(); t; t--)
        solve();
    return 0;
}

标签:ch,area,int,Codeforces,866,maxH,&&,Div,mex
From: https://www.cnblogs.com/PHarr/p/17331571.html

相关文章

  • Codeforces Dp
    ZeroRemainderSum  采用辅助数组$ndp[m+1][\frac{m}{2}][k]$来求出每一行中在当前第$i$列,取了$j$个物品,总和模$k$的余数是$t$的最大和是多少。用$dp[n+1][k]$来转移每一行的状态。#include<bits/stdc++.h>usingnamespacestd;const......
  • Codeforces 1810G - The Maximum Prefix(DP)
    挺小清新的一道计数题。首先先分析下这个“最大前缀和”,按照最朴素的思路就是扫一遍每个前缀,然后记录一下当前的\(sum\)与前面的\(mx\),但是如果你一直陷在这个思路上你就似了,因为按照这个思路做,你DP状态里需要记录\(sum\)和\(mx\)两个维度,算上下标一维总共是\(n^3\),并......
  • vue中使两个不同高度的div(内容长度不一)高度相同
    设置高度height,记得给左右侧div一个最小高度min-height,保证没有内容的时候有一定的高度,内容撑起来的时候再自动适应<el-col:xs="12":sm="6":md="2"class="grid-cell"><divclass="grid-contentbg-purple":style="{height:divH......
  • div背景图的动态高度实现
    <divstyle="width:20%;border:2pxsolidblack;padding-bottom:8.43%;background:url('../assets/1bg.png')no-repeat;background-size:cover"></div>既然是动态,那么width就是当前盒子的百分比,高度通过padding值了撑高。举个例子,若是200x100的图片,那么宽高比就是2:......
  • Codeforces Round 625 (Div. 1, based on Technocup 2020 Final Round) A. Journey Pl
    https://codeforces.com/contest/1320/problem/AA.JourneyPlanning题目大意:给定一组数,问我们ai-aj==i-j的时候就可以把ai的值加起来,问我们可以凑到的最大总值是多少?input6107191015output26input1400000output400000input7892611122914out......
  • Codeforces Round 866 (Div. 2) ABC
    https://codeforces.com/contest/1820A.Yura'sNewName题目大意:给定一个字符串,每次这个表情^^或者这个表情^_^就是合法的问我们这个字符串至少要添加多少东西使得怎么看都是合法的?input7^______^___^_^^^_^___^^_^^_^^^^^_^_^^___^^_output5511032#......
  • python报错:divide by zero encountered in log
    原因:数字太小的原因,溢出,计算过程中出现-inf,再做其他运算,结果还是-inf。当概率很小时,取对数后结果趋于负无穷大解决:改变浮点数的精度参考:(51条消息)RuntimeWarning:dividebyzeroencounteredinlog错误解决_旅途中的宽~的博客-CSDN博客......
  • Codeforces Round 832 (Div2)
    SwapGameAlice和Bob两个人在玩游戏。有一个长度为\(n\)的序列\(a\),Alice和Bob两人轮流完成一个操作,Alice先开始。每个人可以将数列的第一个数减\(1\),并将它与后面序列的一个数进行交换,如果一个人操作之前发现当前序列中的第一个数为\(0\),这个人就输了。问如果两......
  • Codeforces Round 764 (Div. 3) -- E. Masha-forgetful
    **题目大意:取去模板串中的子串可以组成一个给定的目标串,每个子串可以用无数次,输出组成的所需的串的信息题目中的取得子串必须“>=2”很好的提示了我们,想到一个式子2*x+3*y可以等于任何数,所以从之前的串都取长度为2,为3。在进行匹配。**structnode{ intl,......
  • 解决子级用css float浮动 而父级div没高度不能自适应高度
    解决子级对象使用cssfloat浮动而父级div不能自适应高度,不能被父级内容撑开解决方法,父级div没有高度解决方法。当在对象内的盒子使用了float后,导致对象本身不能被撑开自适应高度,这个是由于浮动产生原因。如何解决父div对象自适应高度,方法有三种,接下来DIVCSS5逐一介绍。方法一:对父......