求求你们了帮帮我吧
  • 板块灌水区
  • 楼主BK小鹿
  • 当前回复13
  • 已保存回复13
  • 发布时间2024/8/13 15:06
  • 上次更新2024/8/13 16:44:20
查看原帖
求求你们了帮帮我吧
1345783
BK小鹿楼主2024/8/13 15:06

rt,只过样例。

/*
5
4 6 9 3 6
*/

/*
30
15 15 3 30 9 30 27 11 5 15 20 10 25 20 30 15 30 15 25 5 10 20 7 7 16 2 7 7 28 7
*/

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>

#define x first
#define y second
#define PII pair<int, int>

using namespace std;

const int N = 500005;

int n;
int a[N];
int num, max_val, res[N];
int f[N][35], gc[N][35];

PII ask(int l, int r)
{
	PII tmp;
	int len = (int)log(r - l + 1) / log(2);
	
    tmp.x = __gcd(gc[l][len], gc[l + r - l + 1 - (1 << len)][len]);
    tmp.y = min(f[l][len], f[l + r - l +1 - (1 << len)][len]);
    return tmp;
}

bool check(int l, int r)
{
    auto t = ask(l, r);
    if (t.x == t.y)  return 1;
	return 0;
}

int main()
{
//	freopen("point.in", "r", stdin);
//	freopen("point.out", "w", stdout);
    
    scanf("%d", &n);
    for (int i = 1; i <= n; i ++ )  scanf("%d", &a[i]);
    
    for (int i = 1; i <= n; i ++ ) f[i][0] = a[i], gc[i][0] = a[i];
    
    for (int j = 1; (1 << j) <= n; j ++ )
      for (int i = 1; i + (1 << j) - 1 <= n; j ++ )
        f[i][j] = min(f[i][j - 1], f[i + (1 <<(j - 1))][j - 1]), gc[i][j] = __gcd(gc[i][j - 1], gc[i + (1 << (j - 1))][j - 1]);
        
    
    for (int l = 1; l <= n; l ++ )
    	for (int r = n; r >= l; r -- )
    	{
    		if (r - l < max_val) break;
    		if (check(l, r))  
    		{
    			if (r - l == max_val)
				{
				   num ++ ;
				   res[num] = l; 
				} 
				else if (r - l > max_val)
				{
					max_val = r - l;
					num = 1;
					memset(res, 0, sizeof res);
					res[num] = l;
				}
			}
		}
    
    sort(res + 1, res + num + 1);
    printf("%d %d\n", num, max_val);
    for (int i = 1; i <= num; i ++ )  printf("%d ", res[i]);
	return 0;
}
2024/8/13 15:06
加载中...