可持久化线段树 task#3 测试点#12 TLE 88分求调
查看原帖
可持久化线段树 task#3 测试点#12 TLE 88分求调
674668
chocoblack楼主2024/11/28 21:08

提交记录 88分,求调(码风可能有点奇怪)

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int MAXN=1000006,MAXM=1000006;
int a[MAXN],top=1;
int head[MAXM];
struct Node
{
	int v;
	int l,r;
	int lc,rc;
} d[MAXN*2*16];
int clone(int p)
{
    top++;
    d[top]=d[p];
    return top;
}
void build(int l,int r,int p)
{
	int mid=(l+r)/2;
	d[p].l=l;
	d[p].r=r;
	d[p].lc=++top;
	d[p].rc=++top;
	if(l>=r)
	{
		d[p].v=a[mid];
		return;
	}
	build(l,mid,d[p].lc);
	build(mid+1,r,d[p].rc);
	d[p].v=d[d[p].lc].v+d[d[p].rc].v;
}
int query(int l,int r,int p)
{
	int L=d[p].l,R=d[p].r;

	if(L>=l && R<=r)
	{
		return d[p].v;
	}
	if(L>=R)
    {
        return d[p].v;
    }
	int mid=(L+R)/2;
	int ans=0;
	if(l<=mid)
	{
		ans+=query(l,r,d[p].lc);
		//return query(l,r,d[p].lc);
	}
	else if(r>mid)
	{
		ans+=query(l,r,d[p].rc);
		//return query(l,r,d[p].rc);
	}
	return ans;
}
int add(int s,int q,int P)
{
    int p=clone(P);
	int L=d[p].l,R=d[p].r;
	if(L>=R)
	{
		d[p].v=q;
		return p;
	}
	int mid=(L+R)/2;
	if(s<=mid)
	{
	    d[p].lc=add(s,q,d[p].lc);
	}
	else if(s>mid)
	{
	    d[p].rc=add(s,q,d[p].rc);
	}
	d[p].v=d[d[p].lc].v+d[d[p].rc].v;
	return p;
}
signed main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int n,m;
	cin>>n>>m;
	for(int i=1; i<=n; i++)
	{
		cin>>a[i];
	}
	head[0]=top;
	build(1,n,1);
	for(int i=1; i<=m; i++)
	{
		int q,x,y,z;
		cin>>z>>q;
		head[i]=top+1;
		//clone(z);
		if(q==2)
		{
		    cin>>x;
		    //Sleep(8000);
		    clone(head[z]);
			cout<<query(x,x,clone(head[z]))<<endl;
		}
		if(q==1)
		{
		    cin>>x>>y;
			add(x,y,head[z]);
		}
	}
	return 0;
}

2024/11/28 21:08
加载中...