本地AC在线WA?RE?来个栗子帮助你。

题目是模板题树链剖分

至于我为什么把树剖当模板题,别问我,我就是这个题出了错。

可以不懂代码什么意思,毕竟不是关于树剖的博客

第一次打,样例过了,交80分,感到莫名其妙,看了半天没看出哪里错了。问一个已经AC的大佬,他跟我说我没开long long 。我看看题面,除了n和m的数据范围,什么都没有。可能确实要开long long。但是开了longlong我还是WA80,不想把int改成long long 了,于是define 了一下,把scanf改成%lld。

以下是第一次代码(WA80)

// luogu-judger-enable-o2
#include <bits/stdc++.h>
using namespace std;
const int N = 100010 ;
struct edge{
    int to,next ;
}e[N<<1];
int head[N],a[N];
int f[N];    //i的父亲
int dep[N];  //i的深度
int size[N]; //i的子树大小 
int son[N];  //重儿子 
int rk[N];   //i的dfs值,与dfn相反
int top[N];  //i所在链的顶端
int dfn[N];  //dfs序,时间戳 
int n,m,p,r,rt,tot,cnt ;
inline void add(int x,int y){
    e[++cnt].to=y;
    e[cnt].next=head[x] ;
    head[x]=cnt ;
}
void dfs1(int rt,int fa,int depth){ //主要处理深度,父亲和儿子 
    f[rt]=fa;dep[rt]=depth;size[rt]=1;//一些初始化 
    for (int i=head[rt];i;i=e[i].next){
        int to=e[i].to ;
        if (to==fa) continue ;//保证不是父亲 
        dfs1(to,rt,depth+1) ;
        size[rt]+=size[to] ;//rt的大小+子树的大小 
        if (size[son[rt]]<size[to]) son[rt]=to ;//改变重儿子 
    }
}
void dfs2(int rt,int t){ //主要处理链,dfs序 
    top[rt]=t;dfn[rt]=++cnt;rk[cnt]=rt;//初始化
    if (!son[rt]) return ;//该点没有重儿子 
    dfs2(son[rt],t) ;//rt的重儿子也是和rt一样处于以t为顶端的重链 
    for (int i=head[rt];i;i=e[i].next){
        int to=e[i].to ;
        if (to!=f[rt] && to!=son[rt]) dfs2(to,to) ;//一个点位于轻链底端,那么它的top必然是它本身
    } 
}
struct seg{ //线段树 
    int ls,rs,lazy,l,r,sum ;
}tree[N<<1];
inline void pushup(int rt){
    tree[rt].sum=(tree[tree[rt].ls].sum+tree[tree[rt].rs].sum+
    tree[rt].lazy*(tree[rt].r-tree[rt].l+1))%p;
}
void build(int ll,int rr,int rt){ //create
    if (ll==rr){
        tree[rt].l=tree[rt].r=ll ;
        tree[rt].sum=a[rk[ll]] ;
        return ;
    }
    else {
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值