社区讨论
为啥洛谷AC,上了poj&hdu都WA了???
P3834【模板】可持久化线段树 2参与者 4已保存回复 8
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 8 条
- 当前快照
- 1 份
- 快照标识符
- @mi7yrxhb
- 此快照首次捕获于
- 2025/11/21 05:49 4 个月前
- 此快照最后确认于
- 2025/11/21 05:49 4 个月前
我这个小蒟蒻已经调了2个小时了。。。救救我吧。。。
CPP#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
namespace Flandle_Scarlet
{
#define INT "%d"
#define N 100100
class HJT_SegmentTree
{
public:
struct node
{
int l_s,r_s;
int s;
}tree[N*10];
int root[N];
int cnt;
#define ls tree[index].l_s
#define rs tree[index].r_s
#define S tree[index].s
#define lS tree[ls].s
#define rS tree[rs].s
void InitAll()
{
cnt=0;
memset(root,0,sizeof(root));
memset(tree,0,sizeof(tree));
}
int Build(int l,int r)
{
int index=++cnt;
int mid=(l+r)>>1;
if (l<r)
{
ls=Build(l,mid);
rs=Build(mid+1,r);
}
return index;
}
int Add1(int pos,int l,int r,int pre)
{
int index=++cnt;
tree[index]=tree[pre];
++S;
if (l<r)
{
int mid=(l+r)>>1;
if (pos<=mid)
{
ls=Add1(pos,l,mid,tree[pre].l_s);
}
else
{
rs=Add1(pos,mid+1,r,tree[pre].r_s);
}
}
return index;
}
int Query(int u,int v,int l,int r,int k)
{
if (l==r) return l;
int tmp=tree[tree[v].l_s].s-tree[tree[u].l_s].s;
int mid=(l+r)>>1;
if (k<=tmp)
{
return Query(tree[u].l_s,tree[v].l_s,l,mid,k);
}
else
{
return Query(tree[u].r_s,tree[v].r_s,mid+1,r,k-tmp);
}
}
}T;
int a[N],n;int b[N],d;
int q;
void R1(int &x)
{
// x=0;char c=getchar();int f=1;
// while(c<'0' || c>'9') f=(c=='-')?-1:1,c=getchar();
// while(c>='0' && c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
// x=(f==1)?x:-x;
scanf("%d",&x);
}
void Input()
{
R1(n);R1(q);
for(int i=1;i<=n;++i)
{
R1(a[i]);
b[i]=a[i];
}
sort(b+1,b+n+1);
d=unique(b+1,b+n+1)-b-1;
}
int Get(int x)
{
return lower_bound(b+1,b+d+1,x)-b;
}
void Soviet()
{
T.root[0]=T.Build(1,d);
for(int i=1;i<=n;++i)
{
a[i]=Get(a[i]);
T.root[i]=T.Add1(a[i],1,d,T.root[i-1]);
}
for(int i=1;i<=q;++i)
{
int l,r,k;R1(l),R1(r),R1(k);
int p=T.Query(T.root[l-1],T.root[r],1,d,k);
printf("%d\n",b[p]);
}
}
void InitAll()
{
n=q=d=0;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
T.InitAll();
}
void IsMyWife()
{
if (0)
{
freopen("","r",stdin);
freopen("","w",stdout);
}
int t;
R1(t);
// t=1;
while(t--)
{
InitAll();
Input();
Soviet();
}
}
};
int main()
{
Flandle_Scarlet::IsMyWife();
return 0;
}
回复
共 8 条回复,欢迎继续交流。
正在加载回复...