题目描述 Description

有这样的一个集合,集合中的元素个数由给定的N决定,集合的元素为N个不同的正整数,一旦集合中的两个数x,y满足y = P*x,那么就认为x,y这两个数是互斥的,现在想知道给定的一个集合的最大子集满足两两之间不互斥。

输入描述 Input Description

输入有多组数据,每组第一行给定两个数N和P(1<=N<=10^5, 1<=P<=10^9)。接下来一行包含N个不同正整数ai(1<=ai<=10^9)。

输出描述 Output Description

输出一行表示最大的满足要求的子集的元素个数。

样例输入 Sample Input

4 2

1 2 3 4

样例输出 Sample Output

3

/*
改了两个小时,把int改成long long 就对了,我晕……
做法:由于对于每个数,和它互斥的数只有一个,所以可以找到和它互斥的数,然后建一条边,
建边式统计入度,这样很多点就会成为一条链。对于每条链,如果它有tot个节点,我们
最多能取 (tot-1)/2 个点,统计总点数。
*/
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<vector>
#define ll long long
#define M 100010
using namespace std;
ll n,p,a[M],in[M],tot;
vector<ll> grap[M];
void dfs(int x)
{
tot++;
for(ll i=;i<grap[x].size();i++)
dfs(grap[x][i]);
}
int main()
{
cin>>n>>p;
for(ll i=;i<=n;i++)
cin>>a[i];
sort(a+,a+n+);
for(ll i=;i<=n;i++)
{
if(a[i]*p>1e9)continue;
ll pos=lower_bound(a+i+,a+n+,a[i]*p)-a;
if(pos>i&&pos<=n&&a[i]*p==a[pos])
grap[i].push_back(pos),in[pos]++;
}
ll ans=;
for(ll i=;i<=n;i++)
if(!in[i])
{
tot=;dfs(i);
ans+=(tot+)/;
}
cout<<ans;
return ;
}

1

/*
另一种做法 hash
*/
#include<iostream>
#include<algorithm>
#include<cstdio>
#define mod 1358717
#define M 100010
#define ll long long
using namespace std;
ll head[mod+],a[M],n,m,cnt;
struct node
{
ll v,pre;
};node e[M];
void add(ll x,ll v)
{
++cnt;
e[cnt].v=v;
e[cnt].pre=head[x];
head[x]=cnt;
}
bool find(ll x,ll v)
{
for(ll i=head[x];i;i=e[i].pre)
if(e[i].v==v)return true;
return false;
}
int main()
{
cin>>n>>m;
for(ll i=;i<=n;i++)
cin>>a[i];
sort(a+,a+n+);
ll ans=;
for(ll i=;i<=n;i++)
{
if(find(a[i]%mod,a[i]))continue;
ll v=a[i]*m;
if(v<=1e9)add(v%mod,v);
++ans;
}
cout<<ans;
return ;
}

2

互斥的数(codevs 1553)的更多相关文章

  1. T1553 互斥的数 codevs

    http://codevs.cn/problem/1553/ 题目描述 Description 有这样的一个集合,集合中的元素个数由给定的N决定,集合的元素为N个不同的正整数,一旦集合中的两个数x,y ...

  2. Codevs No.1553 互斥的数

    2016-05-31 21:34:15 题目链接: 互斥的数 (Codevs No.1553) 题目大意: 给N个数,如果其中两个数满足一个数是另一个的P倍,则称它俩互斥,求一个不互斥集合的最大容量 ...

  3. 【wikioi】1553 互斥的数(hash+set)

    http://wikioi.com/problem/1553/ 一开始我也知道用set来判a[i]/p是否在集合中,在的话就直接删掉. 但是我没有想到要排序,也没有想到当存在a,b使得a/p==b时到 ...

  4. codevs1553 互斥的数

    1553 互斥的数    

  5. 互斥的数(hash)

    1553 互斥的数  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold     题目描述 Description 有这样的一个集合,集合中的元素个数由给定的N决定, ...

  6. codevs——1553 互斥的数

    时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解     题目描述 Description 有这样的一个集合,集合中的元素个数由给定的N决定,集合的元素为N个不同 ...

  7. codevs 1553 互斥的数

    时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题目描述 Description 有这样的一个集合,集合中的元素个数由给定的N决定,集合的元素为N个不同的正整数, ...

  8. [wikioi1553]互斥的数(数学分析+散列/数学分析+二分)

    题目描述 Description 有这样的一个集合,集合中的元素个数由给定的N决定,集合的元素为N个不同的正整数,一旦集合中的两个数x,y满足y = P*x,那么就认为x,y这两个数是互斥的,现在想知 ...

  9. CODEVS1533 互斥的数(哈希表)

    给定一个集合,要求一个最大子集,满足两两之间不互斥.对两个数x,y互斥的定义是,y=p*x. 先对集合中的数从小到大排序后线性扫,若一个数x可以取则取,取完之后p*x这个数不可取.由于数字较大,使用哈 ...

随机推荐

  1. 服务器出现 nginx 502 Bad Gateway

    发生原因1.PHP FastCGI进程数不够用 当网站并发访问巨大时,php fastcgi的进程数不有一定的保障,因为cgi是单线程多进程工作的,也就是说cgi需要处理完一个页面后再继续下一个页面. ...

  2. 最大加权矩形 luogu1719

    题目链接:https://www.luogu.org/problemnew/show/P1719 这道题挺好做的 又是一道练前缀和的题 #include <bits/stdc++.h> # ...

  3. 【js】JavaScript parser实现浅析

    最近笔者的团队迁移了webpack2,在迁移过程中,笔者发现webpack2中有相当多的兼容代码,虽然外界有很多声音一直在质疑作者为什么要破坏性更新,其实大家也都知道webpack1那种过于“灵活”的 ...

  4. C基础-对malloc的使用与理解

    一.malloc函数分析 1.函数原型 void * malloc(size_t  size); 2.Function(功能) Allocates a block of size bytes of m ...

  5. 51nod1344 走格子

    1344 走格子 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题  收藏  关注 有编号1-n的n个格子,机器人从1号格子顺序向后走,一直走到n号格子,并需要从n号格 ...

  6. CSV文件转EXCEl(java)

    package main; import java.io.BufferedReader;import java.io.DataInputStream;import java.io.File;impor ...

  7. python语言真正的奥义所在--对接32单片机

    2018-02-2720:51:24 今天晚上注定我要玩一夜这个东西,太爽了,给力! 烧写固件成功, http://blog.csdn.net/Lingdongtianxia/article/deta ...

  8. (求助)对某一颜色,设置透明度 alpha 后,其他使用该颜色的地方 受到影响!!!!原因未知

    对某一颜色,设置透明度 alpha 后,其他使用该颜色的地方 受到影响!!!!原因未知,有谁碰到过这样的问题?????? 测试了以下三款手机,结果如下: 1.android 4.4.2: 不受影响 2 ...

  9. [Python] xrange和range的使用区别

    zhuan:https://blog.csdn.net/humanking7/article/details/45950967 range 函数说明:range([start,] stop[, ste ...

  10. [算法天天练] - C语言实现约瑟夫环(2)

    Linux下 #include <stdlib.h>#include <stdio.h> int main(){ int n,m,i,s = 0; printf("E ...