【WC2017四校联考2】看门狗 题解
来源:互联网 发布:python编程 中文 pdf 编辑:程序博客网 时间:2024/06/16 03:13
题目出自philipsweng
题目大意
首先的思路
第一种打法
第二种打法
优化
代码
#include<cstdio>#include<cstring>#include<algorithm>#define fo(i,a,b) for(int i=a;i<=b;i++)using namespace std;typedef long long LL;const int maxn=1e6+5;const LL mo=998244353;int n,l[maxn],r[maxn];int tot,go[maxn],next[maxn],f1[maxn];LL val[maxn];void ins(int x,int y,LL z){ go[++tot]=y; val[tot]=z; next[tot]=f1[x]; f1[x]=tot;}int deep[maxn],size[maxn],Hson[maxn],maxr;LL a[maxn];void dfs_size(int k,int last,LL s) //这里的size是以深度为标准的{ size[k]=deep[k]=deep[last]+1; maxr=max(maxr,deep[k]); a[k]=s; for(int p=f1[k]; p; p=next[p]) { dfs_size(go[p],k,s+val[p]); size[k]=max(size[k],size[go[p]]); if (size[go[p]]>size[Hson[k]]) Hson[k]=go[p]; }}LL tr[4*maxn];bool bz[4*maxn];void update(int k,int t){ if (bz[k]==0) return; tr[t]=tr[t+1]=-1; bz[t]=bz[t+1]=1; bz[k]=0;}void tr_xg(int k,int l,int r,int x,LL z){ if (l==r) { tr[k]=max(tr[k],z); return; } int t=k<<1, t1=(l+r)>>1; update(k,t); if (x<=t1) tr_xg(t,l,t1,x,z); else tr_xg(t+1,t1+1,r,x,z); tr[k]=max(tr[t],tr[t+1]);}LL tr_cx(int k,int l,int r,int x,int y){ if (x>y) return -1; if (l==x && r==y) return tr[k]; int t=k<<1, t1=(l+r)>>1; update(k,t); if (y<=t1) return tr_cx(t,l,t1,x,y); else if (x>t1) return tr_cx(t+1,t1+1,r,x,y); else return max(tr_cx(t,l,t1,x,t1), tr_cx(t+1,t1+1,r,t1+1,y));}LL ans;LL mi(LL x,LL y){ LL re=1; for(; y; y>>=1, x=x*x%mo) if (y&1) re=re*x%mo; return re;}LL sum,nowbh[maxn],depmax[maxn]; //为了不至于每次都清空depmax,于是用时间标记。void dfs1(int k){ depmax[deep[k]]=(nowbh[deep[k]]<sum) ?a[k] :max(depmax[deep[k]],a[k]) ; nowbh[deep[k]]=sum; for(int p=f1[k]; p; p=next[p]) dfs1(go[p]);}void dfs(int k){ for(int p=f1[k]; p; p=next[p]) if (go[p]!=Hson[k]) { dfs(go[p]); bz[1]=1; } if (Hson[k]) { dfs(Hson[k]); LL ans1=-1; LL t=tr_cx(1,1,maxr,l[k]+deep[k],min(r[k]+deep[k],maxr)); if (t>-1) ans1=t-a[k]; tr_xg(1,1,maxr,deep[k],a[k]); for(int p=f1[k]; p; p=next[p]) if (go[p]!=Hson[k]) { ++sum; dfs1(go[p]); fo(i,deep[go[p]],size[go[p]]) { LL t=tr_cx(1,1,maxr,max(1,l[k]+2*deep[k]-i),min(r[k]+2*deep[k]-i,maxr)); if (t>-1) ans1=max(ans1,depmax[i]+t-a[k]*2); } fo(i,deep[go[p]],size[go[p]]) tr_xg(1,1,maxr,i,depmax[i]); } ans1%=mo; ans=(ans+mi(23333,n-k)*ans1%mo+mo)%mo; } else { tr_xg(1,1,maxr,deep[k],a[k]); ans=(ans-mi(23333,n-k)%mo+mo)%mo; }}int main(){ scanf("%d",&n); fo(i,1,n) scanf("%d %d",&l[i],&r[i]); fo(i,2,n) { int u; LL c; scanf("%d %lld",&u,&c); ins(u,i,c); } dfs_size(1,0,0); memset(tr,255,sizeof(tr)); memset(bz,255,sizeof(bz)); dfs(1); printf("%lld\n",ans);}
0 0
- 【WC2017四校联考2】看门狗 题解
- 【WC2017四校联考3】优美的树 题解
- 【WC2017四校联考5】B君的宴请 题解
- 五校联考四总结
- 【五校联考四】总结
- 五校联考四总结
- WC四校联考总结
- 久违的题解 多校联考
- WC2017
- WC2017
- {题解}[jzoj3853]【NOIP2014八校联考第2场第2试9.28】帮助Bsny(help)
- 12.20成都联考题解
- BSOJ3800 -- 【四校联考1】染色 贪心
- 【C】题解 (五校联考3day2)
- 【宝藏】题解(五校联考3day1)
- 【NOIP2013模拟联考2】三角阵(tri) 题解
- WC2017模拟1、2总结
- NOIP四校联考前4场总结及反思
- 欢迎使用CSDN-markdown编辑器
- 网络笔记2
- No layout manager attached; skipping layout
- 华为机试在线训练-牛客网(9)求int整数在内存中1的个数
- postgresql 从json数组中提取json值,并分组,汇总
- 【WC2017四校联考2】看门狗 题解
- 如何写好一份产品需求文档
- CSS布局模型
- 海康摄像头第一次RTSP成功
- Android头像--拍照上传
- [转]透视矩阵
- 嵌入式Linux学习:u-boot源码分析(2)--AM335X系列的2014.10版
- PyhonSocket
- java学习-javaAPI(2017/1/24)