P1978 集合
P1978 集合
题目描述
集合是数学中的一个概念,用通俗的话来讲就是:一大堆数在一起就构成了集合。集合有如
下的特性:
•无序性:任一个集合中,每个元素的地位都是相同的,元素之间是无序的。
•互异性:一个集合中,任何两个元素都认为是不相同的,即每个元素只能出现一次。
•确定性:给定一个集合,任给一个元素,该元素或者属于或者不属于该集合,二者必居
其一,不允许有模棱两可的情况出现。
例如 A = {1, 2, 3} 就是一个集合。我们可以知道, 1 属于 A ,即 1 ∈ A ; 4 不属于 A ,
即 4 ∉ A 。一个集合的大小,就是其中元素的个数。
现在定义一个特殊的 k-集合,要求满足:
•集合的所有特性
•对任意一个该集合内的元素 x ,不存在一个数 y ,使得 y = kx 并且 y 属于该集合。即
集合中的任意一个数,它乘以 k 之后的数都不在这个集合内
给你一个由 n 个不同的数组成的集合,请你从这个集合中找出一个最大的 k-集合。
输入输出格式
输入格式:
第 1 行:两个整数: n 和 k
第 2 行:n 个整数: a[i] 表示给定的集合
输出格式:
第 1 行:一个整数: ans 表示最大的 k-集合的大小
排序, 向集合内加入每个点之前检查是否是已加入集合内某元素的 \(k\) 倍, 不是则加入, 最后集合大小即为答案。
二分写炸, 一气之下写了个 \(Treap\) 维护集合内元素
Code
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
#include<climits>
typedef long long LL;
using namespace std;
LL RD(){
LL out = 0,flag = 1;char c = getchar();
while(c < '0' || c >'9'){if(c == '-')flag = -1;c = getchar();}
while(c >= '0' && c <= '9'){out = out * 10 + c - '0';c = getchar();}
return flag * out;
}
const LL maxn = 100019, INF = 0xfffffffffffffff;
LL num, k;
LL a[maxn];
LL ch[maxn][2];//[i][0]代表i左儿子,[i][1]代表i右儿子
LL val[maxn],dat[maxn];
LL size[maxn],cnt[maxn];
LL tot,root;
LL New(LL v){//新增节点,
val[++tot] = v;//节点赋值
dat[tot] = rand();//随机优先级
size[tot] = 1;//目前是新建叶子节点,所以子树大小为1
cnt[tot] = 1;//新建节点同理副本数为1
return tot;
}
void pushup(LL id){
size[id] = size[ch[id][0]] + size[ch[id][1]] + cnt[id];
}
void build(){
root = New(-INF),ch[root][1] = New(INF);
pushup(root);
}
void Rotate(LL &id,LL d){
LL temp = ch[id][d ^ 1];
ch[id][d ^ 1] = ch[temp][d];
ch[temp][d] = id;
id = temp;
pushup(ch[id][d]),pushup(id);
}
void insert(LL &id,LL v){
if(!id){
id = New(v);
return ;
}
if(v == val[id])cnt[id]++;
else{
LL d = v < val[id] ? 0 : 1;
insert(ch[id][d],v);
if(dat[id] < dat[ch[id][d]])Rotate(id,d ^ 1);
}
pushup(id);
}
bool find(LL id, LL v){
if(!id)return 0;
if(val[id] == v)return 1;
else if(v < val[id])return find(ch[id][0], v);
else return find(ch[id][1], v);
}
int main(){
build();
num = RD(); k = RD();
for(LL i = 1;i <= num;i++)a[i] = RD();
sort(a + 1, a + 1 + num);
for(LL i = 1;i <= num;i++){
if(a[i] % k != 0 || !find(root, a[i] / k)){
insert(root, a[i]);
}
}
printf("%lld\n", size[root] - 2);
return 0;
}
P1978 集合的更多相关文章
- 洛谷P1978 集合 [2017年6月计划 数论08]
P1978 集合 题目描述 集合是数学中的一个概念,用通俗的话来讲就是:一大堆数在一起就构成了集合.集合有如 下的特性: •无序性:任一个集合中,每个元素的地位都是相同的,元素之间是无序的. •互异性 ...
- LUOGU P1978 集合
题目描述 集合是数学中的一个概念,用通俗的话来讲就是:一大堆数在一起就构成了集合.集合有如 下的特性: •无序性:任一个集合中,每个元素的地位都是相同的,元素之间是无序的. •互异性:一个集合中,任何 ...
- 【洛谷P1978】 集合
集合 题目链接 显然,我们是要把数据先排序的, 然后从大到小枚举每个数,看是否能选上, 能选就选,不能拉倒 若能,二分查找a[i]/k,若查找成功,ans++ 将a[i]/k标记为不能选择 最后输出答 ...
- java基础集合经典训练题
第一题:要求产生10个随机的字符串,每一个字符串互相不重复,每一个字符串中组成的字符(a-zA-Z0-9)也不相同,每个字符串长度为10; 分析:*1.看到这个题目,或许你脑海中会想到很多方法,比如判 ...
- .Net多线程编程—并发集合
并发集合 1 为什么使用并发集合? 原因主要有以下几点: System.Collections和System.Collections.Generic名称空间中所提供的经典列表.集合和数组都不是线程安全 ...
- 一起学 Java(三) 集合框架、数据结构、泛型
一.Java 集合框架 集合框架是一个用来代表和操纵集合的统一架构.所有的集合框架都包含如下内容: 接口:是代表集合的抽象数据类型.接口允许集合独立操纵其代表的细节.在面向对象的语言,接口通常形成一个 ...
- 编写高质量代码:改善Java程序的151个建议(第5章:数组和集合___建议75~78)
建议75:集合中的元素必须做到compareTo和equals同步 实现了Comparable接口的元素就可以排序,compareTo方法是Comparable接口要求必须实现的,它与equals方法 ...
- java基础_集合List与Set接口
List接口继承了Collection的方法 当然也有自己特有的方法向指定位置添加元素 add(索引,添加的元素); 移除指定索引的元素 remove(索引) 修改指定索引的元素 set ...
- Java基础Collection集合
1.Collection是所有集合的父类,在JDK1.5之后又加入了Iterable超级类(可以不用了解) 2.学习集合从Collection开始,所有集合都继承了他的方法 集合结构如图:
随机推荐
- TeamWork#3,Week5,The First Meeting of Our Team
sixsix第一次会议记录 [会议时间]2014年10月23日星期四19:00-20:00 [会议形式]小组讨论 [会议地点]5号公寓 [会议主持]高雅智 [会议记录]张志浩 会议整体流程 一.签到 ...
- JAVA第二次试验
北京电子科技学院(BESTI) 实 验 报 告 课程:Java程序设计 班级:1352 姓名:潘俊洋 学号:20135230 成绩: 指导教师:娄嘉鹏 ...
- 《Spring2之站立会议5》
<Spring2之站立会议5> 昨天,接着对主界面进行代码的编写,实现了界面的美化,从图片库中调了一些图片对其进行优化: 今天,向主界面中加入语音功能部分的代码: 遇到的问题:发现虽然是调 ...
- ns3 模拟无线网络通信
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ /* * This program is fre ...
- 关于VS2005中C#代码用F12转到定义时,总是显示从元数据的问题
元数据是:NET 程序集中的标记信息. 是在代码中选择了转到定义时候给定位的吧.因为没有找到源代码,VS通过反射读取元数据中的信息生成了那个. 解决方法: 1. 要把项目先添加到解决方案中. 2. 再 ...
- HBase 架构与工作原理2 - HBase 组件
本文系转载,如有侵权,请联系我:likui0913@gmail.com 一.HBase 组件概览 Master-Slave 模式: HBase 体系结构遵循传统的 master-slave 模式,由一 ...
- Android UI测量、布局、绘制过程探究
在上一篇博客<Android中Activity启动过程探究>中,已经从ActivityThread.main()开始,一路摸索到ViewRootImpl.performTraversals ...
- Dubbo学习(九) Dubbo面试问题
Dubbo是Alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合(或者最大限度地松耦合). 从服务模型的角度来看,Dubbo采用的是一种非常简单的 ...
- Python学习---列表,元组,字典
### 列表 list = [1,2,3,4,5,6] list.append(7) print(list) ===>>> [1, 2, 3, 4, 5, 6, 7] list[2] ...
- JAVA相关概念(一)
依赖注入和控制反转 首先,这两个词是同一个概念的不同角度的说法,依赖注入感觉是对描述了如何实现,而控制反转则像是描述了一种思想. 依赖注入的流行可以说是由spring的流行带动的,只要是做过sprin ...