说好的 log^3 能过 2e5 呢
查看原帖
说好的 log^3 能过 2e5 呢
504093
dyc2022楼主2025/8/29 21:33

rt,KTT 卡疯了,一直 TLE on #10。

#include<bits/stdc++.h>
#define int long long
#define endl '\n'
#define N 200006
using namespace std;
constexpr int INF=1e18;
int n,q,dfs_clock,a[N],b[N],dfn[N],id[N],sa[N],sb[N],sz[N];
vector<int> G[N];
inline int read()
{
	int ret=0,f=1;char ch=getchar();
	while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
	if(ch=='-')f=-1,ch=getchar();
	while(ch>='0'&&ch<='9')ret=(ret<<3)+(ret<<1)+(ch^48),ch=getchar();
	return ret*f;
}
inline void write(int k)
{
	if(k<0)putchar('-'),k=-k;
	static int nnum[20],ttp=0;
	while(k)nnum[++ttp]=k%10,k/=10;
	if(!ttp)nnum[++ttp]=0;
	while(ttp)putchar(nnum[ttp--]^48);
}
void dfs(int u,int suma,int sumb)
{
    sz[u]=1,id[dfn[u]=++dfs_clock]=u;
    sa[u]=(suma+=a[u]),sb[u]=abs(sumb+=b[u]);
    for(int v:G[u])dfs(v,suma,sumb),sz[u]+=sz[v];
}
struct KTT{
    int tag[N<<2];
    struct Line{int k,b,lim;}tree[N<<2];
    pair<Line,int> Max(Line x,Line y)
    {
        if(x.b<y.b)swap(x,y);
        if(x.k>=y.k)return make_pair(x,INF);
        return make_pair(x,(x.b-y.b)/(x.k-y.k));
    }
    void push_up(int p)
    {
        pair<Line,int> t=Max(tree[p<<1],tree[p<<1|1]);
        tree[p]={t.first.k,t.first.b,
                 min({tree[p<<1].lim,tree[p<<1|1].lim,t.second})};
    }
    void build(int p,int l,int r,int o)
    {
        if(l==r)return tree[p].k=sb[id[l]]*o,tree[p].b=tree[p].k*sa[id[l]],tree[p].lim=INF,(void)0;
        int mid=l+r>>1;build(p<<1,l,mid,o),build(p<<1|1,mid+1,r,o);
        push_up(p);
    }
    void push_down(int p)
    {
        if(!tag[p])return;
        tree[p<<1].b+=tree[p<<1].k*tag[p];
        tree[p<<1|1].b+=tree[p<<1|1].k*tag[p];
        tag[p<<1]+=tag[p],tag[p<<1|1]+=tag[p];
        tree[p<<1].lim-=tag[p],tree[p<<1|1].lim-=tag[p],tag[p]=0;
    }
    void update(int p,int l,int r,int L,int R,int x)
    {
        if(L<=l&&r<=R&&tree[p].lim>=x)
            return tree[p].b+=tree[p].k*x,tag[p]+=x,tree[p].lim-=x,(void)0;
        push_down(p);int mid=l+r>>1;
        if(L<=mid)update(p<<1,l,mid,L,R,x);
        if(R>mid)update(p<<1|1,mid+1,r,L,R,x);
        push_up(p);
    }
    int query(int p,int l,int r,int L,int R)
    {
        if(L<=l&&r<=R)return tree[p].b;
        push_down(p);int mid=l+r>>1,ret=0;
        if(L<=mid)ret=max(ret,query(p<<1,l,mid,L,R));
        if(R>mid)ret=max(ret,query(p<<1|1,mid+1,r,L,R));
        return ret;
    }
}T1,T2;
main()
{
    n=read(),q=read();
    for(int i=2;i<=n;i++)G[read()].push_back(i);
    for(int i=1;i<=n;i++)a[i]=read();
    for(int i=1;i<=n;i++)b[i]=read();
    dfs(1,0,0),T1.build(1,1,n,1),T2.build(1,1,n,-1);
    while(q--)
    {
        int opt=read(),u=read(),x;
        if(opt==1)x=read(),T1.update(1,1,n,dfn[u],dfn[u]+sz[u]-1,x),
                           T2.update(1,1,n,dfn[u],dfn[u]+sz[u]-1,x);
        else write(max(T1.query(1,1,n,dfn[u],dfn[u]+sz[u]-1),
                       T2.query(1,1,n,dfn[u],dfn[u]+sz[u]-1))),putchar(10);
    }
    return 0;
}
2025/8/29 21:33
加载中...