Wannafly挑战赛21 E 未来城市规划
传送门
题目中给的信息很难直接维护,但是可以考虑一条边对答案的贡献
在以\(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 未来城市规划相关推荐
- Wannafly挑战赛21: C. 大水题(DP)
题目描述 现在给你N个正整数ai,每个数给出一"好数程度" gi(数值相同但位置不同的数之间可能有不同的好数程度).对于在 i 位置的数,如果有一在j位置的数满足 j < i ...
- Wannafly挑战赛21 - B灯塔
链接:https://www.nowcoder.com/acm/contest/159/B 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其他语言262 ...
- Wannafly挑战赛22游记
Wannafly挑战赛22游记 幸运的人都是相似的,不幸的人各有各的不幸. --题记 A-计数器 题目大意: 有一个计数器,计数器的初始值为\(0\),每次操作你可以把计数器的值加上\(a_1,a_2 ...
- [Wannafly挑战赛2D-Delete]最短路
[Wannafly挑战赛2D-Delete]最短路 题目描述 给定一张 n 个点,m 条边的带权有向无环图,同时给定起点 S 和终点 T ,一共有 q 个询问,每次询问删掉某个点和所有与它相连的边之后 ...
- Wannafly挑战赛19
Wannafly挑战赛19 A. 队列Q 需要支持把一个元素移到队首,把一个元素移到队尾,移到队首就直接放到队首前面那个位置,原位置标为0,队尾同理. #include <bits/stdc++ ...
- Wannafly挑战赛18
Wannafly挑战赛18 A. 序列 先考虑暴力,相邻两个树之间乘上给定的三种数,递推出下一个位置填什么,然后再check一下,最后一位是否为1即可.这样时间显然不行,但是给我们一种思路,就是中间的 ...
- Wannafly 挑战赛27 题解
Wannafly 挑战赛27 题目连接 https://www.nowcoder.com/acm/contest/215#question A.灰魔法师 题目 题解 考虑到可能的完全平方数只有4004 ...
- Wannafly挑战赛24
Wannafly挑战赛24 题目连接 https://www.nowcoder.com/acm/contest/186#question A.石子游戏 题解 注意到当石子个数为偶数的时候,每回合都会减 ...
- Wannafly挑战赛18B 随机数
Wannafly挑战赛18B 随机数 设\(f_i\)表示生成\(i\)个数有奇数个1的概率. 那么显而易见的递推式:\(f_i=p(1-f_{i-1})+(1-p)f_{i-1}=(1-2p)f_{ ...
最新文章
- PgSQL · 特性分析 · full page write 机制
- 在windows下将Tomcat设置为自动启动的服务
- SlidingMenu实现侧滑
- docker安装gamit_Gamit-Globk完整安装攻略
- lasso特征选择python_转:结合Scikit-learn介绍几种常用的特征选择方法-2
- java minor gc_Java Minor发布计划再次进行了调整
- python代码实例sicket_Python socket聊天脚本代码实例
- 如何访问docker内php,如何进入docker容器
- Codeforces Round #544 (Div. 3) A.Middle of the Contest
- SQLSERVER到底能识别多少个逻辑CPU?
- 蓝桥杯2020年第十一届C/C++国赛B组第二题-扩散
- FISCO BCOS Solidity 智能合约 return string[] This type is only supported in the new experimental ABI
- win10系统安装eplan2.7加密狗驱动蓝屏问题解决
- 线光谱共焦传感器—专注于3D视觉检测
- Ambisonics声音格式及麦克
- 解决 Windows XP 桌面图标阴影的情况
- 跳入餐饮新消费水池,腾讯、字节、B站能否“如鱼得水”?
- Python生物信息学数据管理——第5、6章课后习题
- 实现 flatten 扁平化对象和数组
- python c++情侣网名是什么意思_“果然,他用的是情侣网名!”
热门文章
- postgresql创建只读账号
- Ubuntu 16.04重启输入法
- VMware下centos7安装VMware Tools
- Socket通信原理探讨(C++为例)
- 【转】Asp.net控件开发学习笔记整理篇 - Asp.net客户端状态管理
- VMware排错:Number of virtual devices exceeds the maximum for a given controller
- DynamicPopulate
- 虚方法、重写方法和抽象方法[转载]
- python moviepy 特效编辑
- 手机归属地和ip定位