首页 > 其他分享 >Codeforces Round 950 (Div. 3)

Codeforces Round 950 (Div. 3)

时间:2024-06-04 11:22:19浏览次数:25  
标签:int 950 Codeforces fountains cin vector diff Div alice

https://codeforces.com/contest/1980

A. Problem Generator

题意:There is going to be m rounds next mouth, each of the month should be consist of "ABCDEFG", count the numebr of alphabet we should add to satisfy this requirement under a giving sequence.

总结:题比较难读懂, Each round should contain one problem..说明了每个round都应该包含这些东西,没包含就要补上去。

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

	string s;
	cin >> s;

	array<int, 26> a{};
	for (const auto& x : s) {
		a[x - 'A']++;
	}
	int res = 0;
	for (int i = 0; i <= 6; ++i) {
		res += max(0, m - a[i]);
	}
	cout << res << '\n';
}

B. Choosing Cubes

题意:查看要被删除的数在非升序排序后是否一定会被删除。

思路:排序,分3种情况讨论。

void solve() {
	int n, m, k;
	cin >> n >> m >> k;

	vector<int> a(n + 1);
	for (int i = 1; i <= n; ++i) {
		cin >> a[i];
	}
	int s = a[m];
	sort(a.rbegin(), a.rend() - 1);
	if (a[k] > s) {
		cout << "NO\n";
	}
	else if (a[k] < s) {
		cout << "YES\n";
	}
	else if (a[k] == s) {
		if (k < n && a[k + 1] == s) {
			cout << "MAYBE\n";
		}
		else {
			cout << "YES\n";
		}
	}
}

C. Sofia and the Lost Operations

题意:给定序列a和b和d,问能否通过按序列d中的数按顺序对序列a进行操作,最后将序列a转为序列b。其中每次操作可以任选一个数将a[k]变为d[j].

思路:一次遍历序列d,看是否d中的所有的数都能被用掉,并且使用完后序列a已经完全变成了序列b.如果d中某个数在b中没出现,说明该操作是冗余操作,在冗余操作后必须有一个可以进行的操作,来将冗余操作使用掉。

总结:问题还是出在了语言上,理解错题目3次。第1次以为b中操作可以无序,第2次以为a中操作必须有序。第3次好好看了看才看懂题目。应该慢慢读题目的。

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

    vector<int> a(n);
    vector<int> b(n);
    for (auto& x : a){
        cin >> x;
    }
    map<int, int> diff;
    for (int i = 0; i < n; ++i){
        cin >> b[i];
        if (a[i] != b[i]){
            diff[b[i]] ++;
        }
        if (!diff.count(b[i])){
            diff[b[i]] = 0;
        }
    }

    int m;
    cin >> m;

    bool ok = false;
    for (int i = 0; i < m; ++i){
        int x;
        cin >> x;
        if (diff.count(x) && diff[x] > 0){
            ok = true;
            diff[x] --;
        }
        else if(!diff.count(x)){
            ok = false;
        }
        else{
            ok = true;
        }
    }

    for (const auto& [x, y] : diff){
        if (y > 0){
            ok = false;
            break;
        }
    }
    cout << (ok ? "YES\n" : "NO\n");
}

D. GCD-sequence

题意:给定一个序列a,根据相邻的数的gcd构造b,问能否exactly删除a中的一个元素,使序列b非递减。

思路:求出序列b,找到第一个拐点,然后依此尝试移除跟这次比较相关联a中的元素,暴力求解。时间复杂度(n * log(n) * c)。

总结:因为重新构造的次数一定是一个常数,所以可以直接使用暴力破解的方法。一开始想的是找到谷点以后,分情况讨论移除哪个数,来判断移除该点后是否可行,发现代码量实在是太大,最后转暴力了。 做题原则1:暴力能ac,就别犹豫。。莫装逼。

