题目

L 弟娃儿家里种了一棵苹果树,总共有 n n n 个结点,由 ( n − 1 ) \left(n-1\right) (n−1) 条边连接,每个结点上结有 a i a_i ai​ 个苹果,每个苹果都不相同。有一天他突发奇想,决定爬上去玩。他想在苹果树上找到一条环路,这样他就可以在这条环路上一直滑行,直到他父亲来喊他。然而众所周知,树上是没有环的,所以 L 弟娃儿的愿望根本无法实现,但 L 弟娃儿哪是一般人啊,他得知真相后十分愤怒,决定强行选择两个不同的苹果,在他们所属的结点上连上一条边,这样就会有环路了。L 弟娃儿于是得意的开始爬树,爬到某一个顶点后,他使用了他的神力,然而他发现,形成的这个环路并没有包含他当前所在的这个结点,他又没有更多的力气爬到另外一个环路上去了,于是他只好另外选择两个苹果,直到他自己所在的结点处在一个环路中。

L 弟娃儿觉得这样太累了,他想知道能使他当前所属结点被包含在环路中的选择苹果的方式有多少种,希望你能帮帮他。由于答案可能很大,你只需要输出答案对 998244353 998244353 998244353 取模的结果。(注意,选择的两个苹果是无序的)当然 L 弟娃儿家的苹果树也不是一般的苹果树,他在疯狂生长,同时 L 弟娃儿也在疯狂游走于树上,所以他会向你提出很多次问题。

数据范围

对于所有测试点,满足 1 ≤ n , m ≤ 5 × 1 0 5 1\le n,m\le5\times10^5 1≤n,m≤5×105, 0 ≤ a i , a < 998244353 0\le a_i,a<998244353 0≤ai​,a<998244353, 1 ≤ x , y ≤ n 1\le x,y\le n 1≤x,y≤n。

对于前 20 % 20\% 20% 的数据, n , m ≤ 1 0 3 n,m\le10^3 n,m≤103;

另有 20 % 20\% 20% 的数据, n , m ≤ 1 0 5 n,m\le10^5 n,m≤105;

另有 15 % 15\% 15% 的数据,苹果树是一个 1 1 1 结点为其中一个端点的链;

另有 15 % 15\% 15% 的数据,苹果树除 1 1 1 以外的所有结点与 1 1 1 结点相连。

题解

考虑用所有的苹果对的数量减去不合法的苹果对的数量。
即 n × ( n − 1 ) − ∑ j s i z [ j ] × ( s i z [ j ] − 1 ) 2 \frac {n \times (n-1) - \sum_{j} siz[j] \times (siz[j]-1)}{2} 2n×(n−1)−∑j​siz[j]×(siz[j]−1)​, 所以问题就转化为怎么动态维护各个子树的平方和。( s i z [ j ] × ( s i z [ j ] − 1 ) = s i z [ j ] 2 − s i z [ j ] siz[j] \times (siz[j]-1)=siz[j]^2-siz[j] siz[j]×(siz[j]−1)=siz[j]2−siz[j],而 s i z [ j ] siz[j] siz[j]的和可以随便维护 )。
所以考虑到树剖:
对于一个点,用树状数组直接求出他的重儿子的子树大小,然后轻儿子的子树我们暴力求:
就是维护一个点的轻儿子的子树大小的平方和。先初始化求出最开始的平方和。
然后对于一个修改操作,只需要往重链头跳,设修改的点 x x x 所在的重链头为 t o p [ x ] top[x] top[x],所以我们只需要修改 f a [ t o p [ x ] ] fa[top[x]] fa[top[x]] 的轻儿子子树大小平方和即可( f a [ t o p [ x ] ] fa[top[x]] fa[top[x]] 与 t o p [ x ] top[x] top[x] 之间是轻边 )。因为修改大小需要用到 s i z [ t o p [ x ] ] siz[top[x]] siz[top[x]],所以我们只需要同时修改重链头的 s i z siz siz 值即可,这样就能直接调用,不用在 l o g log log 树状数组查一遍 s i z siz siz 了。
于是便做完了。

