社区讨论
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 条回复,欢迎继续交流。
正在加载回复...