传送门

题目中给的信息很难直接维护,但是可以考虑一条边对答案的贡献

在以\(x\)为根的子树里,如果一条边\(i\)的权值为\(w_i\),这条边深度更深的端点为\(to_i\),那么这条边对这个子树的贡献为\(w_i*size_x*(size_x-size_{to_i})\),也就是这条边会被计算边两端点个数之积次

那么一个子树的答案就是\[\sum_{i(to_i在x子树里,to_i \neq x)} w_i*size_{to_i}*(size_x-size_{to_i})\]

即\[\sum_{i(to_i在x子树里,to_i \neq x)} w_i*size_x*size_{to_i}-w_i*{size_{to_i}}^2\]\[size_x*\sum_{i(to_i在x子树里,to_i \neq x)} w_i*size_{to_i}-w_i*{size_{to_i}}^2\]

然后把边权\(w_i\)保存在\(to_i\)上,维护\(w_i*size_{to_i}\)和\(w_i*{size_{to_i}}^2\)就是个板子题了

#include<bits/stdc++.h>
#define LL long long
#define il inline
#define re register
#define db double
#define eps (1e-7)using namespace std;
const int N=70000+10,M=50000+10,mod=2019;
il LL rd()
{re LL x=0,w=1;re char ch=0;while(ch<'0'||ch>'9') {if(ch=='-') w=-1;ch=getchar();}while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}return x*w;
}
il int max(int a,int b){return a>b?a:b;}
il int min(int a,int b){return a<b?a:b;}
int s1[N<<2],s2[N<<2],z1[N<<2],z2[N<<2],s[N<<2],lz[N<<2];#define lc (o<<1)
#define rc ((o<<1)|1)
#define mid ((l+r)>>1)
il void psup(int o){s1[o]=(s1[lc]+s1[rc])%mod,s2[o]=(s2[lc]+s2[rc])%mod;}
il void psdn(int o)
{if(lz[o]){s1[lc]=(s1[lc]+z1[lc]*lz[o]%mod)%mod,s2[lc]=(s2[lc]+z2[lc]*lz[o]%mod)%mod,lz[lc]=(lz[lc]+lz[o])%mod;s1[rc]=(s1[rc]+z1[rc]*lz[o]%mod)%mod,s2[rc]=(s2[rc]+z2[rc]*lz[o]%mod)%mod,lz[rc]=(lz[rc]+lz[o])%mod;lz[o]=0;}
}
void modif(int o,int l,int r,int ll,int rr,int x)
{if(ll<=l&&r<=rr){s1[o]=(s1[o]+z1[o]*x%mod)%mod,s2[o]=(s2[o]+z2[o]*x%mod)%mod,lz[o]=(lz[o]+x)%mod;psdn(o);return;}psdn(o);if(ll<=mid) modif(lc,l,mid,ll,rr,x);if(rr>mid) modif(rc,mid+1,r,ll,rr,x);psup(o);
}
int quer1(int o,int l,int r,int ll,int rr)
{if(ll<=l&&r<=rr) return s1[o];psdn(o);int an=0;if(ll<=mid) an+=quer1(lc,l,mid,ll,rr);if(rr>mid) an+=quer1(rc,mid+1,r,ll,rr);psup(o);return an%mod;
}
int quer2(int o,int l,int r,int ll,int rr)
{if(ll<=l&&r<=rr) return s2[o];//psdn(o);int an=0;if(ll<=mid) an+=quer2(lc,l,mid,ll,rr);if(rr>mid) an+=quer2(rc,mid+1,r,ll,rr);//psup(o);return an%mod;
}
int to[M<<1],nt[M<<1],w[M<<1],hd[N],tot=1;
il void add(int x,int y,int z)
{++tot,to[tot]=y,nt[tot]=hd[x],w[tot]=z,hd[x]=tot;
}
int sz[M],son[M],de[M],fa[M],top[M],id[M],a[M],b[M],ti;
void dfs1(int x)
{sz[x]=1;for(int i=hd[x];i;i=nt[i]){int y=to[i];//if(y==fa[x]) continue;/*fa[y]=x,*/de[y]=de[x]+1;dfs1(y);sz[x]+=sz[y];if(sz[y]>sz[son[x]]) son[x]=y;}
}
void dfs2(int x)
{id[x]=++ti,b[ti]=x;if(son[x]) top[son[x]]=top[x],dfs2(son[x]);for(int i=hd[x];i;i=nt[i]){int y=to[i];if(/*y==fa[x]||*/y==son[x]) continue;top[y]=y;dfs2(y);}
}
void bui(int o,int l,int r)
{if(l==r) {z1[o]=sz[b[l]]%mod,z2[o]=(z1[o]*z1[o])%mod,s1[o]=a[b[l]]*z1[o]%mod,s2[o]=a[b[l]]*z2[o]%mod;return;}bui(lc,l,mid),bui(rc,mid+1,r);psup(o);z1[o]=(z1[lc]+z1[rc])%mod,z2[o]=(z2[lc]+z2[rc])%mod;
}
int n,q,x,y,z;
char cc[4];int main()
{n=rd(),q=rd();for(int i=2;i<=n;i++){fa[i]=rd(),a[i]=rd()%mod;add(fa[i],i,a[i]);}dfs1(1),top[1]=1,dfs2(1);bui(1,1,n);while(q--){scanf("%s",cc);if(cc[0]=='I'){x=rd(),y=rd(),z=rd()%mod;while(top[x]!=top[y]){if(de[top[x]]<de[top[y]]) swap(x,y);modif(1,1,n,id[top[x]],id[x],z);x=fa[top[x]];}if(de[x]>de[y]) swap(x,y);if(x!=y) modif(1,1,n,id[x]+1,id[y],z);}else{x=rd();if(sz[x]==1) puts("0"); else printf("%d\n",((sz[x]%mod*quer1(1,1,n,id[x]+1,id[x]+sz[x]-1))%mod-quer2(1,1,n,id[x]+1,id[x]+sz[x]-1)+mod)%mod);}}return 0;
}

转载于:https://www.cnblogs.com/smyjr/p/9723672.html

Wannafly挑战赛21 E 未来城市规划相关推荐

  1. Wannafly挑战赛21: C. 大水题(DP)

    题目描述 现在给你N个正整数ai,每个数给出一"好数程度" gi(数值相同但位置不同的数之间可能有不同的好数程度).对于在 i 位置的数,如果有一在j位置的数满足 j < i ...

  2. Wannafly挑战赛21 - B灯塔

    链接:https://www.nowcoder.com/acm/contest/159/B 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其他语言262 ...

  3. Wannafly挑战赛22游记

    Wannafly挑战赛22游记 幸运的人都是相似的,不幸的人各有各的不幸. --题记 A-计数器 题目大意: 有一个计数器,计数器的初始值为\(0\),每次操作你可以把计数器的值加上\(a_1,a_2 ...

  4. [Wannafly挑战赛2D-Delete]最短路

    [Wannafly挑战赛2D-Delete]最短路 题目描述 给定一张 n 个点,m 条边的带权有向无环图,同时给定起点 S 和终点 T ,一共有 q 个询问,每次询问删掉某个点和所有与它相连的边之后 ...

  5. Wannafly挑战赛19

    Wannafly挑战赛19 A. 队列Q 需要支持把一个元素移到队首,把一个元素移到队尾,移到队首就直接放到队首前面那个位置,原位置标为0,队尾同理. #include <bits/stdc++ ...

  6. Wannafly挑战赛18

    Wannafly挑战赛18 A. 序列 先考虑暴力,相邻两个树之间乘上给定的三种数,递推出下一个位置填什么,然后再check一下,最后一位是否为1即可.这样时间显然不行,但是给我们一种思路,就是中间的 ...

  7. Wannafly 挑战赛27 题解

    Wannafly 挑战赛27 题目连接 https://www.nowcoder.com/acm/contest/215#question A.灰魔法师 题目 题解 考虑到可能的完全平方数只有4004 ...

  8. Wannafly挑战赛24

    Wannafly挑战赛24 题目连接 https://www.nowcoder.com/acm/contest/186#question A.石子游戏 题解 注意到当石子个数为偶数的时候,每回合都会减 ...

  9. Wannafly挑战赛18B 随机数

    Wannafly挑战赛18B 随机数 设\(f_i\)表示生成\(i\)个数有奇数个1的概率. 那么显而易见的递推式:\(f_i=p(1-f_{i-1})+(1-p)f_{i-1}=(1-2p)f_{ ...

最新文章

  1. PgSQL · 特性分析 · full page write 机制
  2. 在windows下将Tomcat设置为自动启动的服务
  3. SlidingMenu实现侧滑
  4. docker安装gamit_Gamit-Globk完整安装攻略
  5. lasso特征选择python_转:结合Scikit-learn介绍几种常用的特征选择方法-2
  6. java minor gc_Java Minor发布计划再次进行了调整
  7. python代码实例sicket_Python socket聊天脚本代码实例
  8. 如何访问docker内php,如何进入docker容器
  9. Codeforces Round #544 (Div. 3) A.Middle of the Contest
  10. SQLSERVER到底能识别多少个逻辑CPU?
  11. 蓝桥杯2020年第十一届C/C++国赛B组第二题-扩散
  12. FISCO BCOS Solidity 智能合约 return string[] This type is only supported in the new experimental ABI
  13. win10系统安装eplan2.7加密狗驱动蓝屏问题解决
  14. 线光谱共焦传感器—专注于3D视觉检测
  15. Ambisonics声音格式及麦克
  16. 解决 Windows XP 桌面图标阴影的情况
  17. 跳入餐饮新消费水池,腾讯、字节、B站能否“如鱼得水”?
  18. Python生物信息学数据管理——第5、6章课后习题
  19. 实现 flatten 扁平化对象和数组
  20. python c++情侣网名是什么意思_“果然,他用的是情侣网名!”

热门文章

  1. postgresql创建只读账号
  2. Ubuntu 16.04重启输入法
  3. VMware下centos7安装VMware Tools
  4. Socket通信原理探讨(C++为例)
  5. 【转】Asp.net控件开发学习笔记整理篇 - Asp.net客户端状态管理
  6. VMware排错:Number of virtual devices exceeds the maximum for a given controller
  7. DynamicPopulate
  8. 虚方法、重写方法和抽象方法[转载]
  9. python moviepy 特效编辑
  10. 手机归属地和ip定位