社区讨论
FHQ指针写法 RE求调
P3391【模板】文艺平衡树参与者 3已保存回复 5
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 5 条
- 当前快照
- 1 份
- 快照标识符
- @m25xpjsk
- 此快照首次捕获于
- 2024/10/12 17:08 去年
- 此快照最后确认于
- 2025/11/04 17:23 4 个月前
比较离谱的是:
在洛谷在线IDE上不开O2能过,开O2RE
提交后无论开不开O2都RE
如果各位对指针写法感到反感,在这里深表歉意(主要是真的写习惯了)
提交记录:https://www.luogu.com.cn/record/181611803
代码:
CPP#include<cstdio>
#include<chrono>
#include<random>
#include<algorithm>
std::mt19937 rnd(std::chrono::system_clock::now().time_since_epoch().count());
namespace FHQ
{
struct node
{
int key,pri,sz;
bool lz;
node *lch,*rch;
node(int x)
{
key=x;
sz=1;
pri=rnd();
lz=0;
lch=rch=nullptr;
}
int size()
{
if(this==nullptr)
return 0;
else
return sz;
}
void update()
{
sz=lch->size()+rch->size()+1;
}
void lazy()
{
if(this!=nullptr)
lz=(!lz);
}
void down()
{
if(lz)
{
std::swap(lch,rch);
lz=0;
lch->lazy();
rch->lazy();
}
}
};
void split(int x,node *p,node *&l,node *&r)
{
if(p==nullptr)
{
l=r=nullptr;
return;
}
p->down();
if(p->lch->size()>=x)
{
r=p;
split(x,p->lch,l,r->lch);
}
else
{
l=p;
split(x-p->lch->size()-1,p->rch,l->rch,r);
}
p->update();
}
node *merge(node *l,node *r)
{
if(l==nullptr)
return r;
if(r==nullptr)
return l;
if(l->pri>r->pri)
{
l->down();
l->rch=merge(l->rch,r);
l->update();
return l;
}
else
{
r->down();
r->lch=merge(l,r->lch);
r->update();
return r;
}
}
void out(node *p)
{
if(p==nullptr)
return;
p->down();
out(p->lch);
printf("%d ",p->key);
out(p->rch);
}
}
int main()
{
using namespace FHQ;
int n,m;
node *tr=nullptr;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
node *r=new node(i);
tr=merge(tr,r);
}
for(int i=1;i<=m;i++)
{
int l,r;
scanf("%d%d",&l,&r);
node *lp,*mp,*rp,*a;
split(r,tr,a,rp);
split(l-1,a,lp,mp);
// out(mp);
// printf("\n");
mp->lazy();
a=merge(lp,mp);
tr=merge(a,rp);
// out(tr);
}
out(tr);
return 0;
}
回复
共 5 条回复,欢迎继续交流。
正在加载回复...