Educational Codeforces Round 35 (Rated for Div. 2)

A

注意是数组中最小那个数的最近相邻距离

#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <utility>
#include <bitset>

using namespace std;
#define LL long long
#define pb push_back
#define mk make_pair
#define fi first
#define se second
#define lson (rt << 1)
#define rson ((rt << 1) | 1)
#define pill pair<int, int>
#define mst(a, b)	memset(a, b, sizeof a)
#define REP(i, x, n)	for(int i = x; i <= n; ++i)
const int MOD = 1e9 + 7;
const int qq = 1e5 + 10;
const int INF = 1e9 + 10;
map<int, int> mp;
int num[qq];

int main(){
	int n;	scanf("%d", &n);
	int minx = INF;
	int flag = INF;
	for (int i = 0; i < n; ++i) {
		scanf("%d", num + i);
		flag = min(flag, num[i]);
	}
	for (int i = 0; i < n; ++i) {
		if (mp.find(num[i]) == mp.end()) {
			mp[num[i]] = i;
		} else {
			if (num[i] == flag) {
				minx = min(minx, i - mp[num[i]]);
			}
			mp[num[i]] = i;
		}
	}
	printf("%d\n", minx);
	return 0;
}


B

枚举a类型蛋糕占了几盘

#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <utility>
#include <bitset>

using namespace std;
#define LL long long
#define pb push_back
#define mk make_pair
#define fi first
#define se second
#define lson (rt << 1)
#define rson ((rt << 1) | 1)
#define pill pair<int, int>
#define mst(a, b)	memset(a, b, sizeof a)
#define REP(i, x, n)	for(int i = x; i <= n; ++i)
const int MOD = 1e9 + 7;
const int qq = 1e5 + 10;
const int INF = 1e9 + 10;

int main(){
	int n, a, b;	scanf("%d%d%d", &n, &a, &b);
	int maxn = 0;
	for (int i = 1; i < n; ++i) {
		int ta = a / i, tb = b / (n - i);
		maxn = max(maxn, min(ta, tb));
	}
	printf("%d\n", maxn);
	return 0;
}


C

题意:给出k1, k2, k3,你可以任选x1,x2,x3,对于xi + ki,xi + 2*ki。。。的时间灯泡会亮,问是否可以从max(x1, x2, x3)开始每一个整数点时间都存在至少一个灯泡是亮的

思路:很明显如果k1,k2,k3中存在一个1,那么很显然成立,至少存在两个2也成立,三个3也成立,关键在一个2和两个4,这个要考虑到

#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <utility>
#include <bitset>

using namespace std;
#define LL long long
#define pb push_back
#define mk make_pair
#define fi first
#define se second
#define lson (rt << 1)
#define rson ((rt << 1) | 1)
#define pill pair<int, int>
#define mst(a, b)	memset(a, b, sizeof a)
#define REP(i, x, n)	for(int i = x; i <= n; ++i)
const int MOD = 1e9 + 7;
const int qq = 1e5 + 10;
const int INF = 1e9 + 10;
int k[qq];

int main(){
	bool f = false;
	int cnt1 = 0, cnt2 = 0, cnt3 = 0, cnt4 = 0;
	for (int i = 0; i < 3; ++i) {
		scanf("%d", k + i);
		if (k[i] == 1)	cnt1++;
		if (k[i] == 2)	cnt2++;
		if (k[i] == 3)	cnt3++;
		if (k[i] == 4)	cnt4++;
	}
	if (cnt1 > 0 || cnt2 > 1 || cnt3 > 2 || (cnt2 == 1 && cnt4 == 2)) {
		puts("YES");
	} else {
		puts("NO");
	}
	return 0;
}


D

题意:给出n个数,然后有m次询问,每次询问给出l r,代表翻转区间l r的数,然后你要输出翻转n个数组成逆序数对的奇偶性

思路:逆序数对的改变只针对区间l r,所以我们只需要考虑这段区间逆序数对的改变即可,观察可以发现,当一个区间翻转后,原来的逆序数对变成了非逆序数对,非逆序数对变成了逆序数对

假设 未翻转前逆序数对有x,非逆序数对有y

则     翻转后  逆序数对有y,非逆序数对有x,  如果x + y 是偶数,则奇偶性不变,如果x + y是奇数,则奇偶性改变

所以我们只需要看 区间l r的长度即可

#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <utility>
#include <bitset>

using namespace std;
#define LL long long
#define pb push_back
#define mk make_pair
#define fi first
#define se second
#define lson (rt << 1)
#define rson ((rt << 1) | 1)
#define pill pair<int, int>
#define mst(a, b)	memset(a, b, sizeof a)
#define REP(i, x, n)	for(int i = x; i <= n; ++i)
const int MOD = 1e9 + 7;
const int qq = 1e5 + 10;
const int INF = 1e9 + 10;
int num[1505], sum[1505];
int n;
void upDate(int x) {
	while (x < 1505) {
		sum[x] += 1;
		x += (x & (-x));
	}
}
int get(int x) {
	int ans = 0;
	while (x > 0) {
		ans += sum[x];
		x -= (x & (-x));
	}
	return ans;
}

