POJ2985 The k-th Largest Group(平衡树查询第K大)
传送门
平衡树查询第k大的裸题,用并查集来维护一下哪些猫是一组的就可以了。查询第k大要维护size域,保存一个节点下面的字数的大小,更新的时候从下边更新。
#include<cstdio>
#define MAXN 200005
struct SBT {int v, sz, ch[2], cnt;
} t[MAXN];
int n, m, cnt, root;
#define Upd(k) {\t[k].sz = t[t[k].ch[0]].sz + t[t[k].ch[1]].sz + t[k].cnt;\
}
void rot(int &k, bool f) {int p = t[k].ch[f]; t[k].ch[f] = t[p].ch[!f]; t[p].ch[!f] = k;Upd(k); Upd(p); k = p;
}
inline void mt(int &k,bool f)
{if(!k) return;if(t[t[k].ch[f^1]].sz < t[t[t[k].ch[f]].ch[f]].sz) rot(k, f);else if(t[t[k].ch[f^1]].sz < t[t[t[k].ch[f]].ch[f^1]].sz) { rot(t[k].ch[f], f^1); rot(k, f); }else return;mt(t[k].ch[f],f);mt(k,f);
}
void Ins(int &k, int x) {if(!k) {k = ++ cnt; t[k].sz = t[k].cnt = 1; t[k].v = x; return; }++ t[k].sz;if(t[k].v == x) {++ t[k].cnt; return;}Ins(t[k].ch[t[k].v < x], x);mt(k, t[k].v < x);
}
int Del(int &k, int x) {if(!k) return k;int tmp;if(t[k].v == x) {if(t[k].cnt > 1) {-- t[k].cnt; --t[k].sz; return k;}else if(!(t[k].ch[0]*t[k].ch[1])) {k = t[k].ch[0]+t[k].ch[1];}else { tmp = Del(t[k].ch[0], x+1); t[k].cnt = t[tmp].cnt; t[k].v = t[tmp].v; Upd(k); return k; }}else if((t[k].v < x && !t[k].ch[1]) || (t[k].v > x && ! t[k].ch[0])) { tmp = k; k = t[k].ch[0]; Upd(k); return tmp; }else tmp = Del(t[k].ch[t[k].v < x], x);Upd(k); return tmp;
}
int Kth(int k,int x) { //查询第k大if(x<=t[t[k].ch[1]].sz)return Kth(t[k].ch[1],x);else if(x>t[t[k].ch[1]].sz+t[k].cnt)return Kth(t[k].ch[0],x-t[t[k].ch[1]].sz-t[k].cnt);else return t[k].v;
}
char c, f;
inline void GET(int &n) {n = 0; f = 1;do {c = getchar(); if(c == '-') f = -1;} while(c > '9' || c < '0');while(c >= '0' && c <= '9') {n=n*10+c-'0';c=getchar();}n *= f;
}
/**********************并查集相关********************/
int fa[MAXN], num[MAXN];
int Q(int x) {return x == fa[x] ? x : (fa[x] = Q(fa[x]));
}
void Union(int a, int b) {int af = Q(a), bf = Q(b);if(af == bf) return;Del(root, num[af]); Del(root, num[bf]);fa[bf] = af; num[af] += num[bf];Ins(root, num[af]);
}
/***************************************************/
int main() {GET(n); GET(m);int t1, t2, t3;Ins(root, 0x7f7f7f7f); Ins(root, -0x7f7f7f7f);for(int i = 1; i <= n; ++ i) fa[i] = i, num[i] = 1, Ins(root, 1);while(m --) {GET(t1); GET(t2);if(t1) printf("%d\n", Kth(root, t2+1));else {GET(t3); Union(t2, t3);}}
}
转载于:https://www.cnblogs.com/geng4512/p/5296888.html
POJ2985 The k-th Largest Group(平衡树查询第K大)相关推荐
- hdu 2665(主席树查询区间k大值)
先贴我自己写的代码做模板虽然跟原博主没什么两样.(一开始空间开的4*maxn,交到hdu上一直TLE很奇怪) #include<bits/stdc++.h> using namespace ...
- 快速排序查询第k大元素C语言,快速排序和查找第K大元素
/* 输入n个整数和一个正整数k(1<=k<=n),输出这些整数从小到大排序后的第k个(例如,k=1就是最小值).n<=10^7. 快速排序的时间复杂度为:最坏情况下:O(n^2), ...
- group by 查询分组后 各组的内部条数与组的条数
一.group by 查询分组后 各组的内部条数 说明:表:survey_consumer ,字段:profession SELECT COUNT(*) num,profession FROM sur ...
- mysql使用group by查询报错SELECT list is not in GROUP BY clause and contains nonaggregated column.
mysql使用group by查询报错SELECT list is not in GROUP BY clause and contains nonaggregated column. 出现原因 使用g ...
- 通过VBA在excel中实现股票历史数据查询和K线趋势图绘制(完整的excel原件可以在我的资源中下载)
原始文件下载地址:股票历史数据和K线图趋势线的绘制-VB文档类资源-CSDN下载 文章目录 前言 一.目标 二.方法 三.界面和使用说明 四.代码说明 1.查询历史数据 2.绘制K线图和趋势线 3.清 ...
- python第k序列元素查找_python查找第k小元素代码分享 -电脑资料
复制代码代码如下: # -*- coding: utf-8 -*- from random import randint from math import ceil, floor def _parti ...
- js股票K线图,比较专业的K线图插件
由於項目裏面要做個有關交易的平臺,其中要畫k線圖(蠟燭圖),在網上找了很多插件感覺都沒有專業的股票交易平臺弄的k線圖專業,因此為了趕進度,將就用了百度的echarts來做k線圖,結果發現如果點比較少的 ...
- Kmeans++、Mini-Batch Kmeans、Bisecting Kmeans、K中心点(K-Medoids)算法、K众数聚类、核K均值聚类
Kmeans++.Mini-Batch Kmeans.Bisecting Kmeans.K中心点(K-Medoids)算法.K众数聚类.核K均值聚类 目录 Kmeans++.Mini-Batch Km ...
- k歌的录音伴奏合成技术如何实现_2019年中国在线K歌行业市场现状,在线K歌用户女性占比较高...
一.在线K歌行业概况 中国在线K歌行业经历了萌芽期.探索期.成长期和发展期.上世纪90年代,量贩式KTV进入中国市场,我国在线K歌行业开始萌芽.随着移动互联网应用范围扩大与移动设备性能提升,唱吧.全民 ...
最新文章
- 关于Gitlab若干权限问题
- 互联网1分钟 |1212
- 百思不得其解,一个钻石玩家可以短时间上王者?因为猎游?
- 300+队伍/8大直播间,这场NXP智能车竞赛谁才是真的神车?
- 安装Microsoft Windows SDK 7.1时出现的错误(附解决办法)
- fedora操作系统优缺点_不同类型的操作系统的优缺点
- 【Elasticsearch】使用Elasticsearch实现同段和同句搜索
- 修改PHP上传文件大小限制的方法,php.ini修改php上传文件大小限制的方法
- 【Caffe】训练ImageNet模型
- 通俗易懂的理解 Redux(知乎)
- redis远程连接的几种方式
- hdu5258简单枚举
- CentOS 7.4 安装Teamviewer 14
- 获取UWP应用的三种方式
- NPDP产品经理小知识:财务分析与投资回报率
- Flash音乐暂停播放按钮
- java的Serialization机制
- 通信协议:分辨率和偏移量的使用
- ICO和区块链的关系
- 商业插画是什么?怎么学习商业插画?