zoukankan      html  css  js  c++  java
  • poj2985 The k-th Largest Group

    并查集+treap维护的第k

    #include <iostream>
    #include <cstdlib>
    #include <cstdio>
    using namespace std;
    struct Node{
    	int val, l, r, rnd, sze, hav;
    }nd[200005];
    int n, m, fa[200005], hmn[200005], opt, num, siz, uu, vv, rot;
    void upd(int k){
    	nd[k].sze = nd[nd[k].l].sze + nd[nd[k].r].sze + nd[k].hav;
    }
    void lRotate(int &k){
    	int t=nd[k].r; nd[k].r = nd[t].l; nd[t].l = k;
    	nd[t].sze = nd[k].sze; upd(k); k = t;
    }
    void rRotate(int &k){
    	int t=nd[k].l; nd[k].l = nd[t].r; nd[t].r = k;
    	nd[t].sze = nd[k].sze; upd(k); k = t;
    }
    void ins(int &k, int x){
    	if(!k){
    		k = ++siz; nd[k].val = x;
    		nd[k].sze = nd[k].hav = 1; nd[k].rnd = rand();
    		return ;
    	}
    	nd[k].sze++;
    	if(nd[k].val==x)	nd[k].hav++;
    	else if(nd[k].val<x){
    		ins(nd[k].r, x);
    		if(nd[nd[k].r].rnd<nd[k].rnd)	lRotate(k);
    	}
    	else{
    		ins(nd[k].l, x);
    		if(nd[nd[k].l].rnd<nd[k].rnd)	rRotate(k);
    	}
    }
    void del(int &k, int x){
    	if(!k)	return ;
    	if(nd[k].val==x){
    		if(nd[k].hav>1){
    			nd[k].sze--; nd[k].hav--;
    			return ;
    		}
    		if(nd[k].l*nd[k].r==0)	k = nd[k].l + nd[k].r;
    		else if(nd[nd[k].l].rnd<nd[nd[k].r].rnd)
    			rRotate(k), del(k, x);
    		else
    			lRotate(k), del(k, x);
    	}
    	else if(nd[k].val<x)	nd[k].sze--, del(nd[k].r, x);
    	else nd[k].sze--, del(nd[k].l, x);
    }
    int myfind(int x){
    	return fa[x]==x?x:fa[x]=myfind(fa[x]);
    }
    int queryNum(int k, int x){
    	if(!k)	return 0;
    	if(nd[nd[k].r].sze>=x)	return queryNum(nd[k].r, x);
    	else if(nd[nd[k].r].sze+nd[k].hav<x)	return queryNum(nd[k].l, x-nd[nd[k].r].sze-nd[k].hav);
    	else return nd[k].val;
    }	
    int main(){
    	cin>>n>>m;
    	for(int i=1; i<=n; i++){
    		fa[i] = i;
    		hmn[i] = 1;
    		ins(rot, 1);
    	}
    	for(int i=1; i<=m; i++){
    		scanf("%d %d", &opt, &uu);
    		if(!opt)	scanf("%d", &vv);
    		if(!opt){
    			uu = myfind(uu);
    			vv = myfind(vv);
    			if(uu!=vv){
    				int tmp=0;
    				tmp += hmn[uu];
    				tmp += hmn[vv];
    				del(rot, hmn[uu]);
    				del(rot, hmn[vv]);
    				ins(rot, tmp);
    				hmn[uu] += hmn[vv];
    				fa[vv] = uu;
    			}
    		}
    		else	printf("%d
    ", queryNum(rot, uu));
    	}
    	return 0;
    }
    
  • 相关阅读:
    PHP程序十点未来的建议
    网站入侵思路
    SQL注入初探
    php安全学习笔记
    BLE协议分析
    调用NMAP批量扫描IP端口
    安卓系统手机目录
    xss绕过过滤方法
    xss测试用例
    python爬虫
  • 原文地址:https://www.cnblogs.com/poorpool/p/7978811.html
Copyright © 2011-2022 走看看