HIHO 16 B

卡了~卡了就写不下去了~其实是不会~

大牛提醒,答案必定是SUM的因子~细细想了好久,才想通~差距~

因为是所有的和GCD,所以GCD必定整除SUM。。

然后,枚举这些因子,统计前缀和的MOD,看有多少个,最多的便是以它为最大公约数的段数最多的情况。如果存在以它为GCD更多的段数的情况,必定会在前缀和统计时暴露出来。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#include <cmath>
#include <map>
#define LL long long
using namespace std;

const int MAX=2050;

int num[MAX];
vector<LL>fac;
LL block[MAX];
map<LL,int>mp;
int n;

int slove(LL m){
	mp.clear();
	LL sum=0;
	int res=0;
	for(int i=1;i<=n;i++){
		sum+=num[i];
		mp[sum%m]++;
		res=max(res,mp[sum%m]);
	}
	return res;
}

int main(){
	while(scanf("%d",&n)!=EOF){
		LL sum=0;
		fac.clear();
//		memset(block,,sizeof(block));
		for(int i=1;i<=n;i++){
			scanf("%d",&num[i]);
			sum+=num[i];
			block[i]=1;
		}
		for(LL i=1;i*i<=sum;i++){
			if(sum%i==0){
				fac.push_back(i);
				if(i!=sum/i) fac.push_back(sum/i);
			}
		}
		sort(fac.begin(),fac.end());
		int sz=fac.size();
		for(int i=0;i<sz;i++){
			int k=slove(fac[i]);
			block[k]=fac[i];
		}
		for(int i=n-1;i>=1;i--){
			block[i]=max(block[i+1],block[i]);
		}
		for(int i=1;i<=n;i++){
			printf("%lld\n",block[i]);
		}
	}
	return 0;
}

  

时间: 2024-11-05 19:31:16

HIHO 16 B的相关文章

HIHO 16 C

树分治.对于一棵子树的根节点,至少有一条边与儿子相连的属于重边.对于一条轻边,它的贡献值是两端子树大小的乘积,所以,重边应该是贡献值最大的一边. 至于要求所有的点,进行深度优先搜索,因为移动一个点只会影响两个点的两个子树,这个可以维护. 在进行DP时,选择计算最大的重边的值,答案就是用所有的边贡献值减去树的重边值的和. #include <iostream> #include <cstdio> #include <cstring> #include <algori

[hiho 16]RMQ-ST算法

问题描述 问题就是询问区间内的最小值. 数据量n, 查询量q. 朴素的算法复杂度O(nq). 为减少冗余计算,预先计算出每个位置起 2^k 长度范围内的最小值. data[i][j]表示从 i 起的 2^k 个元素的最小值. 递推式 data[i][j] = min{data[i][j – 1], data[i + 1 << (j - 1)][j - 1]}. 针对询问 [L, R],计算出最大的 k 使得 2^k < R – L + 1,区间最小值就是 min{data[L][k],

便是见到前方那

以可得量力而凌厉刀芒横扫http://weibo.com/2015.09.16/p/1001603887144312655250http://weibo.com/2015.09.16/p/1001603887144321088567http://weibo.com/2015.09.16/p/1001603887144325238274http://weibo.com/2015.09.16/p/1001603887144325282921http://weibo.com/2015.09.16/p/

对于这黑马之会

是想不出究竟还只是区区一角啊http://weibo.com/2015-09.16/p/1001603887574727917787http://weibo.com/2015-09.16/p/1001603887574727946828http://weibo.com/2015-09.16/p/1001603887574732112097http://weibo.com/2015-09.16/p/1001603887574732112103http://weibo.com/2015-09.16/

【hiho】16 RMQ-ST算法【RMQ-ST算法】

传送门:RMQ-ST算法 RMQ(Range Minimum/Maximum Query)区间范围最值查询问题 题意 求指定区间值最小的元素 思路 其实就是二分法的思路,统计所有长度为2的非负整数次幂的区间. 然后将所求转化到在包含的几个区间之中寻找最小值. Online AC Code #include <iostream> #include <cstdio> #include <cstring> #include <string> #include &l

hiho一下 第二十一周(线段树 离散化)

知识点1:离散化  对于这些区间来说,其实并不会在乎具体数值是多少,而是在他们的左右端点之间互相进行比较而已.所以你就把这N个区间的左右端点——2N个整数提出来,处理一下呗?你要注意的是,这2N个数是什么其实并不重要,你可以把这2N个数替换成为任何另外2N个数,只要他们之间的相对大小关系不发生改变就可以.” 解决方法: 那么我需要额外做的事情就是在构建线段树之前对区间进行预处理:将区间的左右端点选出来,组成一个集合,然后将这个集合依次对应到正整数集合上,并且利用这个对应将原来的区间的左右端点更换

圆内,求离圆心最远的整数点 hiho一下第111周 Farthest Point

1 // 圆内,求离圆心最远的整数点 hiho一下第111周 Farthest Point 2 // 思路:直接暴力绝对T 3 // 先确定x范围,每个x范围内,离圆心最远的点一定是y轴两端的点.枚举x的范围,再比较y 4 // O(n) 5 6 #include <bits/stdc++.h> 7 using namespace std; 8 #define LL long long 9 const double inf = 123456789012345.0; 10 const LL MO

hiho 第二周

Trie树,第一次写,简单的建树+搜索 它的思路hiho上讲得很清楚,good~ 1 #include<iostream> 2 #include<string> 3 using namespace std; 4 char word[11]; 5 int n,m; 6 struct trie 7 { 8 int num; 9 trie *next[26]; 10 trie() 11 { 12 num = 0; 13 for(int i = 0; i < 26; i++) 14

hiho #1032: 最长回文子串

#1032 : 最长回文子串 时间限制:1000ms 单点时限:1000ms 内存限制:64MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编程的学习道路上一同前进. 这一天,他们遇到了一连串的字符串,于是小Hi就向小Ho提出了那个经典的问题:“小Ho,你能不能分别在这些字符串中找到它们每一个的最长回文子串呢?” 小Ho奇怪的问道:“什么叫做最长回文子串呢?” 小Hi回答道:“一个字符串中连续的一段就是这个字符串的子串,而回文串指的是1