代码

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=5e5+10;
const int P=998244353;
const ll Inv=499122177;
inline ll read(){ll k=0,f=1;char c;while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9')k=k*10+c-'0',c=getchar();return k*f;
}
int n,m,son[N],siz[N],a[N],l[N],r[N],tot_eula,f[N],top[N];
int tot,ver[N*2],fst[N],nxt[N*2];
ll siz_a[N],c[N],S,s_A[N];
inline void add(int x,int y){ver[++tot]=y;nxt[tot]=fst[x];fst[x]=tot;}
void dfs_1(int x,int fa){siz[x]=1;siz_a[x]=a[x];l[x]=++tot_eula;int k=0;for(int i=fst[x];i;i=nxt[i]){int y=ver[i];if(y==fa)continue;f[y]=x;dfs_1(y,x);siz_a[x]=(siz_a[x]+siz_a[y])%P;siz[x]+=siz[y];if(siz[y]>siz[k])k=y;}son[x]=k;r[x]=tot_eula;
}
inline int lowbit(int x){return x&(-x);}
inline void insert(int x,ll d){for(int i=x;i<=n;i+=lowbit(i))c[i]=(c[i]+d+P)%P;
}
inline ll ask(int x){ll s=0;for(int i=x;i;i-=lowbit(i))s=(s+c[i])%P;return s;
}
void dfs_2(int x,int fa){for(int i=fst[x];i;i=nxt[i]){int y=ver[i];if(y==fa)continue;if(son[x]==y)top[y]=top[x];else s_A[x]=(s_A[x]+siz_a[y]*siz_a[y]%P)%P;dfs_2(y,x);}
}
void prework(){for(int i=1;i<=n;++i)top[i]=i;f[1]=0;dfs_2(1,0);
}
int main(){n=read();m=read();for(int i=1;i<=n;++i)a[i]=read(),S=(S+a[i])%P;for(int i=1;i<n;++i){int x=read(),y=read();add(x,y);add(y,x);}dfs_1(1,0);for(int i=1;i<=n;++i)insert(l[i],a[i]);prework();while(m--){int op=read(),x=read();if(op==1){ll A=read();insert(l[x],A);a[x]=(a[x]+A+P)%P;S=(S+A+P)%P;while(x!=1&&x>0){int fx=f[top[x]];         if(fx)s_A[fx]=(s_A[fx]+P+P+P+2*A*siz_a[top[x]]%P+A*A%P)%P;siz_a[top[x]]=(A+siz_a[top[x]])%P;x=fx;}}else{ll S_=(ask(r[x])-ask(l[x]-1)+P)%P,s_=0;if(son[x])s_=(ask(r[son[x]])-ask(l[son[x]]-1)+P)%P;s_=s_*s_%P;ll sum_A=(S*(S-1+P)%P-(s_A[x]+s_-(S_-a[x]+P)%P+(S-S_)*(S-S_-1+P)%P+P+P)%P+P+P)%P;printf("%lld\n",sum_A*Inv%P);}}return 0;
}

