这题其实挺水的,但我比较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. Java实验报告(一)

    1.水仙花数 public class test1{ public static void main(String[] args){ for(int num=100;num<1000;num++ ...

  2. linux上执行mysql的脚本文件

    我们测试过程中,经常需要执行升级脚本或导入生产测试数据,对于轻量的升级脚本可以直接在客户端工具中打开执行,但是对于文件内容比较大的.sql文件,比如几百M,几G的sql文件,直接拖到客户端工具打开执行 ...

  3. [LeetCode] 52. N皇后 II

    题目链接 : https://leetcode-cn.com/problems/n-queens-ii/ 题目描述: n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间 ...

  4. P2516 [HAOI2010]最长公共子序列

    传送门 看到数据范围,显然 $n^2$ 的 $dp$... 设 $f[i][j]$ 表示 $A$ 串考虑了前 $i$ 位,$B$ 串考虑了前 $j$ 位,最优情况下的方案数 但是好像没法判断转移来的是 ...

  5. jsonp跨域请求的方式

    1.jsonp一种请求方式.用于解决一个棘手的问题: 由于浏览器具有同源策略:即可以通过后台去访问其他网站,而不能通过浏览器(ajax请求)访问其他网页或域(阻止ajax请求,但是无法阻止<sc ...

  6. Docker:删除images报错(Error response from daemon: conflict: unable to delete 6885a5e3712a (must be forced) - image is being used by stopped container 0cf27d7d29c7)

    1.进入root权限 sudo su 2.停止所有的container,这样才能够删除其中的images: docker stop $(docker ps -a -q) 如果想要删除所有contain ...

  7. Spring基础09——Bean的自动装配

    1.XML配置的Bean自动装配 SpringIOC容器可以自动装配Bean,需要做的仅仅是在<bean>的autowire属性里指定自动装配的模式,而不需要手工去指定要装配的Bean,a ...

  8. PAT Advanced 1058 A+B in Hogwarts (20 分)

    If you are a fan of Harry Potter, you would know the world of magic has its own currency system -- a ...

  9. complementary error function

    首先正态分布的概率密度函数为: P{|X-μ|<σ}=2Φ(1)-1=0.6826,  P{|X-μ|<2σ}=2Φ(2)-1=0.9544,  P{|X-μ|<3σ}=2Φ(3)- ...

  10. c语言之ascii字符

    int main(){ char buf[20] = {104,101,108,108,111,0}; printf("buf:%s\n",buf); return 0;} 打印结 ...