链接

题目大意:

定义一个问题: 求集合$S$的最小划分数,使得每个划分内任意两个元素积均为完全平方数.

给定$n$元素序列$a$, 对$a$的所有子区间, 求出上述问题的结果, 最后要求输出所有结果的出现次数

可以先考虑每个划分中的数需要满足什么条件.

假设均为正数, 则只需要所有数除去平方因子后相等即可, 负数的话, 跟正数一样, 正负分开处理即可, 再特判掉$0$.

再考虑如何求解, 因为$n$范围比较小可以支持$n^2$算法的, 直接考虑暴力求出每个子区间的结果, 最后再统计答案.

这样的话需要考虑如何$O(1)$进行转移子区间之间的结果.

考虑添加一个数$x$的情况, 如果之前已经有$x$直接并入其划分, 否则要新增一个划分

所以维护每个数最后出现位置即可.

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <set>
#include <map>
#define REP(i,a,n) for(int i=a;i<=n;++i)
using namespace std; const int N = 5e3+10;
int n, a[N], ans[N];
map<int, int> pos[2];
int cnt[N][N], z; int calc(int x) {
int r = 1;
for (int i=2; i*i<=x; ++i) if (x%i==0) {
int f = 0;
while (x%i==0) f^=1, x/=i;
if (f) r *= i;
}
if (x>1) r *= x;
return r;
} int main() {
scanf("%d", &n);
REP(i,1,n) {
int t, flag = 0;
scanf("%d", &t);
if (t<0) t=-t, flag=1;
int num = calc(t);
if (!t) REP(j,1,i-1) cnt[j][i]=cnt[j][i-1];
else if (pos[flag].count(num)) {
int x = pos[flag][num];
REP(j,1,x) cnt[j][i]=cnt[j][i-1];
REP(j,x+1,i-1) cnt[j][i]=cnt[j][i-1]+1;
} else REP(j,1,i-1) cnt[j][i]=cnt[j][i-1]+1;
if (z) REP(j,z,i-1) cnt[j][i]=1;
cnt[i][i] = 1;
if (t) pos[flag][num] = i, z = 0;
else if (!z) z = i;
}
REP(i,1,n) REP(j,i,n) ++ans[cnt[i][j]];
REP(i,1,n) printf("%d ", ans[i]);
puts("");
}

Perfect Groups CodeForces - 980D的更多相关文章

  1. Codeforces 980D Perfect Groups 计数

    原文链接https://www.cnblogs.com/zhouzhendong/p/9074164.html 题目传送门 - Codeforces 980D 题意 $\rm Codeforces$ ...

  2. Codeforces 980 D. Perfect Groups

    \(>Codeforces\space980 D. Perfect Groups<\) 题目大意 : 设 \(F(S)\) 表示在集合\(S\)中把元素划分成若干组,使得每组内元素两两相乘 ...

  3. CF 980D Perfect Groups(数论)

    CF 980D Perfect Groups(数论) 一个数组a的子序列划分仅当这样是合法的:每个划分中的任意两个数乘积是完全平方数.定义a的权值为a的最小子序列划分个数.现在给出一个数组b,问权值为 ...

  4. codeforces 980D Perfect Groups

    题意: 有这样一个问题,给出一个数组,把里面的数字分组,使得每一个组里面的数两两相乘都是完全平方数. 问最少可以分成的组数k是多少. 现在一个人有一个数组,他想知道这个数组的连续子数组中,使得上面的问 ...

  5. Codeforces980 D. Perfect Groups

    传送门:>Here< 题目大意:先抛出了一个问题——“已知一个序列,将此序列中的元素划分成几组(不需要连续)使得每一组中的任意两个数的乘积都是完全平方数.特殊的,一个数可以为一组.先要求最 ...

  6. cf980d Perfect Groups

    题意 定义一个串的权值是将其划分成 \(k\) 组,使得每一组在满足"从组里选出一个数,再从组里选出一个数,它们的乘积没有平方因子"这样的前提时的最小的 \(k\).每组的数不必相 ...

  7. Codeforces 980D

    这题其实挺水的,但我比较vegetable,交了好多次才过. 题意: 给定一个序列,把这个序列的所有连续子序列分组,每组中任意两个数相乘是个完全平方数,输出每个子序列最少分的组数: 思路: 先把每个数 ...

  8. cf round480D Perfect Groups

    题意:给一个序列,对于每一个连续的区间,区间内的数至少分成几个组,使得每个组内的数任意2个相乘是一个完全平方数(包括0). 输出每个组数的个数. $n \leq 5000 , |a_i| \leq 1 ...

  9. [codeforces 317]A. Perfect Pair

    [codeforces 317]A. Perfect Pair 试题描述 Let us call a pair of integer numbers m-perfect, if at least on ...

随机推荐

  1. Jmeter响应内容显示乱码问题的解决办法

    Jmeter在访问接口的时候,响应内容如果有中文可能会显示乱码,原因应该是响应页面没有做编码处理,jmeter默认按照ISO-8859-1编码格式进行解析. 下面把解决步骤列一下: 现象:jmeter ...

  2. js监听页面是否在浏览器当前页面

    在最近的一个socket项目中,需要监听客户端是否已读客服端发送的消息. 这里用到了html5中document新增了一个事件 visibilitychange,这个事件在页面前台或后台切换时被触发, ...

  3. web.xml配置详解之listener

    web.xml配置详解之listener 定义 <listener> <listener-class>nc.xyzq.listener.WebServicePublishLis ...

  4. JavaScript 实现全选 / 反选功能

    JavaScript 实现全选 / 反选功能 版权声明:未经授权,内容严禁转载! 构建主体界面 编写 HTML 代码 和 CSS 代码,设计主题界面 <style> #user { wid ...

  5. 20145303刘俊谦 Exp8 Web基础

    20145303刘俊谦 Exp8 Web基础 基础问题回答 1.什么是表单? 表单是一个包含表单元素的区域,表单元素是允许用户在表单中(比如:文本域.下拉列表.单选框.复选框等等)输入信息的元素,表单 ...

  6. 20145326蔡馨熠《网络对抗》shellcode注入&Return-to-libc攻击深入

    20145326蔡馨熠<网络对抗>shellcode注入&Return-to-libc攻击深入 准备一段shellcode 首先我们应该知道,到底什么是shellcode.经过上网 ...

  7. Serv-U FTP服务器安装及使用图解教程

    Serv-U,是一种被广泛运用的FTP服务器端软件,支持3x/9x/ME/NT/2K等全Windows系列.可以设定多个FTP服务器.限定登录用户的权限.登录主目录及空间大小等,功能非常完备. 它具有 ...

  8. 【前端】Vue.js实现实例搜索应用

    实例搜索应用 实现效果: 实现代码与注释: <!DOCTYPE html> <html> <head> <title>实例搜索</title> ...

  9. Python3基础 if嵌套示例

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  10. luoguP2572 [SCOI2010]序列操作

    题目&&链接 反正数据都是一样的,luogu比较友好 luogu bzoj lxhgww最近收到了一个01序列,序列里面包含了n个数,这些数要么是0,要么是1,现在对于这个序列有五种变 ...