社区讨论

MLE求助

P5217贫穷参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@m265xdmb
此快照首次捕获于
2024/10/12 20:58
去年
此快照最后确认于
2025/11/04 17:21
4 个月前
查看原帖
CPP
/*
	Luogu name: Symbolize
	Luogu uid: 672793
*/
#include<bits/stdc++.h>
#define int long long
#define pii pair<int,int>
#define x first
#define y second
#define rep1(i,l,r) for(register int i=l;i<=r;++i)
#define rep2(i,l,r) for(register int i=l;i>=r;--i)
#define rep3(i,x,y,z) for(register int i=x[y];~i;i=z[i])
#define rep4(i,x) for(auto i:x)
#define debug() puts("----------")
const int N=2e5+10;
const int inf=0x3f3f3f3f3f3f3f3f;
using namespace std;
int n,m,a[N];
struct FHQ_Treap
{
	int root,idx;
	bool vis[N];
	struct node
	{
		int ls,rs;
		int fa;
		int sz;
		char key;
		int s;
		int val;
		int tag;
	}tr[N];
	int get_node(char x)
	{
		tr[++idx]={0,0,0,1,x,1ll<<(x-'a'),rand(),0};
		return idx;
	}
	void push_down(int p)
	{
		if(!tr[p].tag) return;
		swap(tr[p].ls,tr[p].rs);
		tr[tr[p].ls].tag^=1;
		tr[tr[p].rs].tag^=1;
		tr[p].tag=0;
		return;
	}
	void push_up(int p)
	{
		if(tr[p].ls) tr[tr[p].ls].fa=p;
		if(tr[p].rs) tr[tr[p].rs].fa=p;
		tr[p].sz=tr[tr[p].ls].sz+tr[tr[p].rs].sz+1;
		tr[p].s=tr[tr[p].ls].s|tr[tr[p].rs].s|(1ll<<(tr[p].key-'a'));
		return;
	}
	void split(int p,int sz,int &x,int &y)
	{
		if(!p)
		{
			x=y=0;
			return;
		}
		if(tr[p].tag) push_down(p);
		if(tr[tr[p].ls].sz+1<=sz)
		{
			x=p;
			split(tr[p].rs,sz-tr[tr[p].ls].sz-1,tr[p].rs,y);
		}
		else
		{
			y=p;
			split(tr[p].ls,sz,x,tr[p].ls);
		}
		push_up(p);
		return;
	}
	int merge(int x,int y)
	{
		if(!x||!y) return x+y;
		if(tr[x].val<tr[y].val)
		{
			push_down(x);
			tr[x].rs=merge(tr[x].rs,y);
			push_up(x);
			return x;
		}
		else
		{
			push_down(y);
			tr[y].ls=merge(x,tr[y].ls);
			push_up(y);
			return y;
		}
		return -1;
	}
	void insert(int x,char key)
	{
		int l,r;
		split(root,x,l,r);
		root=merge(merge(l,get_node(key)),r);
		return;
	}
	void erase(int x)
	{
		int l,mid,r;
		split(root,x-1,l,r);
		split(r,1,mid,r);
		mid=merge(tr[mid].ls,tr[mid].rs);
		vis[mid]=1;
		root=merge(merge(l,mid),r);
		return;
	}
	void reverse(int x,int y)
	{
		int l,mid,r;
		split(root,y,l,r);
		split(l,x-1,l,mid);
		tr[mid].tag^=1;
		root=merge(merge(l,mid),r);
		return;
	}
	void updown(int x)
	{
		if(tr[x].fa) updown(tr[x].fa);
		push_down(x);
		return;
	}
	int get_rank_by_key(int x)
	{
		if(vis[x]) return 0;
		updown(x);
		int rk=tr[tr[x].ls].sz+1;
		int now=x;
		while(tr[now].fa)
		{
			if(tr[tr[now].fa].rs==now) rk+=tr[tr[tr[now].fa].ls].sz+1;
			now=tr[now].fa;
		}
		return rk;
	}
	char get_key_by_rank(int x)
	{
		int l,mid,r;
		split(root,x-1,l,r);
		split(root,1,mid,r);
		char ans=tr[mid].key;
		root=merge(merge(l,mid),r);
		return ans;
	}
	int count(int x,int y)
	{
		int l,mid,r;
		split(root,y,l,r);
		split(l,x-1,l,mid);
		int ans=__builtin_popcountll(tr[mid].s);
		root=merge(merge(l,mid),r);
		return ans;
	}
}fhq;
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<<1)+(x<<3)+(ch^48);
		ch=getchar();
	}
	return f*x;
}
signed main()
{
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);
	n=read();
	m=read();
	rep1(i,1,n)
	{
		char ch;
		cin>>ch;
		a[i]=fhq.get_node(ch);
		fhq.root=fhq.merge(fhq.root,a[i]); 
	}
	while(m--)
	{
		char opt;
		cin>>opt;
		if(opt=='I')
		{
			int x=read();
			char ch;
			cin>>ch;
			fhq.insert(x,ch);
		}
		if(opt=='D')
		{
			int x=read();
			fhq.erase(x);
		}
		if(opt=='R')
		{
			int x=read();
			int y=read();
			fhq.reverse(x,y);
		}
		if(opt=='P')
		{
			int x=read();
			cout<<fhq.get_rank_by_key(a[x])<<"\n";
		}
		if(opt=='T')
		{
			int x=read();
			cout<<fhq.get_key_by_rank(x)<<"\n";
		}
		if(opt=='Q')
		{
			int x=read();
			int y=read();
			cout<<fhq.count(x,y)<<"\n";
		}
	}
	return 0;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...