题目是模板题树链剖分

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

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

第一次打,样例过了,交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){ //createif (ll==rr){tree[rt].l=tree[rt].r=ll ;tree[rt].sum=a[rk[ll]] ;return ;}else {int mid=(ll+rr)>>1;tree[rt].ls=cnt++ ;tree[rt].rs=cnt++ ;build(ll,mid,tree[rt].ls) ;build(mid+1,rr,tree[rt].rs) ;tree[rt].l=tree[tree[rt].ls].l ;tree[rt].r=tree[tree[rt].rs].r ;pushup(rt) ;}
}
void update(int l,int r,int rt,int c){ //l~r +c if (l<=tree[rt].l && tree[rt].r<=r) {tree[rt].sum=(tree[rt].sum+c*(tree[rt].r-tree[rt].l+1))%p ;tree[rt].lazy=(tree[rt].lazy+c)%p ;}else {int mid=(tree[rt].l+tree[rt].r)>>1 ;if (l<=mid) update(l,r,tree[rt].ls,c) ;if (mid<r) update(l,r,tree[rt].rs,c) ;pushup(rt) ;}
}
int query(int l,int r,int rt){if (l<=tree[rt].l && tree[rt].r<=r) return tree[rt].sum ;int tot=(tree[rt].lazy*(min(r,tree[rt].r)-max(l,tree[rt].l)+1)%p)%p ;//初始值//int tot=node[cur].lazy*(min(node[cur].r,ri)-max(node[cur].l,li)+1)%p ;int mid=(tree[rt].l+tree[rt].r)>>1 ;if (l<=mid) tot=(tot+query(l,r,tree[rt].ls))%p ;if (mid<r)  tot=(tot+query(l,r,tree[rt].rs))%p ;return tot%p ;
}
inline int sum(int x,int y){int ans=0,fx=top[x],fy=top[y] ;while (fx!=fy){if (dep[fx]>=dep[fy]) {ans=(ans+query(dfn[fx],dfn[x],rt))%p ;x=f[fx],fx=top[x] ;}else {ans=(ans+query(dfn[fy],dfn[y],rt))%p ;y=f[fy],fy=top[y] ;}} if (dfn[x]<=dfn[y]) ans=(ans+query(dfn[x],dfn[y],rt))%p ;else ans=(ans+query(dfn[y],dfn[x],rt))%p ;return ans%p ;
}
inline void UPDATE(int x,int y,int c){int fx=top[x],fy=top[y];while(fx!=fy){if(dep[fx]>=dep[fy]){update(dfn[fx],dfn[x],rt,c) ;x=f[fx],fx=top[x];}else {update(dfn[fy],dfn[y],rt,c) ;y=f[fy],fy=top[y];}}if (dfn[x]<=dfn[y]) update(dfn[x],dfn[y],rt,c) ;else update(dfn[y],dfn[x],rt,c) ;
}
int main(){scanf("%d%d%d%d",&n,&m,&r,&p) ;for (int i=1;i<=n;i++) scanf("%d",&a[i]) ;for (int i=1;i<n;i++){int x,y ;scanf("%d%d",&x,&y) ;add(x,y);add(y,x) ;}cnt=0 ;dfs1(r,0,1) ;dfs2(r,r) ;cnt=0;rt=cnt++ ;build(1,n,rt);
//  cout<<"!!"<<endl ;//  for (int i=1;i<=n;i++)// printf("i=%d f[i]=%lld dep[i]=%d size[i]=%d son[i]=%d rk[i]=%d top[i]=%d dfn[i]=%d\n",i,f[i],dep[i],size[i],son[i],rk[i],top[i],dfn[i]) ;
//  for (int i=1;i<=cnt;i++){//      printf("%lld %lld %lld %lld %lld %lld\n",tree[i].l,tree[i].r,tree[i].ls,tree[i].rs,tree[i].lazy,tree[i].sum) ;
//  }for (int i=1;i<=m;i++){int x,y,z,op ;scanf("%d",&op);if (op==1){scanf("%d%d%d",&x,&y,&z) ;UPDATE(x,y,z) ; }else if (op==2){scanf("%d%d",&x,&y) ;printf("%d\n",sum(x,y)) ;}else if (op==3){scanf("%d%d",&x,&z) ;update(dfn[x],dfn[x]+size[x]-1,rt,z) ; }else{scanf("%d",&x) ;printf("%d\n",query(dfn[x],dfn[x]+size[x]-1,rt)) ;}}
}

提交上去,RE80.更加匪夷所思。把数据下下来,本地机测了一下,AC。????怀疑oj有bug,但是听说以前也有什么BZOJAC洛谷WA啦,RE啦等等的,还是去洛谷在线IDE评测一下,RE,还是Segmentation Fault,心想这种鬼畜的错误我也赶得上。

