互斥的数(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这个数不可取.由于数字较大,使用哈 ...
随机推荐
- Notepad++安装插件
https://sourceforge.net/projects/npp-plugins/files/ 下载完插件后,通过notepad++的设置>>>>导入>>& ...
- 洛谷 P3378 【模板】堆(小根堆)
题目描述 如题,初始小根堆为空,我们需要支持以下3种操作: 操作1: 1 x 表示将x插入到堆中 操作2: 2 输出该小根堆内的最小数 操作3: 3 删除该小根堆内的最小数 输入输出格式 输入格式: ...
- 51nod1459 迷宫游戏
1459 迷宫游戏 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 你来到一个迷宫前.该迷宫由若干个房间组成,每个房间都有一个得分,第一次进入这个房间,你 ...
- 306 Additive Number 加法数
Additive number is a string whose digits can form additive sequence.A valid additive sequence should ...
- Ajax动态加载数据
前言: 1.这个随笔实现了一个Ajax动态加载的例子. 2.使用.net 的MVC框架实现. 3.这个例子重点在前后台交互,其它略写. 开始: 1.控制器ActionResult代码(用于显示页面) ...
- Spring.Net学习笔记(二)-数据访问器
Spring对ADO.NET也提供了支持,依赖与程序集Spring.Data.dll IDbProvider IDbProvider定义了数据访问提供器的基础,配置如下 <?xml versio ...
- [ SDOI 2006 ] 仓库管理员的烦恼
\(\\\) Description 有 \(n\) 种货物和 \(n\) 个仓库,开始第 \(i\) 个仓库里有 \(a_{ij}\) 个第 \(j\) 种货物. 现在要让每种货物都只放到一个仓库里 ...
- 42使用NanoPiM1Plus在Android4.4.2下的录音测试
42使用NanoPiM1Plus在Android4.4.2下的录音测试 大文实验室/大文哥壹捌陆捌零陆捌捌陆捌贰21504965 AT qq.com完成时间:2017/12/5 17:51版本:V1. ...
- Linux 学习(二)
Linux相关命令 命令 说明 startx 当前用户界面切换至图形界面 init5 切换至另一用户的图形化界面 init3 从图形界面切换回文本界面 pwd 显示当前用户路径 logout 注销 s ...
- C# 调用带有输出参数的分页存储过程
一.创建带有输出参数的分页存储过程 use StudentMISDB go select * from Course alter table Course go --update Course set ...