传送门

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

在以\(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_isize_{to_i}(size_x-size_{to_i})$$

即$$\sum_{i(to_i在x子树里,to_i \neq x)} w_isize_xsize_{to_i}-w_i{size_{to_i}}^2$$$$size_x\sum_{i(to_i在x子树里,to_i \neq x)} w_isize_{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;
}

Wannafly挑战赛21 E 未来城市规划的更多相关文章

  1. Wannafly挑战赛21:C - 大水题

    链接:Wannafly挑战赛21:C - 大水题 题意: 现在给你N个正整数ai,每个数给出一“好数程度” gi(数值相同但位置不同的数之间可能有不同的好数程度).对于在 i 位置的数,如果有一在j位 ...

  2. Wannafly挑战赛21 C 大水题

    https://www.nowcoder.com/acm/contest/159/C dp #include <cstdio> #include <cstdlib> #incl ...

  3. Wannafly挑战赛21 机器人

    从前在月球上有一个机器人.月球可以看作一个 n*m 的网格图,每个格子有三种可能:空地,障碍,机器人(有且仅有一个),现在地面指挥中心想让机器人在月球上行走,每次可以发送一个指令,为 U-往上走.D- ...

  4. 牛客网 Wannafly挑战赛21 灯塔

    Z市是一座港口城市,来来往往的船只依靠灯塔指引方向.在海平面上,存在n个灯塔.每个灯塔可以照亮以它的中心点为中心的90°范围.特別地, 由于特殊限制,每个灯塔照亮范围的角的两条边必须要么与坐标轴平行要 ...

  5. 【Wannafly挑战赛4】F 线路规划 倍增+Kruskal+归并

    [Wannafly挑战赛4]F 线路规划 题目描述 Q国的监察院是一个神秘的组织.这个组织掌握了整个帝国的地下力量,监察着Q国的每一个人.监察院一共有N个成员,每一个成员都有且仅有1个直接上司,而他只 ...

  6. Wannafly挑战赛13 zzf的好矩阵 题解 答案解释

    Wannafly挑战赛13 zzf的好矩阵 题解 文章目录 Wannafly挑战赛13 zzf的好矩阵 题解 分析 结论1 结论2 结论3 C数组对应带子说明 空白长度论述 后续黑色长度论述 能&qu ...

  7. Wannafly挑战赛25游记

    Wannafly挑战赛25游记 A - 因子 题目大意: 令\(x=n!(n\le10^{12})\),给定一大于\(1\)的正整数\(p(p\le10000)\)求一个\(k\)使得\(p^k|x\ ...

  8. Wannafly挑战赛27

    Wannafly挑战赛27 我打的第一场$Wannafly$是第25场,$T2$竟然出了一个几何题?而且还把我好不容易升上绿的$Rating$又降回了蓝名...之后再不敢打$Wannafly$了. 由 ...

  9. Wannafly 挑战赛 19 参考题解

    这一次的 Wannafly 挑战赛题目是我出的,除了第一题,剩余的题目好像对大部分算法竞赛者来说好像都不是特别友好,但是个人感觉题目质量还是过得去的,下面是题目链接以及题解. [题目链接] Wanna ...

随机推荐

  1. ansible系列7-mysql_user模块

    添加mysql的用户和权限.密码 新增mysql用户zhang,设置登录密码zhang,给予权限zabbix.*:ALL ansible dba -m mysql_user -a 'login_hos ...

  2. BZOJ2141排队——树状数组套权值线段树(带修改的主席树)

    题目描述 排排坐,吃果果,生果甜嗦嗦,大家笑呵呵.你一个,我一个,大的分给你,小的留给我,吃完果果唱支歌,大家 乐和和.红星幼儿园的小朋友们排起了长长地队伍,准备吃果果.不过因为小朋友们的身高有所区别 ...

  3. BZOJ5372 PKUSC2018神仙的游戏(NTT)

    首先有一个想法,翻转串后直接卷积看有没有0匹配上1.但这是必要而不充分的因为在原串和翻转串中?不能同时取两个值. 先有一些结论: 如果s中长度为len的前缀是border,那么其存在|s|-len的循 ...

  4. Web Scraper爬取就是这么简单

    这应该是最全的一个文档了 https://www.jianshu.com/p/e4c1561a3ea7 所以我就不介绍了,大家直接看就可以了,有问题可以提出来,我会针对问题对文章进行补充~

  5. MVC 多语言

    最近项目需要用到多语言. 研究了一下,也参考了很多技术文章. 这里贴一下参考地址:http://www.cnblogs.com/unintersky/p/3969612.html 主要步骤我这里简述一 ...

  6. MT【4】坐标平移后齐次化

    简答:通过坐标平移可以将A点移到原点,设BC:mx’+ny’=1,联立坐标变换后的椭圆方程和BC,将$\frac{y}{x}$看成斜率k,得到关于k的一元二次方程,由题意两根之积为-1,可得.

  7. HNOI2018滚粗记

    day 0 最近发现机房的人都有些焦虑(除了一些神犇)自己也被影响地紧张起来 唉,不知道是不是一种好的心态,紧张是必然的... 随便打了点板子(\(FFT,SA,LCT\)) 很棒一个都没考 day ...

  8. [luogu3455][POI2007]ZAP-Queries【莫比乌斯反演】

    题目描述 FGD正在破解一段密码,他需要回答很多类似的问题:对于给定的整数a,b和d,有多少正整数对x,y,满足x<=a,y<=b,并且gcd(x,y)=d.作为FGD的同学,FGD希望得 ...

  9. Status: Checked in and viewable by authorized users 出现在sharepoint 2013 home 页面

    点击home页面上方的publish-> publishing->publish

  10. luogu1541 乌龟棋 (dp)

    dp..dp的时候不能设f[N][x1][x2][x3][x4],会T,要把N省略,然后通过1/2/3/4牌的数量来算已经走到哪一个了 #include<bits/stdc++.h> #d ...