void solve() {
	int n;
	cin >> n;
	vector<int> a(n);
	for (auto& x : a) {
		cin >> x;
	}

	vector<int> b;
	for (int i = 0; i < n - 1; ++i) {
		b.push_back(gcd(a[i], a[i + 1]));
	}

	auto check = [&](int p) {
		if (p < 0 || p > n - 1) {
			return false;
		}
		auto c = a;
		c.erase(c.begin() + p);
		vector<int> d;
		for (int i = 0; i < n - 2; ++i) {
			d.push_back(gcd(c[i], c[i + 1]));
			if (i && d[i] < d[i - 1]) {
				return false;
			}
		}
		return true;
	};

	for (int i = 0; i < n - 2; ++i) {
		if (b[i] > b[i + 1]) {
			if (check(i - 1) || check(i) || check(i + 1) || check(i + 2)) {
				cout << "YES\n";
				return;
			}
			else {
				cout << "NO\n";
				return;
			}
		}
	}
	cout << "YES\n";
}

E. Permutation of Rows and Columns

题意:给定两个矩阵a和b,并且矩阵中的数是个permutation。问矩阵a能否通过交换任意次数行和列得到矩阵b。

思路:记录a中每个元素所在的行和列,遍历b中的元素。依此统计出该元素变换到b中的所在行和列,a的行要交换到哪个行,列要交换到哪个列,如果有冲突,则No。

总结:一开始想复杂了,以为是什么构造边,然后拓扑排序,或者并查集什么的。后来想了想,只要行列交换没有冲突,那就可以了。。

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

    vector<pair<int, int>> a(n * m + 1);
    for (int i = 1; i <= n; ++i){
        for (int j = 1; j <= m; ++j){
            int x;
            cin >> x;
            a[x] = {i, j};
        }
    }

    vector<vector<int>> b(n + 1, vector<int> (m + 1));
    for (int i = 1; i <= n; ++i){
        for (int j = 1; j <= m; ++j){
            cin >> b[i][j];
        }
    }

    vector<int> row(n + 1, -1);
    vector<int> col(m + 1, -1);
    for (int i = 1; i <= n; ++i){
        for (int j = 1; j <= m; ++j){
            const int& x = b[i][j];
            int r = a[x].first;
            int c = a[x].second;
            if (row[r] != -1 && row[r] != i){
                cout << "NO\n";
                return;
            }
            if (col[c] != -1 && col[c] != j){
                cout << "NO\n";
                return;
            }
            row[r] = i;
            col[c] = j;
        }
    }

    cout << "YES\n";
    return;
}

上面是赛时A掉的题,大概快半年没打cf了,rank2000多,在预期内。
准备补剩下的题。

F1. Field Division (easy version)

题意:给定一个矩阵和一堆喷泉fountains,alice从左边或上边出发,问alice不碰到喷泉,最多能占到多少格子(路线左下+路线格子是alice的)。再问,考虑所有的i,如果第i个喷泉给了alice,alice是否能增加格子。

思路:模拟题,对fountains按列升序排序,行降序排序。然后依此考虑每个fountain和上一步的x和y坐标,求出上一步到当前这一步alice可以占到多少格子。如果当前x>上一步的x,说明这个fountain给了alice可以为alice带来效益。

总结:前面几个题写的太慢了,不然的话这个赛时应该能写出来,不过处理这二维坐标问题和移动,确实非常抽象。。还有就是坐标计算没有转long long,溢出了。

void solve() {
    int n, m, k;
    cin >> n >> m >> k;

    vector<pair<long long, long long>> fountains(k);
    for (auto& x : fountains){
        cin >> x.first >> x.second;
    }

    vector<int> pos(k);
    iota(pos.begin(), pos.end(), 0);
    sort(pos.begin(), pos.end(), [&](const int& a, const int& b){
            return fountains[a].second !=  fountains[b].second ?
            fountains[a].second < fountains[b].second : fountains[a].first > fountains[b].first;
        });

    vector<int> ans(k, 0);
    long long res = 0;
    long long lastx = 0, lasty = 0;
    bool first_time = true;
    for (int i = 0; i < k; ++i){
        const auto&[x, y] = fountains[pos[i]];
        if (first_time){
            lastx = 0;
            lasty = 1;
            first_time = false;
        }
        if (y > lasty){
            res += (n - lastx) * (y - lasty);
        }
        if (x > lastx){
            ans[pos[i]] = 1;
        }
        lastx = max(x, lastx);
        lasty = y;
    }
    res += (m - lasty + 1) * (n - lastx);
    cout << res << '\n';
    for (int i = 0; i < k; ++i){
        cout << ans[i] << " \n"[i == k - 1];
    }
}

