互斥的数(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这个数不可取.由于数字较大,使用哈 ...
随机推荐
- 洛谷 P1433 吃奶酪(记忆化)
题目描述 房间里放着n块奶酪.一只小老鼠要把它们都吃掉,问至少要跑多少距离?老鼠一开始在(0,0)点处. 输入输出格式 输入格式: 第一行一个数n (n<=15) 接下来每行2个实数,表示第i块 ...
- Windows环境下使用Netsh命令快速切换IP配置
不同的内网环境需要使用不同的IP配置,频繁切换令人发狂,因此搜索了快速切换IP配置的方法. Netsh interface IP Set address "以太网" Static ...
- python获取主机名和用户名
import socketimport getpassuser_name = getpass.getuser() # 获取当前用户名hostname = socket.gethostname() # ...
- ios基础笔试题-集锦二
前言 下文转载自:http://www.henishuo.com/objc-interview-two/ 1.即时聊天App不会采用的网络传输方式 A. UDP B. TCP C. HTTP D. F ...
- Atmel studio 7.0 安装成功
Atmel studio 7.0 安装成功 转载: http://www.eeworld.com.cn/mcu/article_2017112436241.html 2018-07-2610:27 ...
- Python+selenium测试环境成功搭建,简单控制浏览器(firefox)接下来,继续学习其他浏览器上的测试环境搭建;学习Python语言,利用Python语言来写测试用例。加油!!!
Python+selenium测试环境成功搭建,简单控制浏览器(firefox)接下来,继续学习其他浏览器上的测试环境搭建:学习Python语言,利用Python语言来写测试用例.加油!!!
- 微软MVC框架实战:开源的JS库Knockout
[IT168 技术] Knowckout – 当MVC遭遇MVVM Knockout (或者Knockout.js ,KnockoutJS)是一个开源的JavaScript库,网址为www.knock ...
- Linux 学习(二)
Linux相关命令 命令 说明 startx 当前用户界面切换至图形界面 init5 切换至另一用户的图形化界面 init3 从图形界面切换回文本界面 pwd 显示当前用户路径 logout 注销 s ...
- apache启动失败提示预期<IfModule>结果<IfModule>>
经过反复查看httpd.conf文件,发现原因是启动了两遍<IfModule>,也就是出现内容重复标签重复曾经遇到类似的情况Apache2: Expected </> but ...
- 第二节:1_C#中的委托的使用和讲解(转)
C# 中的委托 引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容 ...