这题其实挺水的,但我比较vegetable,交了好多次才过。

题意:

给定一个序列,把这个序列的所有连续子序列分组,每组中任意两个数相乘是个完全平方数,输出每个子序列最少分的组数;

思路:

先把每个数都除去自身的完全平方因子,为什么呢?这样处理了之后,只有相同的数相乘才能变成完全平方数,而且原来相乘能变成完全平方数的数对也不会有影响,举个例子:$ 1 \times 4 = 4 $,$4$是完全平方数,除去平方因子后,变成 $1 \times 1 = 1$,$1$还是完全平方数(感性地理解YY一下就好了)

把处理完的数列从小到大排序,再离散化(防止数字太大,爆MLE)

由于题目给定n的范围是$5000$,所以不能$ O(n^3) $爆扫,QXZ大佬介绍了一种非常gin的方法,我用了离散化+桶的方法;

开个桶bo[i][j]表示1到i中数值为j的个数;然后dp,f[i][j]表示i到j的数列需要分成几个区间,f[i][j]=f[i][j-1],当第j个数在i到j中唯一时,f[i][j]++;

需要注意的点:

1、除去平方因子时要用while或者倒着扫i,防止有多个平方数;

2、排序时,要记录原来的位置,离散化完要排列回原来的序列(要按原来给定序列的子序列,而且子序列在原序列中是连续的

3、0要特判,当0为一个单独的子序列时自成一组,否则与其他任何数都能变成完全平方数(和任何数都能一组

附上蒟蒻的代码:

 #include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int MAXN=;
struct rec
{
int place,num;
}a[MAXN],now;
bool comp1(const rec &x,const rec &y)
{
return x.num<y.num;
}
bool comp2(const rec &x,const rec &y)
{
return x.place<y.place;
}
int n,bo[MAXN][MAXN],f[MAXN][MAXN],ans[MAXN],special0;
bool special[MAXN];
main()
{
scanf("%d",&n);
for(int i=;i<=n;++i)
{
scanf("%d",&a[i].num);
a[i].place=i;
}
for(int i=;i<=n;++i)
{
if(a[i].num!=)
{
int k=sqrt(abs(a[i].num));
for(int j=k;j>=;--j)
while(a[i].num%(j*j)==)
{
a[i].num/=j*j;
}
} else
{
special[i]=true;
special0=i;
}
}
sort(a+,a+n+,comp1);
now.place=;
now.num=a[now.place].num;
a[now.place].num=;
for(int i=;i<=n;++i)
{
if(a[i].num==now.num)
{
a[i].num=a[now.place].num;
} else
{
now.place=i;
now.num=a[i].num;
a[i].num=a[i-].num+;
}
}
sort(a+,a+n+,comp2);
for(int i=;i<=n;++i)
for(int j=i;j<=n;++j)
bo[j][a[i].num]++;
special0=a[special0].num;
for(int i=;i<=n;++i)
{
f[i][i]=;
++ans[f[i][i]];
}
for(int i=;i<=n;++i)
for(int j=i+;j<=n;++j)
{
f[i][j]=f[i][j-];
if(bo[j][a[j].num]-bo[i-][a[j].num]==&&(!special[j])&&(((bo[j][special0]-bo[i-][special0]!=j-i)||special0==)))
++f[i][j];
++ans[f[i][j]];
}
for(int i=;i<=n;++i)
printf("%d ",ans[i]);
return ;
}

Codeforces 980D的更多相关文章

  1. Codeforces 980D Perfect Groups 计数

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

  2. codeforces 980D Perfect Groups

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

  3. Perfect Groups CodeForces - 980D

    链接 题目大意: 定义一个问题: 求集合$S$的最小划分数,使得每个划分内任意两个元素积均为完全平方数. 给定$n$元素序列$a$, 对$a$的所有子区间, 求出上述问题的结果, 最后要求输出所有结果 ...

  4. python爬虫学习(5) —— 扒一下codeforces题面

    上一次我们拿学校的URP做了个小小的demo.... 其实我们还可以把每个学生的证件照爬下来做成一个证件照校花校草评比 另外也可以写一个物理实验自动选课... 但是出于多种原因,,还是绕开这些敏感话题 ...

  5. 【Codeforces 738D】Sea Battle(贪心)

    http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...

  6. 【Codeforces 738C】Road to Cinema

    http://codeforces.com/contest/738/problem/C Vasya is currently at a car rental service, and he wants ...

  7. 【Codeforces 738A】Interview with Oleg

    http://codeforces.com/contest/738/problem/A Polycarp has interviewed Oleg and has written the interv ...

  8. CodeForces - 662A Gambling Nim

    http://codeforces.com/problemset/problem/662/A 题目大意: 给定n(n <= 500000)张卡片,每张卡片的两个面都写有数字,每个面都有0.5的概 ...

  9. CodeForces - 274B Zero Tree

    http://codeforces.com/problemset/problem/274/B 题目大意: 给定你一颗树,每个点上有权值. 现在你每次取出这颗树的一颗子树(即点集和边集均是原图的子集的连 ...

随机推荐

  1. C/C++ 内存模型

    C分为四个区:堆,栈,静态全局变量区,常量区 C++内存分为5个区域(堆栈全常代 ): 堆 heap : 由new分配的内存块,其释放编译器不去管,由我们程序自己控制(一个new对应一个delete) ...

  2. Tomcat原理剖析

    Tomcat原理学习 理解Tomcat工作原理 Tomcat的概念及启动原理浅析 Tomcat系统架构与设计模式

  3. android gradle项目剖析

    1 配置文件 1.1 gradle属性文件 1.1.1 gradle.properties 对项目范围内的gradle进行配置,比如设置cache. 1.1.2 local.properties 设置 ...

  4. [LeetCode] 137. 只出现一次的数字 II

    题目链接 : https://leetcode-cn.com/problems/single-number-ii/ 题目描述: 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三 ...

  5. Tabcontrol动态添加TabPage(获取或设置当前选项卡及其属性)

    http://blog.csdn.net/xiongxyt2/article/details/6920575 •MultiLine 属性用true 或false来确定是否可以多行显示 •Appeara ...

  6. jQuery之筛选方法

    1. 父parent.子children.find <div class="yeye"> <div class="father"> &l ...

  7. vscode配置汇总

    一.ESlint插件的作用:格式化代码 二.vetur插件:

  8. DOM属性和事件

    1-22 DOM属性设置与获取   1.获取属性: getAttribute("attribute"): var p = document.getElementById(" ...

  9. django基础篇02-url路由系统

    django的路由系统: 一.基本用法: 1.path('index', views.index), # 通过类的方式创建url映射 2.path('home', views.Home.as_view ...

  10. 解决solr无法加core

    提示缺少配置文件:Error CREATEing SolrCore 'new_core': Unable to create core [new_core] Caused by: Can't find ...