因为前面是WA80,没有RE,所以肯定与long long 有关。后来发现define写太后面了,写在 const int N = 100010 后面了, 可能挂,于是改了一下,依然RE。。。。

检查scanf,发现了问题:

光标这一处用了%d读入,

正好读入有不少op=4的,

就RE了

改完了就AC了,还是蛮喜悦的。

顺便发一波AC代码,。。。

#include <bits/stdc++.h>
using namespace std;
const int N = 100010 ;
#define int long long
struct edge{int to,next ;
}e[N<<1];
int head[N],f[N],dep[N],size[N],son[N],rk[N],top[N],dfn[N];
int a[N];
//f[i]:i的父亲,dep[i]:i的深度,size[i]:i的子树大小,son[i]:重儿子 ,rk[i]:i的dfs值,与dfn相反
//top[i]:i所在链的顶端,dfn[i]:dfs序,时间戳
int n,m,rt,tot,cnt;
int p,r ;
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 ;//改变重儿子 }return ;
}
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必然是它本身}return ;
}
struct seg{ //线段树 int ls,rs,lazy,l,r;int 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;return ;
}
void build(int ll,int rr,int rt){ //createif (ll==rr){tree[rt].l=tree[rt].r=ll ;tree[rt].sum=a[rk[ll]] ;return ;}else {int mid=(ll+rr)>>1;tree[rt].ls=cnt++ ;tree[rt].rs=cnt++ ;build(ll,mid,tree[rt].ls) ;build(mid+1,rr,tree[rt].rs) ;tree[rt].l=tree[tree[rt].ls].l ;tree[rt].r=tree[tree[rt].rs].r ;pushup(rt) ;}return ;
}
void update(int l,int r,int rt,int c){ //l~r +c if (l<=tree[rt].l && tree[rt].r<=r) {tree[rt].sum=(tree[rt].sum+c*(tree[rt].r-tree[rt].l+1))%p ;tree[rt].lazy=(tree[rt].lazy+c)%p ;}else {int mid=(tree[rt].l+tree[rt].r)>>1 ;if (l<=mid) update(l,r,tree[rt].ls,c) ;if (mid<r) update(l,r,tree[rt].rs,c) ;pushup(rt) ;}return ;
}
int query(int l,int r,int rt){if (l<=tree[rt].l && tree[rt].r<=r) return tree[rt].sum ;int tot=(tree[rt].lazy*(min(r,tree[rt].r)-max(l,tree[rt].l)+1)%p)%p ;//初始值int mid=(tree[rt].l+tree[rt].r)>>1 ;if (l<=mid) tot=(tot+query(l,r,tree[rt].ls))%p ;if (mid<r)  tot=(tot+query(l,r,tree[rt].rs))%p ;return tot%p ;
}
inline int sum(int x,int y){int ans=0;int fx=top[x],fy=top[y] ;while (fx!=fy){if (dep[fx]>=dep[fy]) {ans=(ans+query(dfn[fx],dfn[x],rt))%p ;x=f[fx],fx=top[x] ;}else {ans=(ans+query(dfn[fy],dfn[y],rt))%p ;y=f[fy],fy=top[y] ;}} if (dfn[x]<=dfn[y]) ans=(ans+query(dfn[x],dfn[y],rt))%p ;else ans=(ans+query(dfn[y],dfn[x],rt))%p ;return ans%p ;
}
inline void UPDATE(int x,int y,int c){int fx=top[x],fy=top[y];while(fx!=fy){if(dep[fx]>=dep[fy]){update(dfn[fx],dfn[x],rt,c) ;x=f[fx],fx=top[x];}else {update(dfn[fy],dfn[y],rt,c) ;y=f[fy],fy=top[y];}}if (dfn[x]<=dfn[y]) update(dfn[x],dfn[y],rt,c) ;else update(dfn[y],dfn[x],rt,c) ;return ;
}
main(){scanf("%lld%lld%lld%lld",&n,&m,&r,&p) ;for (int i=1;i<=n;i++) scanf("%lld",&a[i]) ;for (int i=1;i<n;i++){int x,y ;scanf("%lld%lld",&x,&y) ;add(x,y);add(y,x) ;}cnt=0 ;dfs1(r,0,1) ;dfs2(r,r) ;cnt=0;rt=cnt++ ;build(1,n,rt);for (int i=1;i<=m;i++){int x,y,op ;int z ;scanf("%lld",&op);if (op==1){scanf("%lld%lld%lld",&x,&y,&z) ;UPDATE(x,y,z) ; }else if (op==2){scanf("%lld%lld",&x,&y) ;printf("%lld\n",sum(x,y)) ;}else if (op==3){scanf("%lld%lld",&x,&z) ;update(dfn[x],dfn[x]+size[x]-1,rt,z) ; }else {scanf("%lld",&x) ;printf("%lld\n",query(dfn[x],dfn[x]+size[x]-1,rt)) ;}}
}

