WA,58 分,模板线段树分裂,求调
查看原帖
WA,58 分,模板线段树分裂,求调
263082
A_zjzj楼主2022/7/6 14:18

检验了一下,不是回收栈的问题,也不是 long long 的问题,求大佬帮忙找一下问题。QAQ

代码如下:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+10,P=7.5e6;
int n,m,cnt,tot=1,root[N],stk[P],top,root1,root2;
struct tree {
	int ls,rs;
	ll siz;
} t[P];
int newnode() {
	int id=top?stk[top--]:++cnt;
	t[id]= {0,0,0};
	return id;
}
void pushup(int rt) {
	t[rt].siz=t[t[rt].ls].siz+t[t[rt].rs].siz;
}
void update(int &rt,int cur,int x,int l=1,int r=n) {
	if(!rt)rt=newnode();
	t[rt].siz+=x;
	if(l==r)return;
	int mid=(l+r)>>1;
	cur<=mid?update(t[rt].ls,cur,x,l,mid):update(t[rt].rs,cur,x,mid+1,r);
}
ll query(int rt,int L,int R,int l=1,int r=n) {
	if(!rt)return 0;
	if(L<=l&&r<=R)return t[rt].siz;
	int mid=(l+r)>>1;
	ll s=0;
	if(L<=mid)s+=query(t[rt].ls,L,R,l,mid);
	if(mid<R)s+=query(t[rt].rs,L,R,mid+1,r);
	return s;
}
int kth(int rt,ll k,int l=1,int r=n) {
	if(k<1||k>t[rt].siz)return -1;
	if(l==r)return l;
	int mid=(l+r)>>1;
	return k<=t[t[rt].ls].siz?kth(t[rt].ls,k,l,mid):kth(t[rt].rs,k-t[t[rt].ls].siz,mid+1,r);
}
void merge(int &x,int y) {
	if(!x||!y)return void(x|=y);
	stk[++top]=y;
	merge(t[x].ls,t[y].ls);
	merge(t[x].rs,t[y].rs);
	pushup(x);
}
void split(int x,int &y,int cur,int l=1,int r=n) {
	if(!x)return;
	if(l==r)return;
	y=newnode();
	int mid=(l+r)>>1;
	if(cur<=mid)swap(t[x].rs,t[y].rs),cur<mid&&(split(t[x].ls,t[y].ls,cur,l,mid),0);
	else split(t[x].rs,t[y].rs,cur,mid+1,r);
	pushup(x);
	pushup(y);
}
void create(int p,int x,int y) {
	if(x>1)split(root[p],root1,x-1);
	else root1=root[p],root[p]=0;
	if(y<n)split(root1,root2,y);
	else root2=0;
	merge(root[++tot],root1);
	merge(root[p],root2);
}
int main() {
	scanf("%d%d",&n,&m);
	for(int i=1,x; i<=n; i++)scanf("%d",&x),update(root[1],i,x);
	ll k;
	for(int op,x,y,z; m--;) {
		scanf("%d%d",&op,&x);
		if(!op)scanf("%d%d",&y,&z),create(x,y,z);
		else if(op==1)scanf("%d",&y),merge(root[x],root[y]);
		else if(op==2)scanf("%d%d",&y,&z),update(root[x],z,y);
		else if(op==3)scanf("%d%d",&y,&z),printf("%lld\n",query(root[x],y,z));
		else scanf("%lld",&k),printf("%d\n",kth(root[x],k));
	}
	return 0;
}

2022/7/6 14:18
加载中...