BestCoder Round #65

本文深入探讨了算法和数据结构的核心概念,包括排序算法、动态规划、哈希算法等,详细解释了如何运用这些技术解决复杂问题,并通过实例演示了它们的实际应用。

 

博弈 1002 ZYB's Game

题意:中文

分析:假定两个人是绝顶聪明的,一定会采取最优的策略.所以如果选择X的左边的一个点,那么后手应该选择X的右边对称的点,如果没有则必输,否则必胜,然后再分析下就是奇数是1,偶数是0

 

树状数组+二分(逆序数) 1003 ZYB's Premutation

题意:已知每个点前缀逆序对数和,求原排列

分析:可以得知每个点前面有几个比它大,那么用树状数组维护,二分查询从i到n有几个数字,那么答案是i-1

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

const int N = 5e4 + 5;
int A[N], B[N], a[N];
struct BIT	{
	int c[N], sz;
	void init(int n)	{
		memset (c, 0, sizeof (c));
		sz = n;
	}
	void updata(int i, int x)	{
		while (i <= sz)	{
			c[i] += x;
			i += i & (-i);
		}
	}
	int query(int i)	{
		int ret = 0;
		while (i)	{
			ret += c[i];
			i -= i & (-i);
		}
		return ret;
	}
	int bsearch(int l, int r, int k)	{
		int ret = 0, rr = r;
		while (l <= r)	{
			int mid = (l + r) >> 1;
			int cnt = query (rr) - query (mid);
			if (cnt == k)	{
				ret = mid;	r = mid - 1;
			}
			else if (cnt > k)	l = mid + 1;
			else	r = mid - 1;
		}
		return ret;
	}
}bit;
int n;

int main(void)	{
	int T;	scanf ("%d", &T);
	while (T--)	{
		scanf ("%d", &n);
		for (int i=1; i<=n; ++i)	{
			scanf ("%d", &A[i]);
		}
		B[0] = 0;
		for (int i=2; i<=n; ++i)	{
			B[i] = A[i] - A[i-1];
		}
		bit.init (n);
		for (int i=1; i<=n; ++i)	{
			bit.updata (i, 1);
		}
		for (int i=n; i>=1; --i)	{
			a[i] = bit.bsearch (1, n, B[i]);
			bit.updata (a[i], -1);
		}
		for (int i=1; i<=n; ++i)	{
			printf ("%d%c", a[i], i == n ? '\n' : ' ');
		}
	}

	return 0;
}

 

树形DP 1004 ZYB's Tree

题意:一棵树,求所有点它到其他点的距离不大于K的个数的异或和 

分析:dp[u][i] 表示u到子孙的距离为i的点的个数,dp[u][i+1] += dp[v][i].dp2[v][i] 表示v到上面的距离为i的点的个数,dp[v][i+1] += dp2[u][i] + dp[u][i] - dp[v][i-1]

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

const int N = 5e4 + 5;
int A[N], B[N], a[N];
struct BIT	{
	int c[N], sz;
	void init(int n)	{
		memset (c, 0, sizeof (c));
		sz = n;
	}
	void updata(int i, int x)	{
		while (i <= sz)	{
			c[i] += x;
			i += i & (-i);
		}
	}
	int query(int i)	{
		int ret = 0;
		while (i)	{
			ret += c[i];
			i -= i & (-i);
		}
		return ret;
	}
	int bsearch(int l, int r, int k)	{
		int ret = 0, rr = r;
		while (l <= r)	{
			int mid = (l + r) >> 1;
			int cnt = query (rr) - query (mid);
			if (cnt == k)	{
				ret = mid;	r = mid - 1;
			}
			else if (cnt > k)	l = mid + 1;
			else	r = mid - 1;
		}
		return ret;
	}
}bit;
int n;

int main(void)	{
	int T;	scanf ("%d", &T);
	while (T--)	{
		scanf ("%d", &n);
		for (int i=1; i<=n; ++i)	{
			scanf ("%d", &A[i]);
		}
		B[0] = 0;
		for (int i=2; i<=n; ++i)	{
			B[i] = A[i] - A[i-1];
		}
		bit.init (n);
		for (int i=1; i<=n; ++i)	{
			bit.updata (i, 1);
		}
		for (int i=n; i>=1; --i)	{
			a[i] = bit.bsearch (1, n, B[i]);
			bit.updata (a[i], -1);
		}
		for (int i=1; i<=n; ++i)	{
			printf ("%d%c", a[i], i == n ? '\n' : ' ');
		}
	}

	return 0;
}

 

转载于:https://www.cnblogs.com/Running-Time/p/5023751.html

关于 KFCOI Round #1 的具体资料并未在提供的引用中提及。然而,可以根据 Codeforces 类型的比赛结构以及类似的竞赛经验来推测可能的内容。 ### 参与 KFCOI Round #1 的相关信息 通常情况下,在线编程比赛(如 KFCOI 或 Codeforces)会提供以下资源供参赛者回顾: #### 1. **题目集** 比赛结束后,官方一般会在其官方网站或相关平台上发布完整的题目集合。这些题目可能会附带样例输入输出以便于理解问题的要求[^1]。 #### 2. **题解与思路分析** 官方或者社区成员往往会撰写详细的题解文档,帮助未通过某些难题的选手学习新的算法技巧。例如,在 Codeforces 中,像 A 到 D 题这样的解析是非常常见的。 #### 3. **比赛数据统计** 统计信息包括但不限于每位选手提交次数、正确率等指标。这类数据分析有助于评估个人表现并与他人对比进步空间[^3]。 #### 4. **赛后讨论论坛** 很多平台都设有专门区域让参与者自由交流想法甚至分享错误经历以互相借鉴成长。比如提到过的多次尝试不同方法解决同一道简单题目的过程就是很好的例子。 ### 如何获取上述材料? - 如果您已经注册参加了该赛事,则可以直接登录账户查看存档页面; - 对于公开可用的部分链接地址可以通过搜索引擎查询关键词“KFCOI Round #1 review”找到相关内容; - 加入一些活跃的技术社群也可能获得更多一手资讯和支持。 以下是基于假设场景下的 Python 实现示例用于处理类似 CF 圆整数分解成最小数量正整数组合的问题: ```python def min_sum_representation(n): result = "" current_value = n for digit in range(9, 0, -1): while current_value >= digit: result += str(digit) current_value -= digit return &#39;&#39;.join(sorted(result)) print(min_sum_representation(7)) # 输出:"7" ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值