涨了经验,下次不要犯同样的教训!!!

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

  1. 刷题术语简称:OJ、AC、WA、TLE、OLE、MLE、RE、PE、CE分别代表的意思

    刷题术语简称:OJ.AC.WA.TLE.OLE.MLE.RE.PE.CE分别代表的意思 简称 英文全称 中文全称 OJ Online Judge 在线判题系统 AC Accepted 通过 WA Wr ...

  2. 洛谷 P3952时间复杂度 (本地AC测评RE的伪题解)

    [题目描述] 小明正在学习一种新的编程语言 A++,刚学会循环语句的他激动地写了好多程序并 给出了他自己算出的时间复杂度,可他的编程老师实在不想一个一个检查小明的程序, 于是你的机会来啦!下面请你编写 ...

  3. mysql数据库报错1146_数据库错误代码1146 - 本地与在线

    我是这个站点的新手 - 请温和请:P localhost上的mySQL数据库适用于插入语句,但只要将数据库连接更改为服务器连接它给了我错误:错误代码1146:1146没有任何错误描述.可能是什么原因? ...

  4. OJ术语: AC、WA、TLE、OLE、MLE、RE、PE、CE

    起因 看到一些术语不清楚是什么意思,上网查阅相关资料后,归纳如下. 汇总 简写 全称 中文称谓 OJ Online Judge 在线判题系统 AC Accepted 通过 WA Wrong Answe ...

  5. AC、WA、TLE、OLE、MLE、RE、PE、CE分别是什么意思?

    这都属于OJ题 即Online Judge 在线判题系统 根据你所提交的答案 进行判断 有以下几种结果: AC Accepted 通过 WA Wrong Answer 答案错误 TLE Time Li ...

  6. OJ术语表: AC、WA、TLE、OLE、MLE、RE、PE、CE

    在OJ(Online Judge)系统上刷题,你不能不知道下面这些术语: 缩写 英文解释 中文解释 OJ Online Judge 在线判题系统 AC Accepted 通过 WA Wrong Ans ...

  7. yum 仓库 本地和在线

    Centos7制作Yum仓库 (本地 在线) Yum 介绍:yum方式可以看做rpm方式的前端应用,可以自动解决rpm包的依赖关系 本地 yum 1.挂载系统光盘 mkdir /media/cdrom ...

  8. Android 使用本地应用在线播放流媒体文件

    如果你拿到了一个流媒体文件的下载地址,想实现在线播放,但又懒得自己写播放器,你可以通过如下方法调用本地应用来进行播放: Intent it = new Intent(); it.setAction(I ...

  9. CentOS配置yum源-本地和在线

    yum装包: 我们先搞清楚yum的内在逻辑,其实在liux中安装软件,相较于windows是十分简洁的.会有官方维护的镜像站收集存储近乎所有的软件,并将它们打包存储.而我们在配置时只需将获取软件包的路 ...

最新文章

  1. Pytorch使用tensorboardX可视化。超详细
  2. Linux内核中锁机制之完成量、互斥量
  3. linux视频教程之dhcp
  4. 数据库——关系数据库——交通违规处罚通知书
  5. 一不小心,我们办了场全球最 _____ 的技术大会......
  6. FreeRTOS 任务栈大小确定及其溢出检测
  7. ios 读取各种类型文件
  8. Unity3D之UGUI基础3:Image图片
  9. python按键退出循环_Python的for循环退出
  10. 利用matlab来进行路径规划,matlab路径规划系列
  11. 纬地道路纵断面设计教程_中铁城际总结公路设计应掌握的知识要领解答
  12. 微型计算机中NOP指令,PLC指令表
  13. 网络安全等级保护拓扑图大全
  14. 《带人要同频,管人要共情》读书笔记
  15. win7定时关机命令_WIN7系统还有用吗?怎么随时切换WIN7/10?
  16. 基于QT的科学计算器
  17. 01 数据库和MySQL简介
  18. 在openSUSE编译OpenFOAM
  19. 为什么计算机二级未来教育评分低,未来教育计算机Msoffice二级, PPT评分总是说文件不存在, 分数总是0分, 到底是为什么?...
  20. Codeforces869C The Intriguing Obsession

热门文章

  1. 10秒钟,chatgpt帮你生成简单贪吃蛇游戏
  2. 元旦快乐,感谢一路相伴!
  3. TinyOS操作系统介绍
  4. 今日份PS练习|圣诞元素海报
  5. Asp.net学习心得
  6. 中国碳中和产业“十四五”规划及投融资建议报告2022~2028年
  7. 18723 FBI树(存储建树思路)
  8. JDBC SSL连接SQL Server
  9. Objective-C中的nullable、__nullable、__Nullable
  10. RelativeSource 简述