Perfect Groups CodeForces - 980D
题目大意:
定义一个问题: 求集合$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的更多相关文章
- Codeforces 980D Perfect Groups 计数
原文链接https://www.cnblogs.com/zhouzhendong/p/9074164.html 题目传送门 - Codeforces 980D 题意 $\rm Codeforces$ ...
- Codeforces 980 D. Perfect Groups
\(>Codeforces\space980 D. Perfect Groups<\) 题目大意 : 设 \(F(S)\) 表示在集合\(S\)中把元素划分成若干组,使得每组内元素两两相乘 ...
- CF 980D Perfect Groups(数论)
CF 980D Perfect Groups(数论) 一个数组a的子序列划分仅当这样是合法的:每个划分中的任意两个数乘积是完全平方数.定义a的权值为a的最小子序列划分个数.现在给出一个数组b,问权值为 ...
- codeforces 980D Perfect Groups
题意: 有这样一个问题,给出一个数组,把里面的数字分组,使得每一个组里面的数两两相乘都是完全平方数. 问最少可以分成的组数k是多少. 现在一个人有一个数组,他想知道这个数组的连续子数组中,使得上面的问 ...
- Codeforces980 D. Perfect Groups
传送门:>Here< 题目大意:先抛出了一个问题——“已知一个序列,将此序列中的元素划分成几组(不需要连续)使得每一组中的任意两个数的乘积都是完全平方数.特殊的,一个数可以为一组.先要求最 ...
- cf980d Perfect Groups
题意 定义一个串的权值是将其划分成 \(k\) 组,使得每一组在满足"从组里选出一个数,再从组里选出一个数,它们的乘积没有平方因子"这样的前提时的最小的 \(k\).每组的数不必相 ...
- Codeforces 980D
这题其实挺水的,但我比较vegetable,交了好多次才过. 题意: 给定一个序列,把这个序列的所有连续子序列分组,每组中任意两个数相乘是个完全平方数,输出每个子序列最少分的组数: 思路: 先把每个数 ...
- cf round480D Perfect Groups
题意:给一个序列,对于每一个连续的区间,区间内的数至少分成几个组,使得每个组内的数任意2个相乘是一个完全平方数(包括0). 输出每个组数的个数. $n \leq 5000 , |a_i| \leq 1 ...
- [codeforces 317]A. Perfect Pair
[codeforces 317]A. Perfect Pair 试题描述 Let us call a pair of integer numbers m-perfect, if at least on ...
随机推荐
- Jmeter响应内容显示乱码问题的解决办法
Jmeter在访问接口的时候,响应内容如果有中文可能会显示乱码,原因应该是响应页面没有做编码处理,jmeter默认按照ISO-8859-1编码格式进行解析. 下面把解决步骤列一下: 现象:jmeter ...
- js监听页面是否在浏览器当前页面
在最近的一个socket项目中,需要监听客户端是否已读客服端发送的消息. 这里用到了html5中document新增了一个事件 visibilitychange,这个事件在页面前台或后台切换时被触发, ...
- web.xml配置详解之listener
web.xml配置详解之listener 定义 <listener> <listener-class>nc.xyzq.listener.WebServicePublishLis ...
- JavaScript 实现全选 / 反选功能
JavaScript 实现全选 / 反选功能 版权声明:未经授权,内容严禁转载! 构建主体界面 编写 HTML 代码 和 CSS 代码,设计主题界面 <style> #user { wid ...
- 20145303刘俊谦 Exp8 Web基础
20145303刘俊谦 Exp8 Web基础 基础问题回答 1.什么是表单? 表单是一个包含表单元素的区域,表单元素是允许用户在表单中(比如:文本域.下拉列表.单选框.复选框等等)输入信息的元素,表单 ...
- 20145326蔡馨熠《网络对抗》shellcode注入&Return-to-libc攻击深入
20145326蔡馨熠<网络对抗>shellcode注入&Return-to-libc攻击深入 准备一段shellcode 首先我们应该知道,到底什么是shellcode.经过上网 ...
- Serv-U FTP服务器安装及使用图解教程
Serv-U,是一种被广泛运用的FTP服务器端软件,支持3x/9x/ME/NT/2K等全Windows系列.可以设定多个FTP服务器.限定登录用户的权限.登录主目录及空间大小等,功能非常完备. 它具有 ...
- 【前端】Vue.js实现实例搜索应用
实例搜索应用 实现效果: 实现代码与注释: <!DOCTYPE html> <html> <head> <title>实例搜索</title> ...
- Python3基础 if嵌套示例
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...
- luoguP2572 [SCOI2010]序列操作
题目&&链接 反正数据都是一样的,luogu比较友好 luogu bzoj lxhgww最近收到了一个01序列,序列里面包含了n个数,这些数要么是0,要么是1,现在对于这个序列有五种变 ...