F2. Field Division (hard version)
题意:比上个题增加了一个要求输出将fountain给了alice后,alice增加了exactly多少个格子。

思路:对于有贡献的fountain,想到了使用单调栈,在下一个>=当前fountain的x喷泉出现之前,这一段中的所有列都有贡献。但是对于每个列,计算贡献又不太好计算,要遍历所有的喷泉才行,如果要遍历所有的喷泉,单调栈好像又显得没有意义。

先缓缓

标签:int,950,Codeforces,fountains,cin,vector,diff,Div,alice
From: https://www.cnblogs.com/yxcblogs/p/18230155

相关文章

  • Topcoder SRM592-Div1-Lv2 LittleElephantAndPermutationDiv1
    题意设\(A,B\)为两个长为\(n\(\leq50)\)的排列,定义操作\(F(A,B)=\sum\limits_{i=1}^{n}\max(A_i,B_i)\),给定\(n,k\),求有多少种有序对\((A,B)\)满足\(F(A,B)\geqk\),答案模\(10^9+7\)。思路首先还是用经典的思路将无序转为无序,我们假定\(A\)是有序的即\(A={1,2,3,......
  • A4950/DRV8870/AT8870/AS4950
    从这里,我们就可以看到AS4950有4种驱动状态:1:IN1端口输入PWM,IN2端口输入低电平,芯片输出正电流,电机正转;2:IN1端口输入低电平,IN2端口输入PWM,芯片输出负电流,电机反转;3:IN1端口输入高电平,IN2端口输入PWM,芯片输出正电流,电机正传;4;IN1端口输入PWM,IN2端口输入高电平,芯片输出负电流,电机反转......
  • Educational Codeforces Round 166 (Rated for Div. 2)
    A.VerifyPassword题目描述Monocarpisworkingonhisnewsite,andthecurrentchallengeistomaketheuserspickstrongpasswords.Monocarpdecidedthatstrongpasswordsshouldsatisfythefollowingconditions:passwordshouldconsistonlyoflowerc......
  • D. Divide and Equalize
    题解我们只需要将每个数拆成质因数相乘的形式,然后对每个质因数累加,最后观察每个质因数出现的次数是不是数组长度的整数倍即可。code #include<bits/stdc++.h>usingnamespacestd;constintN=1e4+5;inta[N];map<int,int>map1;boolss(intm){for(inti=2;i<......
  • 班级网页制作 HTML个人网页设计 我的班级网站设计与实现 大学生简单班级静态HTML网页
    ......
  • 个人介绍网页代码 html静态网页设计制作 dw静态网页成品模板素材网页 web前端网页设计
    ......
  • 5.31 CF R 949 (Div.2)
    5.31CFR949(Div.2)Solve:A~D(4/6)Rank:99Rating:\(1939+131=2070\)(\(1989+81=2070\))发挥评价:Normal失误:小失误是做2B时候没有注意,第一次错了之后就急了,接连交了\(4\)发罚时。注意如果交上去WA了,想清楚、找清楚问题再交。CF1981E(me*2200)给定\(n\)......
  • Codeforces Round 949 (Div. 2)
    目录写在前面ABCD写在最后写在前面比赛地址:https://codeforces.com/contest/1976妈的昨晚硬撑打了场edu上午实验下午爬山考试困困困妈的什么二进制场,C吃了个爽呃呃写得什么史山A二进制。一个显然的想法是选择区间\([l,r]\)中质因数次数之和最大的数。特别指出了限制......
  • Codeforces Round 949 (Div. 2)
    榜单#提交者=*ABCDEF1(2055)gutongxing20261388-1488900A#include<bits/stdc++.h>usingnamespacestd;intT,n,m;signedmain(){ scanf("%d",&T); while(T--){ scanf("%d%d",&n,&m); printf(&quo......
  • Educational Codeforces Round 166 (Rated for Div. 2)
    目录写在前面ABCD写在最后写在前面比赛地址:https://codeforces.com/contest/1976满课,并且48小时之内只睡了8h。本来不想打的,但是手痒就上小号打了,然而唐唐唐掉大分呃呃A签到。感谢isdigit函数。///*By:Luckyblock*/#include<bits/stdc++.h>#defineLLlonglon......