社区讨论

学OI没多久,问一下各位奆佬神犇为什么#10 WA了

P3950部落冲突参与者 8已保存回复 10

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
10 条
当前快照
1 份
快照标识符
@mi6wkhm0
此快照首次捕获于
2025/11/20 11:59
4 个月前
此快照最后确认于
2025/11/20 11:59
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
typedef int ll;
struct edge{
    ll to,prev;
};
struct SegmentTree{
    ll l,r,sum,tag;
};
struct battle{
    ll x,y;
};
const ll MAXN=300051;
battle bt[MAXN];
edge ed[MAXN];
SegmentTree tree[MAXN<<2];
ll last[MAXN],val[MAXN],depth[MAXN],fa[MAXN],size[MAXN],heavy[MAXN];
ll id[MAXN],pre[MAXN],top[MAXN];
ll tot,nc,cnt,ccnt,x,y,from,to,num,toto,tx;
char op; 
inline ll read()
{
    register ll num=0,neg=1;
    register char ch=getchar();
    while(!isdigit(ch)&&ch!='-')
    {
        ch=getchar();
    }
    if(ch=='-')
    {
        neg=-1;
        ch=getchar();
    }
    while(isdigit(ch))
    {
        num=(num<<3)+(num<<1)+(ch-'0');
        ch=getchar();
    }
    return num*neg;
}
inline void addEdge(ll from,ll to)
{
    ed[++tot].prev=last[from];
    ed[tot].to=to;
    last[from]=tot;
}
inline void update(ll node)
{
    tree[node].sum=tree[node<<1].sum+tree[(node<<1)|1].sum;
}
inline void create(ll l,ll r,ll node)
{
    tree[node].l=l,tree[node].r=r;
    if(l==r)
    {
        tree[node].sum=val[l];
        return;
    }
    ll mid=(l+r)>>1;
    create(l,mid,node<<1);
    create(mid+1,r,(node<<1)|1);
    update(node);
}
inline void spread(ll node)
{
    if(tree[node].tag)
    {
        tree[node<<1].sum+=tree[node].tag*(tree[node<<1].r-tree[node<<1].l+1);
        tree[(node<<1)|1].sum+=tree[node].tag*(tree[(node<<1)|1].r-tree[(node<<1)|1].l+1);
        tree[node<<1].tag+=tree[node].tag;
        tree[(node<<1)|1].tag+=tree[node].tag;
        tree[node].tag=0;
    }
}
inline void change(ll pos,ll val,ll node)
{
	if(tree[node].l==tree[node].r)
	{
		tree[node].sum+=val;
		return;
	}
	ll mid=(tree[node].l+tree[node].r)>>1;
	if(pos<=mid)
	{
		change(pos,val,node<<1);
	}
	else
	{
		change(pos,val,(node<<1)|1);
	}
	update(node);
}
inline void add(ll l,ll r,ll val,ll node)
{
    if(l<=tree[node].l&&r>=tree[node].r)
    {
        tree[node].sum+=val*(tree[node].r-tree[node].l+1);
        tree[node].tag+=val;
        return;
    }
    spread(node);
    ll mid=(tree[node].l+tree[node].r)>>1;
    if(l<=mid)
    {
        add(l,r,val,node<<1);
    }
    if(r>mid)
    {
        add(l,r,val,(node<<1)|1);
    }
    update(node);
}

回复

10 条回复,欢迎继续交流。

正在加载回复...