互斥的数(codevs 1553)
有这样的一个集合,集合中的元素个数由给定的N决定,集合的元素为N个不同的正整数,一旦集合中的两个数x,y满足y = P*x,那么就认为x,y这两个数是互斥的,现在想知道给定的一个集合的最大子集满足两两之间不互斥。
输入有多组数据,每组第一行给定两个数N和P(1<=N<=10^5, 1<=P<=10^9)。接下来一行包含N个不同正整数ai(1<=ai<=10^9)。
输出一行表示最大的满足要求的子集的元素个数。
4 2
1 2 3 4
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)的更多相关文章
- T1553 互斥的数 codevs
http://codevs.cn/problem/1553/ 题目描述 Description 有这样的一个集合,集合中的元素个数由给定的N决定,集合的元素为N个不同的正整数,一旦集合中的两个数x,y ...
- Codevs No.1553 互斥的数
2016-05-31 21:34:15 题目链接: 互斥的数 (Codevs No.1553) 题目大意: 给N个数,如果其中两个数满足一个数是另一个的P倍,则称它俩互斥,求一个不互斥集合的最大容量 ...
- 【wikioi】1553 互斥的数(hash+set)
http://wikioi.com/problem/1553/ 一开始我也知道用set来判a[i]/p是否在集合中,在的话就直接删掉. 但是我没有想到要排序,也没有想到当存在a,b使得a/p==b时到 ...
- codevs1553 互斥的数
1553 互斥的数
- 互斥的数(hash)
1553 互斥的数 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 有这样的一个集合,集合中的元素个数由给定的N决定, ...
- codevs——1553 互斥的数
时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 有这样的一个集合,集合中的元素个数由给定的N决定,集合的元素为N个不同 ...
- codevs 1553 互斥的数
时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 有这样的一个集合,集合中的元素个数由给定的N决定,集合的元素为N个不同的正整数, ...
- [wikioi1553]互斥的数(数学分析+散列/数学分析+二分)
题目描述 Description 有这样的一个集合,集合中的元素个数由给定的N决定,集合的元素为N个不同的正整数,一旦集合中的两个数x,y满足y = P*x,那么就认为x,y这两个数是互斥的,现在想知 ...
- CODEVS1533 互斥的数(哈希表)
给定一个集合,要求一个最大子集,满足两两之间不互斥.对两个数x,y互斥的定义是,y=p*x. 先对集合中的数从小到大排序后线性扫,若一个数x可以取则取,取完之后p*x这个数不可取.由于数字较大,使用哈 ...
随机推荐
- tp5增加验证的自定义规则
- JQ 获取Table的td 值
<script type="text/javascript"> function SetTable() { $("#myTab table").ea ...
- ASP.Net 知识点总结(五)
1.传入某个属性的set方法的隐含参数的名称是什么?value,它的类型和属性所声名的类型相同.2.如何在C#中实现继承? 在类名后加上一个冒号,再加上基类的名称.3.C#支持多重继承么? 不支持.可 ...
- 对路径 obj 文件夹访问被拒绝
TFS 刚下载的项目,出现该问题. 解决方案: 将文件夹属性“只读”,取消
- C基础-对malloc的使用与理解
一.malloc函数分析 1.函数原型 void * malloc(size_t size); 2.Function(功能) Allocates a block of size bytes of m ...
- 303 Range Sum Query - Immutable 区域和检索 - 不可变
给定一个数组,求出数组从索引 i 到 j (i ≤ j) 范围内元素的总和,包含 i, j 两点.例如:给定nums = [-2, 0, 3, -5, 2, -1],求和函数为sumRange() ...
- 数据库学习:for xml path
一.开发环境 数据库:SQLServer2012 二.语法简介 for xml path它以xml形式展示查询的结果集 三.语法介绍 现在数据库中有一张表 1.基本语法 select * from B ...
- CF861B Which floor?
思路: 暴力枚举. 实现: #include <bits/stdc++.h> using namespace std; int n, m, x, y; bool check(int x, ...
- BZOJ1499: [NOI2005]瑰丽华尔兹(dp)
Description 你跳过华尔兹吗?当音乐响起,当你随着旋律滑动舞步,是不是有一种漫步仙境的惬意?众所周知,跳华尔兹时,最重要的是有好的音乐.但是很少有几个人知道,世界上最伟大的钢琴家一生都漂泊在 ...
- NX自动出图 发布啦
经过4个月的努力,终于面世啦!!!!1.安装文件 :http://yunpan.cn/Q49TWSJmy2i5Z 请下载后,按照“安装说明.txt ”进行安装!2.学习视频:http://yun ...