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 ...
随机推荐
- 由浅入深之Tensorflow(3)----数据读取之TFRecords
转载自http://blog.csdn.net/u012759136/article/details/52232266 原文作者github地址 概述 关于Tensorflow读取数据,官网给出了三种 ...
- web前端----JavaScript的DOM(三)
一.JS中for循环遍历测试 for循环遍历有两种 第一种:是有条件的那种,例如 for(var i = 0;i<ele.length;i++){} 第二种:for (var i in l ...
- Winform 出现“Win已停止工作”解决方法
一.错误描述 错误名称如上.整体错误如下: Win已停止工作 二.解决方法: 1.请以管理员身份运行命令:“netsh winsock reset”,重启电脑后再次尝试运行本工具. 2.使用360安全 ...
- SQL锁机制和事务隔离级别
摘自:http://www.cnblogs.com/haiyang1985/archive/2009/02/27/1399641.html 锁机制 NOLOCK和READPAST的区别. 1. ...
- 来了解一下Ajax是什么?Ajax的原理?Ajax与传统Web比较?Ajax的优缺点?Ajax的Post与Get比较
一.什么是Ajax Ajax(Asynchronous Java and XML的缩写)是一种异步请求数据的web开发技术,对于改善用户的体验和页面性能很有帮助.简单地说,在不需要重新刷新页面的情况下 ...
- Python3基础 函数 递归 阶乘与斐波那契数列
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...
- luogu1049装箱问题
装箱问题 传送门 一个箱子容量为V//容量 同时有n个物品//n个 体积&&价值 要求n个物品中任取若干个装入箱内,使箱子的剩余空间为最小// v减去价值最大 */ #include& ...
- Mysql中unique与primary约束的区别分析(转)
本文章来给大家介绍在mysql中unique与primary约束的区别分析,unique与primary是我们在创建mysql时常用的类型了,下面我来给大家介绍介绍. 定义了UNIQUE约束的字段 ...
- Linq join right join left join
代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; using Syst ...
- 【第二十九章】 springboot + zipkin + mysql
zipkin的数据存储可以存在4个地方: 内存(仅用于测试,数据不会持久化,zipkin-server关掉,数据就没有了) 这也是之前使用的 mysql 可能是最熟悉的方式 es Cassandra ...