[R17C]投票分组2

前缀和解答, 话说 题目是真的绕啊

// [R17C]投票分组2.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
/*
题目地址:
https://bs.daimayuan.top/p/99
题目名称:
[R17C]投票分组2
题目描述:
班上有 n 名同学,同学的编号为 1∼n。
现在需要通过投票确定班服的款式,有款式 1 和款式 2 两个选项,已知同学 i 支持款式 a_i。
投票的规则为:
先将同学按编号每 k 个分为一组,要求 k 是 n 的因数,即同学 1∼k 为第 1 组,同学 k+1∼2×k 为第 2 组,以此类推;
每个同学投出一票支持款式 1 或者款式 2;
每个小组统计组内同学的投票情况,如果本小组中支持款式 1 的票多于支持款式 2 的票,那么视为整个小组支持款式 1。
对于 n 的每个因数 k,按 k 从小到大的顺序,分别求将同学按编号每 k 个分为一组后有多少个小组支持款式 1。
输入格式:
第一行包含一个整数 n,表示同学的数量。
第二行包含 n 个整数 a_i,分别表示每个同学支持哪个款式。
输出格式:
对于 n 的每个因数 k,按 k 从小到大的顺序,在单独的一行中输出一个整数,表示将同学按编号每 k 个分为一组后支持款式 1 的小组的数量。
数据范围:
对于 50% 的数据,n≤1000。
对于 100% 的数据,1≤n≤10^5,1≤a_i≤2。
样例输入:
12
1 2 2 1 1 2 1 1 2 2 1 2
样例输出:
6
1
2
1
0
0
样例解释:
如果每个小组 1 个同学,共有 12 个小组,其中有 6 个小组支持款式 1:1,4,5,7,8,11。
如果每个小组 2 个同学,共有 6 个小组,其中有 1 个小组支持款式 1:4。
如果每个小组 3 个同学,共有 4 个小组,其中有 2 个小组支持款式 1:2,3。
如果每个小组 4 个同学,共有 3 个小组,其中有 1 个小组支持款式 1:2。
如果每个小组 6 个同学,共有 2 个小组,其中有 0 个小组支持款式 1。
如果每个小组 12 个同学,共有 1 个小组,其中有 0 个小组支持款式 1。

*/
#include <iostream>

using namespace std;

const int N = 100010;
int pre[N];	//前缀和记录到i为止 支持1款式的同学数目
int n;
int main()
{
	cin >> n;
	for (int i = 1; i <= n; i++) {
		int t; cin >> t;
		pre[i] = pre[i - 1] + 1 * (t == 1);
	}

	for (int i = 1; i <= n; i++) {
		if (n % i != 0) continue;
		int len = i; int res = 0;
		for (int l = 1; l <= n; l += len) {
			int r = l + len-1;
			//lr范围内支持1 的同学数目
			int cnt = pre[r] - pre[l - 1]; 
			if (cnt * 2 > len) { res++; }
		}
		cout << res << endl;	
	}

	return 0;
}

 

posted on 2025-07-14 16:01  itdef  阅读(6)  评论(0)    收藏  举报

导航