题目:http://poj.org/problem?id=2985

这题考察了两个点呢,组合并用到了并查集,求第K大的数用到了树状数组,刚开始WA了几次,发现是在组合并之后仅仅update(*, -1)了一次,因为是删除了两个组增加了一个组,应该是update(*, -1)两次,不细心啊。。。

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define MAX 200005int N, M, G;
int father[MAX] = {0}; //father[i]表示i所在group的首脑
int member[MAX] = {0}; //member[i]表示以i为首的group有多少个member
int group[MAX] = {0};  //group[i]表示成员有[i-lowbit(i)+1, i]个的group有多少个,inline int lowbit(int x){ return x & -x; }
void update(int x, int v){for(; x <= N; x += lowbit(x)){group[x] += v;}
}
int sum(int x)
{int tot = 0;for(; x; x -= lowbit(x)) tot += group[x];return tot;
}
int query(int k)
{int l = 0, r = N;while(l + 1 < r){int m = (l + r) >> 1;if(sum(m) >= k) r = m;else l = m;}return r;
}
int find(int x){return x != father[x] ? father[x] = find(father[x]) : x;
}
void join(int x, int y)
{int fx = find(x), fy = find(y);if(fx == fy) return;if(member[fx] > member[fy]) swap(fx, fy);father[fx] =  fy;update(member[fy], -1);member[fy] += member[fx];update(member[fx], -1);member[fx] = 0;update(member[fy], 1);--G;
}
void init()
{for(int i = 1; i <= N; ++i) father[i] = i;for(int i = 1; i <= N; ++i) member[i] = 1;G = N;memset(group + 1, 0, N * sizeof(int));for(int i = 0; (1 << i) <= N; ++i) group[1 << i] = N;
}int main()
{int c, x, y;while(~scanf("%d%d", &N, &M)){init();while(M--){scanf("%d%d", &c, &x);if(c) printf("%d\n", query(G - x + 1));else{scanf("%d", &y);join(x, y);}}}return 0;
}

POJ-2985(树状数组 + 并查集 + 二分)相关推荐

  1. 花神游历各国 题解(小清新线段树/树状数组+并查集)

    题面 众所周知,这是一道小清新线段树 然而可以用树状数组水过去且跑得飞快 看到区间开方第一反应肯定是线段树懒标记区间修改之类的,但是这个东西似乎确凿不可维护 所以考虑暴力循环单点修改->T飞 于 ...

  2. hdu 6200 mustedge mustedge mustedge(dfs序+树状数组+并查集)

    题目链接:hdu 6200 mustedge mustedge mustedge 题意: 一开始给你一个有n个节点m条无向边的图,现在定义mustedge为u->v的路径上必须经过的边. 现在有 ...

  3. HDU 2689 POJ 2299 树状数组 + 离散化

    以前都是直接树状数组裸奔,昨天一个题数据量好大,过不了,没办法只能学离散化,今天A了第一个离散化的题 #include<stdio.h> #include<string.h> ...

  4. poj 3928 树状数组

    题目中只n个人,每个人有一个ID和一个技能值,一场比赛需要两个选手和一个裁判,只有当裁判的ID和技能值都在两个选手之间的时候才能进行一场比赛,现在问一共能组织多少场比赛. 由于排完序之后,先插入的一定 ...

  5. poj 3067 树状数组

    这题的关键是方法.怎么才是相交的呢?一种方法是线段a的左边比线段b的左边小,同时a的右边比b的右边大.这时就可以构成一个相交.于是,我们可以根据左边的值来做降序排列,然后根据线段树来统计crosses ...

  6. 夜深人静写算法(三)- 树状数组

    目录   一.从图形学算法说起       1.Median Filter 概述       2.r pixel-Median Filter 算法 3.一维模型       4.数据结构的设计     ...

  7. Zju2112 Dynamic Rankings(树状数组套可持久化权值线段树)

    Zju2112 Dynamic Rankings description solution code description 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须 ...

  8. poj 2352 Stars 线段树(先建后查/边建边查)/树状数组三种方法思路详解,带你深入了解线段树难度⭐⭐⭐★

    poj 2352 Stars 目录 poj 2352 Stars 1.树状数组 2.线段树,先建树后查找 3.线段树,边建树边查找 Description Astronomers often exam ...

  9. [BZOJ 3211]花神游历各国(并查集+树状数组)

    Description Solution 树状数组单点修改区间查询 我们知道一个数n最多修改loglogn次就会变为1 并查集维护每个数右边第一个不为1的位置 #include<cstdio&g ...

最新文章

  1. python hmac
  2. Go安装web框架revel
  3. 机器学习笔记——皮尔逊相关系数
  4. 分析脚本文件AndroidInitProcess分析心得(1)
  5. 2021消费者数智化运营白皮书
  6. dom vue 加载完 执行_前端面试题Vue
  7. python 描述统计_Python统计学-004:描述统计-众数
  8. IntelliJ IDEA导出jar包
  9. 联合分布,边缘分布,条件分布,互信息
  10. Comet:基于 HTTP 长连接的“服务器推”技术
  11. Transformer-based模型的综述:AMMUS : A Survey of Transformer-based Pretrained Models in NLP
  12. 脉歌蓝牙耳机线评测_以腔调和功能取胜 脉歌TX90运动挂脖式蓝牙耳机评测
  13. 2021年春季PAT乙级题解(C语言)
  14. 用maven-replacer插件选择正则表达式替换
  15. 切片器可以设置日期格式?_在Power BI中设置切片器的默认值,你会吗?
  16. IEtester 中文官方网站 raquo; IETester 最新版下载 V0.4.6 支持WIN7 支持IE9 马上下载
  17. onmouseover事件中把鼠标变成小手形状
  18. Libor利率查询_图表加数据Libor伦敦银行同业拆借利率
  19. 2017吉林(长春)第十九届国际供热供暖、锅炉、空调及节能减排技术设备展览会会刊(参展商名录)
  20. 数据挖掘技术-使用函数进行简单的统计分析

热门文章

  1. 获取邮件列表用户资源的基本方法
  2. mybatis 使用Criteria语法处理sql遇到的时间格式问题
  3. 【分享】快递100入驻集简云平台,实现无代码集成数百款应用
  4. Mysql的IO介绍及原因详解
  5. 【以太网数据包】微信数据包
  6. linux ptrace函数
  7. matlab洗碗机节水模型的优化设计-这是个课题名称,不是买洗碗机,审核的人仔细看下,谢谢
  8. 微信小程序接入微信支付(三):小程序端调用支付接口
  9. Android Studio在类微信程序完成“蓝牙聊天功能”实现蓝牙通信
  10. 专访 | 杨强教授谈CCAI、深度学习泡沫与人工智能入门