int main(){
	scanf("%d", &n);
	for (int i = 1; i <= n; ++i) {
		scanf("%d", num + i);
	}
	int f = 0;
	for (int i = n; i >= 1; --i) {
		f += get(num[i]);
		upDate(num[i]);
	}
	f %= 2;
	int m;	scanf("%d", &m);
	int l, r;
	while (m--) {
		scanf("%d%d", &l, &r);
		if (l == r) {
			printf("%s\n", f == 1 ? "odd" : "even");
		} else {
			int k = (r - l + 1);
			int tmp = k * (k - 1) / 2;
			if (tmp % 2 == 1)	f ^= 1;
			printf("%s\n", f == 1 ? "odd" : "even");
		}
	}
	return 0;
}


E

思路:这题思路还是很好出来的,就是每次将比栈顶的元素小且存在的元素从大到小压入栈内,然后依次出栈,还是有些细节要考虑,比如栈空等情况

#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <utility>
#include <bitset>

using namespace std;
#define LL long long
#define pb push_back
#define mk make_pair
#define fi first
#define se second
#define lson (rt << 1)
#define rson ((rt << 1) | 1)
#define pill pair<int, int>
#define mst(a, b)	memset(a, b, sizeof a)
#define REP(i, x, n)	for(int i = x; i <= n; ++i)
const int MOD = 1e9 + 7;
const int qq = 3e5 + 10;
const int INF = 1e9 + 10;
stack<int> st;
int n, k;
int num[qq], vis[qq];
vector<int> g[qq];

int main(){
	scanf("%d%d", &n, &k);
	int now = 1;
	for (int i = 1; i <= k; ++i) {
		scanf("%d", num + i);
		if (num[i] == now) {
			now++;
			vis[num[i]] = 2;
			while (!st.empty() && st.top() == now) {
				now++;
				vis[st.top()] = 2;
				st.pop();
			}
		} else {
			st.push(num[i]);
			vis[num[i]] = 1;
		}
	}
	int cur = 1;
	bool f = true;
	int p = 0;
	while (!st.empty()) {
		int u = st.top();
		st.pop();
		while (cur < u) {
			if (vis[cur] == 1)	f = false;
			if (vis[cur] != 2) {
				vis[cur] = 2;
				g[p].pb(cur);
			}
			cur++;
		}
		if (!f)	break;
		p++;
		vis[u] = 2;
		cur = u + 1;
	}
	while (cur < n + 1) {
		if (vis[cur] == 0)	g[p].pb(cur);
			cur++;
	}
	p++;
	if (!f) {
		printf("-1\n");
	} else {
		for (int i = 1; i <= k; ++i) {
			printf("%d ", num[i]);
		}
		for (int i = 0; i < p; ++i) {
			for (int j = g[i].size() - 1; j >= 0; --j) {
				printf("%d ", g[i][j]);
			}
		}
	}
	return 0;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
"educational codeforces round 103 (rated for div. 2)"是一个Codeforces平台上的教育性比赛,专为2级选手设计评级。以下是有关该比赛的回答。 "educational codeforces round 103 (rated for div. 2)"是一场Codeforces平台上的教育性比赛。Codeforces是一个为程序员提供竞赛和评级的在线平台。这场比赛是专为2级选手设计的,这意味着它适合那些在算法和数据结构方面已经积累了一定经验的选手参与。 与其他Codeforces比赛一样,这场比赛将由多个问题组成,选手需要根据给定的问题描述和测试用例,编写程序来解决这些问题。比赛的时限通常有两到三个小时,选手需要在规定的时间内提交他们的解答。他们的程序将在Codeforces的在线评测系统上运行,并根据程序的正确性和效率进行评分。 该比赛被称为"educational",意味着比赛的目的是教育性的,而不是针对专业的竞争性。这种教育性比赛为选手提供了一个学习和提高他们编程技能的机会。即使选手没有在比赛中获得很高的排名,他们也可以从其他选手的解决方案中学习,并通过参与讨论获得更多的知识。 参加"educational codeforces round 103 (rated for div. 2)"对于2级选手来说是很有意义的。他们可以通过解决难度适中的问题来测试和巩固他们的算法和编程技巧。另外,这种比赛对于提高解决问题能力,锻炼思维和提高团队合作能力也是非常有帮助的。 总的来说,"educational codeforces round 103 (rated for div. 2)"是一场为2级选手设计的教育性比赛,旨在提高他们的编程技能和算法能力。参与这样的比赛可以为选手提供学习和进步的机会,同时也促进了编程社区的交流与合作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值