DTOJ #5328 找苹果相关推荐

  1. 苹果6可以分屏吗_可以找苹果企业签名中间商做苹果企业签名吗?

    苹果企业签名作为目前ios App最主要的内测方式,深受广大开发者的青睐.但是做苹果企业签名是需要企业开发者账号生成的开发证书,而现在的开发证书价格比较昂贵,所以现在一般都是选择签名服务商来进行签名. ...

  2. 苹果自己出钱给第三方App投广告,开发者却不乐意了

    梦晨 发自 凹非寺 量子位 报道 | 公众号 QbitAI 苹果悄悄给一些第三方App买了谷歌搜索广告,苹果自己出钱. 这是怎么回事,做慈善吗? 没想到,应用开发商们却不吃这一套,纷纷表示不乐意. 受 ...

  3. tableau使用需要收费吗_使用苹果手机时,这些需要注意的点,你都知道吗?

    大家在使用苹果手机时,想必很多苹果手机都会有一些关于系统和Apple等账号上不明白的点.正如许多用户都会纠结于,要不要升级iOS系统的问题:或者是自己的Apple ID 有什么作用呢?综合iOS系统自 ...

  4. 2017年苹果公司开发者账号申请-公司邓白氏编码

    申请公司的苹果开发者账号和企业级的苹果开发者账号时,都会用到邓白氏编码,也就是我们申请苹果开发者账号时需要填写的D-U-N-S Number. 申请这个邓白氏编码是免费的,但是从像华夏邓白氏公司提交申 ...

  5. “无语!只因姓True,苹果封了我的iCloud账户”

    作者 | Carol 出品 | CSDN(ID:CSDNnews) 试想一下,如果你在某个网站上注册账户,输入名字之后,整个账户都被锁定了,你会是什么感觉? 你可能会觉得:这辈子都没有这么无语过. R ...

  6. 如何通过手机设置苹果账户的双重认证

    现在苹果付费的研发者账号都要开启双重认证.少部分研发者账号没有推送强制开启双重认证通知可能苹果还没有监控到你.若付费的研发者账号被强制安全认真,你登录账号会看到红色的感叹号警告,并且不能下载或生成证书 ...

  7. 艾永亮:苹果缺乏创新能力?打造超级产品是未来增长的关键

    2008年2月19号,乔布斯发布了当时最薄的笔记本--MacBook Air时,让当时的人们为这"小玩意儿"感到惊奇. MacBook的出现重新定义了笔记本电脑,时至今日,我们会发 ...

  8. FBI如何费尽心力破解了苹果,以及,iOS系统究竟有多安全? | 硬创公开课

    分享嘉宾:李嵩Song,西雅图Newsky Security公司联合创始人兼CTO,先后毕业于上海交通大学,西雅图华盛顿大学(University of Washington),专注移动和物联网安全. ...

  9. 苹果开发者账号申请及升级更换

    苹果开发者账号99美元和299美元的完全是独立的账号,即:99美元的不可以用同一账号升级为299美元,必须重新申请一个apple ID 但是邓白氏码可以一样,299美元也不可以同一账号直接降级为99美 ...

最新文章

  1. 东方日升重磅推出白色双玻组件 助力推动度电成本下滑
  2. 微软nni_实践空间站 | 为微软官方开源项目贡献代码,你准备好了吗?
  3. signature=6e39b7285090b9748e35514dc5472d29,PXE常见错误代码表
  4. Hibernate主键生成种类
  5. 《LeetCode力扣练习》第121题 买卖股票的最佳时机 Java
  6. Ubuntu Wifipumpkin3 WiFi钓鱼工具,应该适用于绝大多数的Debian系的linux 发行版
  7. TensorFlow2.0(五)--Keras构建Wide Deep模型
  8. CSDN插件限时内测,新用户抢永久免费去广告特权
  9. OC-NSFileManager
  10. Javascript第四章函数function也是数据类型第六课
  11. python变量的作用_Python中的变量
  12. carrot2 Workbench org.apache.http.client.HttpResponseException: Not Found 以及其他类找不到错误的解决办法
  13. 【Python成长之路】共享平台
  14. E盾网络验证企业版个人版离线版对接好的自绘界面4加密防破解易语言源码加密
  15. 大白菜pe 通用pe 安装心得
  16. 几个冷门linux与BSD发行版中文学习论坛
  17. Java 8 effectively final
  18. 【转载】HBase基本概念和hbase shell常用命令用法
  19. 英语国际音标之元音发音技巧
  20. 【BZOJ5405】platform(二分,SA,线段树)

热门文章

  1. Linux中解决root@bogon问题
  2. 网络层 路由器工作原理
  3. java里的final
  4. 阿里巴巴API开发系列:transaction_history-阿里巴巴交易历史 API 返回值说明
  5. IaaS初级阶段:热闹但竞争并不激烈
  6. 段地址和偏移地址是什么
  7. 计算机组成原理学习笔记第4章 4.12——虚拟存储器
  8. c语言结构体结构体变量名,C语言结构体及结构体变量
  9. 如何用c语言结构体建立data,C语言结构体使用
  10. Unity3d接入安卓aar详细过程