萌新求解Splay写的TLE了QAQ
查看原帖
萌新求解Splay写的TLE了QAQ
563378
KicamonIce楼主2022/10/7 21:01
// Problem: P3850 [TJOI2007]书架
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P3850
// Memory Limit: 125 MB
// Time Limit: 2000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

// #pragma GCC optimize(2)
#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define all(a) a.begin(),a.end()
#define C2(n) (n * (n - 1) >> 1)
#define ll long long
#define ull unsigned long long 
#define PII pair<int, int>
#define vint vector<int>
#define pb(a) push_back(a)
#define fi first
#define se second
#define inf 0x3f3f3f3f
#define eqs 1e-6
// const int mod = 
const int N = 1e5 + 210;

int n,m;
struct Node
{
	int s[2],p,key;
	int size;
	
	void init(int _p,int _key)
	{
		p = _p,key = _key;
		size = 1;
	}
}tr[N];
string name[N];
int root,idx;

void pushup(int u)
{
	tr[u].size = tr[tr[u].s[0]].size + tr[tr[u].s[1]].size + 1;
}

void rotate(int x)
{
	int y = tr[x].p,z = tr[y].p;
	int k = tr[y].s[1] == x;
	tr[z].s[tr[z].s[1] == y] = x,tr[x].p = z;
	tr[y].s[k] = tr[x].s[k ^ 1],tr[tr[x].s[k ^ 1]].p = y;
	tr[x].s[k ^ 1] = y,tr[y].p = x;
	pushup(y),pushup(x);
}

void splay(int x,int k)
{
	while(tr[x].p != k)
	{
		int y =tr[x].p,z = tr[y].p;
		if(z != k)
			if((tr[y].s[1] == x) ^ (tr[z].s[1] == y))
				rotate(x);
			else rotate(y);
		rotate(x);
	}
	if(!k)
		root = x;
}

void insert(int key)
{
	int u = root,p = 0;
	while(u)
		p = u,u =tr[u].s[key > tr[u].key];
	u = ++idx;
	if(p)
		tr[p].s[key > tr[u].key] = u;
	tr[u].init(p,key);
	splay(u,0);
}

int get_k(int k)
{
	int u = root;
	while(true)
	{
		if(tr[tr[u].s[0]].size >= k)
			u = tr[u].s[0];
		else if(tr[tr[u].s[0]].size + 1 == k)
			return u;
		else k -= tr[tr[u].s[0]].size + 1,u = tr[u].s[1];
	}
	return -1;
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
	
	cin >> n;
	for(int i = 1;i <= n;++i)
	{
		string str;
		cin >> str;
		name[i] = str;
		insert(i);
	}
	cin >> m;
	while(m--)
	{
		string str;
		int k;
		cin >> str >> k;
		name[++idx] = str;
		int L = get_k(k),R = get_k(k + 1);
		splay(L,0),splay(R,L);
		tr[idx].init(R,++n);
		tr[R].s[0] = idx;
		pushup(R),pushup(L);
	}
	cin >> m;
	while(m--)
	{
		int k;
		cin >> k;
		k = get_k(k + 1);
		cout << name[k] << endl;
	}
	
    return 0;
}
2022/10/7 21:01
加载中...