人傻常数大
查看原帖
人傻常数大
331947
hegm楼主2023/6/13 09:35

用的3log做法

只有 34 分,其他的全TLE

开的O2 + c++20也是这样

#include<bits/stdc++.h>
#define N 400005
#define ls (now<<1)
#define rs (now<<1|1)
#define inf 1000000000
using namespace std;
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*10+ch-'0';ch=getchar();}
	return x*f;
}
int n,m,q,sid,fa[N],st[N],et[N],siz[N],Ans;
struct per
{
	int x,v;
	bool operator<(per a)const
	{
		return v<a.v;
	}
}p[N];
per Min(per a,per b)
{
	if(a.v<b.v)return a;
	else return b; 
}
struct query
{
	int id,x,y;
}c[N];
stack<vector<query> > t;
stack<query> t2;
struct fig
{
	int to,next;
}k[N*2];int head[N],tot;
void add(int from,int to)
{
	k[++tot].to=to;
	k[tot].next=head[from];
	head[from]=tot;
}
vector<per> v[N];
void ins(int now,int l,int r,int ql,int qr,per p)
{
	if(l>=ql&&r<=qr)
	{
		v[now].push_back(p);
		return ;
	}
	int mid=(l+r)>>1;
	if(mid>=ql)ins(ls,l,mid,ql,qr,p);
	if(mid<qr)ins(rs,mid+1,r,ql,qr,p);
}
int son[N],dfn[N],cnt,top[N],id[N];
void dfs(int now)
{
	siz[now]=1;
	for(int i=head[now];i;i=k[i].next)
	{
		dfs(k[i].to);
		siz[now]+=siz[k[i].to];
		if(siz[son[now]]<siz[k[i].to])son[now]=son[k[i].to];
	}
}
void pf(int now,int tp)
{
	dfn[now]=++cnt;id[cnt]=now;
	top[now]=tp;
	if(son[now])pf(son[now],tp);
	for(int i=head[now];i;i=k[i].next)
	{
		if(k[i].to==son[now])continue;
		pf(k[i].to,k[i].to);
	}
}
struct tree
{
	int lz,mn;per w; 
	multiset<per> q;
}tr[N*4];
void up(int now)
{
	tr[now].mn=min(tr[ls].mn,tr[rs].mn);
	tr[now].w=Min(tr[ls].w,tr[rs].w);
}
void down(int now)
{
	if(tr[now].lz)
	{
		tr[ls].mn+=tr[now].lz;
		tr[ls].lz+=tr[now].lz;
		tr[rs].mn+=tr[now].lz;
		tr[rs].lz+=tr[now].lz;
	}
	tr[now].lz=0;
}
void build(int now,int l,int r)
{
	tr[now].mn=inf;tr[now].w=per{inf,inf};
	tr[now].q.insert(per{inf,inf});
	if(l==r)
	{
		tr[now].mn=siz[id[l]];
		return ;
	}
	int mid=(l+r)>>1;
	build(ls,l,mid);build(rs,mid+1,r);
	up(now);
}
void midy(int now,int l,int r,int ql,int qr,int w)
{
	if(l>=ql&&r<=qr)
	{
		tr[now].mn+=w;
		tr[now].lz+=w;
		return ;
	}
	int mid=(l+r)>>1;down(now);
	if(mid>=ql)midy(ls,l,mid,ql,qr,w);
	if(mid<qr)midy(rs,mid+1,r,ql,qr,w);
	up(now);
}
int ans;
void find(int now,int l,int r)
{
	if(l==r)
	{
		ans=l;
		return ;
	}
	int mid=(l+r)>>1;down(now);
	if(tr[rs].mn==0)find(rs,mid+1,r);
	else find(ls,l,mid);
}
void getr(int now,int l,int r,int ql,int qr)
{
	if(ans)return ;
	if(l>=ql&&r<=qr)
	{ 
		if(tr[now].mn==0)find(now,l,r);
		return ;
	}
	int mid=(l+r)>>1;down(now);
	if(mid<qr)getr(rs,mid+1,r,ql,qr);
	if(mid>=ql)getr(ls,l,mid,ql,qr);
}
void sol(int a)
{
	ans=0;vector<query> v;
	while(a!=0)
	{
		getr(1,1,n,dfn[top[a]],dfn[a]);
		a=fa[top[a]];
		if(ans)break;
	}
}
per que(int now,int l,int r,int ql,int qr)
{
	if(l>=ql&&r<=qr)return tr[now].w;
	int mid=(l+r)>>1;per cnt=per{inf,inf};down(now);
	if(mid>=ql)cnt=Min(cnt,que(ls,l,mid,ql,qr));
	if(mid<qr)cnt=Min(cnt,que(rs,mid+1,r,ql,qr));
	return cnt;
}
void inst(int now,int l,int r,int x,per p)
{
	if(l==r)
	{
		tr[now].w=Min(tr[now].w,p);
		tr[now].q.insert(p);
		return ;
	}
	int mid=(l+r)>>1;down(now);
	if(mid>=x)inst(ls,l,mid,x,p);
	else inst(rs,mid+1,r,x,p);
	up(now); 
}
void del(int now,int l,int r,int x,per w)
{
	if(l==r)
	{
		tr[now].q.erase(tr[now].q.lower_bound(w));
		tr[now].w=*tr[now].q.begin(); 
		return ;
	}
	int mid=(l+r)>>1;down(now);
	if(mid>=x)del(ls,l,mid,x,w);
	else del(rs,mid+1,r,x,w);
	up(now); 
}
void sol(int a,int w)
{
	ans=0;vector<query> v;
	while(a!=0)
	{
		midy(1,1,n,dfn[top[a]],dfn[a],w);
		a=fa[top[a]];
	}
}
void run(int now,int l,int r)
{
	int num=0,awa=0;
	for(per i:v[now])
	{
		sol(i.x);
		if(ans)
		{
			per mn=que(1,1,n,ans,ans+siz[id[ans]]-1);
			if(mn.v<i.v)
			{
				del(1,1,n,dfn[mn.x],mn);sol(mn.x,1); 
				inst(1,1,n,dfn[i.x],i);sol(i.x,-1);
				Ans-=mn.v;
				Ans+=i.v;
				t2.push(query{1,mn.x,mn.v});
				t2.push(query{2,i.x,i.v});
				num+=2;
			}
		}
		else 
		{
			num++;
			Ans+=i.v;
			inst(1,1,n,dfn[i.x],i);sol(i.x,-1);
			t2.push(query{2,i.x,i.v});
		}
	}
	if(l==r)cout<<Ans<<" ";
	else
	{
		int mid=(l+r)>>1;
		run(ls,l,mid);
		run(rs,mid+1,r);
	}
	for(int j=1;j<=awa;j++)
	{
		vector<query> v=t.top();t.pop();
		for(query i:v)midy(1,1,n,i.id,i.x,i.y);
	}
	for(int i=1;i<=num;i++)
	{
		query x=t2.top();t2.pop();
		if(x.id==2)del(1,1,n,dfn[x.x],per{x.x,x.y}),Ans-=x.y,sol(x.x,1);
		else inst(1,1,n,dfn[x.x],per{x.x,x.y}),Ans+=x.y,sol(x.x,-1);
	}
}
signed main()
{
	sid=read();
	n=read();m=read();q=read();
	for(int i=2;i<=n;i++)fa[i]=read(),add(fa[i],i);
	for(int i=1;i<=m;i++)p[i].x=read(),p[i].v=read(),st[i]=1;
	for(int i=1;i<=q;i++)
	{
		c[i].id=read();c[i].x=read();
		if(c[i].id==1)
		{
			c[i].y=read();
			m++;
			p[m].x=c[i].x;
			p[m].v=c[i].y;
			st[m]=i+1;
		}
		if(c[i].id==2)et[c[i].x]=i;
	}
	q++;
	for(int i=1;i<=m;i++)
	{
		if(et[i]==0)et[i]=q;
		ins(1,1,q,st[i],et[i],p[i]);
	}
	dfs(1);pf(1,1);build(1,1,n);
	run(1,1,q);
	return 0;
}
2023/6/13 09:35
加载中...