站外题求助
  • 板块学术版
  • 楼主SegmentTree_
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/12/6 21:01
  • 上次更新2023/12/7 03:39:57
查看原帖
站外题求助
716260
SegmentTree_楼主2023/12/6 21:01

链接 思路:并查集+treap维护第k大 TLE

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<time.h>
#include<cstdlib>
#pragma GCC optimize(3)
#pragma GCC target("avx")
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#pragma GCC optimize("-fgcse")
#pragma GCC optimize("-fgcse-lm")
#pragma GCC optimize("-fipa-sra")
#pragma GCC optimize("-ftree-pre")
#pragma GCC optimize("-ftree-vrp")
#pragma GCC optimize("-fpeephole2")
#pragma GCC optimize("-ffast-math")
#pragma GCC optimize("-fsched-spec")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("-falign-jumps")
#pragma GCC optimize("-falign-loops")
#pragma GCC optimize("-falign-labels")
#pragma GCC optimize("-fdevirtualize")
#pragma GCC optimize("-fcaller-saves")
#pragma GCC optimize("-fcrossjumping")
#pragma GCC optimize("-fthread-jumps")
#pragma GCC optimize("-funroll-loops")
#pragma GCC optimize("-fwhole-program")
#pragma GCC optimize("-freorder-blocks")
#pragma GCC optimize("-fschedule-insns")
#pragma GCC optimize("inline-functions")
#pragma GCC optimize("-ftree-tail-merge")
#pragma GCC optimize("-fschedule-insns2")
#pragma GCC optimize("-fstrict-aliasing")
#pragma GCC optimize("-fstrict-overflow")
#pragma GCC optimize("-falign-functions")
#pragma GCC optimize("-fcse-skip-blocks")
#pragma GCC optimize("-fcse-follow-jumps")
#pragma GCC optimize("-fsched-interblock")
#pragma GCC optimize("-fpartial-inlining")
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("-freorder-functions")
#pragma GCC optimize("-findirect-inlining")
#pragma GCC optimize("-fhoist-adjacent-loads")
#pragma GCC optimize("-frerun-cse-after-loop")
#pragma GCC optimize("inline-small-functions")
#pragma GCC optimize("-finline-small-functions")
#pragma GCC optimize("-ftree-switch-conversion")
#pragma GCC optimize("-foptimize-sibling-calls")
#pragma GCC optimize("-fexpensive-optimizations")
#pragma GCC optimize("-funsafe-loop-optimizations")
#pragma GCC optimize("inline-functions-called-once")
#pragma GCC optimize("-fdelete-null-pointer-checks")
using namespace std;
#define ll long long 
#define ull unsigned long long
#define lid (id << 1)
#define rid (id << 1 | 1)
const int N = 2e5+5;
const double alpha = 0.75;
struct treap_node{
	int ls, rs;
	int key, pri, size;
};
struct Treap{
	treap_node t[N];
	int cnt, root;
	void newnode(int x){
		++cnt;
		t[cnt].size = 1;
		t[cnt].ls = t[cnt].rs = 0;
		t[cnt].key = x;
		t[cnt].pri = rand();
	}
	void update(int u){
		t[u].size = t[t[u].ls].size + t[t[u].rs].size + 1;
	}
	void rotate(int &o, int d){ //d=0 right d=1 left
		int k;
		if (d == 1){
			k = t[o].rs;
			t[o].rs = t[k].ls;
			t[k].ls = o;
		}
		else{
			k = t[o].ls;
			t[o].ls = t[k].rs;
			t[k].rs = o;
		}
		t[k].size = t[o].size;
		update(o);
		o = k;
	}
	void insert1(int &u, int x){
		if (u == 0){
			newnode(x);
			u = cnt;
			return;
		}
		++t[u].size;
		if (x >= t[u].key) insert1(t[u].rs, x);
		else insert1(t[u].ls, x);
		if (t[u].ls != 0 && t[u].pri > t[t[u].ls].pri) rotate(u, 0);
		if (t[u].rs != 0 && t[u].pri >t[t[u].rs].pri) rotate(u, 1);
		update(u);
	}
	void del1(int &u, int x){
		--t[u].size;
		if (t[u].key == x){
			if(t[u].ls==0 && t[u].rs == 0){
				u = 0;
				return;
			}
			if(t[u].ls == 0 || t[u].rs == 0){
				u = t[u].ls + t[u].rs;
				return;
			}
			if (t[t[u].ls].pri < t[t[u].rs].pri){
				rotate(u, 0);
				del1(t[u].rs, x);
				return;
			}
			else{
				rotate(u, 1);
				del1(t[u].ls, x);
				return;
			}
		}
		if(t[u].key >= x) del1(t[u].ls, x);
		else del1(t[u].rs, x);
		update(u);
	}
	int rk1(int u, int x){
		if (u == 0) return 0;
		if (x > t[u].key) return t[t[u].ls].size + 1 + rk1(t[u].rs, x);
		return rk1(t[u].ls, x);
	}
	int kth1(int u, int k){
		if (k == t[t[u].ls].size + 1) return t[u].key;
		if (k > t[t[u].ls].size + 1) return kth1(t[u].rs, k - t[t[u].ls].size - 1);
		if (k <= t[t[u].ls].size) return kth1(t[u].ls, k);
	}
	int precursor(int u, int x){
		if (u == 0) return 0;
		if (t[u].key >= x) return precursor(t[u].ls, x);
		int tmp = precursor(t[u].rs, x);
		if (tmp == 0) return t[u].key;
		return tmp;
	}
	int successor(int u, int x){
		if (u == 0) return 0;
		if (t[u].key <= x) return successor(t[u].rs, x);
		int tmp = successor(t[u].ls, x);
		if (tmp == 0) return t[u].key;
		return tmp;
	}
	int rk(int x){
		return rk1(root, x) + 1;
	}
	int kth(int x){
		return kth1(root, x);
	}
	int pre(int x){
		return precursor(root, x);
	}
	int suc(int x){
		return successor(root, x);
	}
	void insert(int x){
		insert1(root, x);
	}
	void del(int x){
		del1(root, x);
	}
};
inline int read()
{
	int x=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9')
	{
		if(ch=='-')
			f=-1;
		ch=getchar();
	}
	while(ch>='0' && ch<='9')
		x=x*10+ch-'0',ch=getchar();
	return x*f;
}
Treap treap;
int n, q;
int s[N], siz[N], setnum, yuanshen;
int find(int x){
	if (s[x] == x) return x;
	return s[x] = find(s[x]);
}
void merge(int a, int b){
	int x = find(a), y = find(b);
	if (x != y){
		treap.del(siz[x]);
		treap.del(siz[y]);
		s[x] = y;
		--setnum;
		siz[y] += siz[x];
		treap.insert(siz[y]);
	}
}
int main() {
	//ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
	n = read();
	q = read();
	for (int i = 1;i <= n;++i){
		s[i] = i;
		siz[i] = 1;
		treap.insert(1);
	}
	setnum = n;
	while (q--){
		int op;
		cin >> op;
		if (op == 0){
			int a, b;
			a = read();
			b = read();
			merge(a, b);
		}
		else{
			int a;
			a = read();
			a = setnum - a + 1;
			printf("%d\n", treap.kth(a));
		}
	}
	return 0;
}
2023/12/6 21:01
加载中...