爱之箭发射(las)

目描述

小海是弓道部的成员,非常擅长射箭(Love Arrow Shoot)。今天弓道部的练习是要射一棵树。一棵树是一个nn个点n−1n−1条边的无向图,且这棵树的第ii个点有一个值wiwi,wi∈[1,m]wi∈[1,m]。每一次小海会射中树的一条边,并将这条边移除。此外,小海定义一棵树的las值为∑vi∗i∑vi∗i,vivi为这棵树中第ii小的wiwi。现在小海会告诉你她射中的边的顺序,你需要回答每一次她射中的边所在的树的las值,之后被射中的边会被移除。答案mod998244353mod998244353

输入

第一行两个数n,mn,m

第二行nn个数wiwi

接下来n−1n−1行每行两个数ai,biai,bi,表示初始的树第ii条边连接aiai和bibi。

接下来n−1n−1行每行一个数表示射中的边。

输出

n-1行每行一个数表示射中的边的树的las值

样例输入

5 4396
2 3 1 4 5
1 2
1 3
2 4
2 5
4
1
2
3

样例输出

55
30
5
11

提示

数据范围

前20% n<=1e3

另外20% m<=10

另外20% 保证第i条边连接i和i+1

另外20% n<=1e5

100% n<=5e5 wi<=m<=1e4

下发一个样例满足第一个部分分。

来源

noip2018模拟-robinliu


solution

把操作倒过来,看成加边。

对于每个连通块可以用一棵值域线段树维护每个值出现的次数,值的和,还有la值。

合并时,新的la值可以由值的和*之前的值出现的次数得到。

比如 1*1+2*2+3*3  +2*(1+2+3) -> 3*1+4*2+5*3

线段树合并维护即可

注意x,y均没有左右儿子的特殊情况

#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#define maxn 500005
#define mod 998244353
#define ll long long
using namespace std;
int n,m,st[maxn],ed[maxn],w[maxn],id[maxn];
int fa[maxn],root[maxn*18],tot;
int ls[maxn*18],rs[maxn*18],num[maxn*18];
ll ans[maxn],sum[maxn*18],s[maxn*18];
void build(int &k,int l,int r,int pl){if(!k)k=++tot;if(l==r){num[k]=1;sum[k]=s[k]=pl;return;}int mid=l+r>>1;if(pl<=mid)build(ls[k],l,mid,pl);else build(rs[k],mid+1,r,pl);num[k]=num[ls[k]]+num[rs[k]];sum[k]=sum[ls[k]]+sum[rs[k]];s[k]=s[ls[k]]+s[rs[k]];
}
int getf(int k){if(fa[k]==k)return k;fa[k]=getf(fa[k]);return fa[k];
}
int merge(int x,int y,int la){if(!x||!y){return x+y;}ls[x]=merge(ls[x],ls[y],la);rs[x]=merge(rs[x],rs[y],la+num[ls[x]]);//printf("x:%d y:%d sumx:%d sumy:%d la:%d\n ls:%d  %d  %d rs:%d %d %d\n",x,y,sum[x],sum[y],la,sum[ls[x]],num[ls[x]],s[ls[x]],sum[rs[x]],num[rs[x]],s[rs[x]]);if(!ls[x]&&!rs[x]){sum[x]=sum[x]+sum[y]+(num[x]*s[y])%mod;sum[x]%=mod;num[x]=num[x]+num[y];s[x]=s[x]+s[y];return x;}sum[x]=sum[ls[x]]+sum[rs[x]]+(num[ls[x]]*s[rs[x]])%mod;sum[x]%=mod;num[x]=num[ls[x]]+num[rs[x]];s[x]=s[ls[x]]+s[rs[x]];//cout<<sum[x]<<' '<<num[x]<<endl;return x;
}
int main(){cin>>n>>m;for(int i=1;i<=n;i++){scanf("%d",&w[i]);fa[i]=i;build(root[i],1,m,w[i]);}for(int i=1;i<n;i++){scanf("%d%d",&st[i],&ed[i]);}for(int i=1;i<n;i++)scanf("%d",&id[i]);for(int i=n-1;i>=1;i--){int x=getf(st[id[i]]),y=getf(ed[id[i]]);//cout<<"---------\n";//cout<<x<<' '<<y<<endl;root[x]=merge(root[x],root[y],0);ans[i]=sum[root[x]];fa[y]=x;}for(int i=1;i<n;i++)printf("%lld\n",ans[i]);return 0;
}
/*
5 5
2 2 1 4 5
1 2
1 3
2 4
2 5
4
1
2
3
*/

转载于:https://www.cnblogs.com/liankewei/p/10358822.html

爱之箭发射(las)相关推荐

  1. 【修真院“善良”系列之十七】请拿好这支时间之箭

    这里是修真院前端小课堂,本篇分析的主题是 [请拿好这支时间之箭] 适用读者:3年以下的后端开发者 文章目录: 1.为什么要做性能优化 2.性能优化之前,先定位问题 3.Nginx和Tomcat 4.C ...

  2. 从发起请求到收到响应,各个阶段的时间损耗是怎么样的?

    适用读者:3年以下的后端开发者 文章目录: 1.为什么要做性能优化 2.性能优化之前,先定位问题 3.Nginx和Tomcat 4.Controller和Service又做了什么 5.Memcache ...

  3. Android自定义Drawable第十四式之百步穿杨

    前言 Emmmm,看标题大概就能猜到,这次我们要做的是一个射箭的效果. 在这篇文章中,同学们可以学到: 在自定义Drawable里流畅地draw各种动画: 画一条粗细不一的线段: 一个炫酷的射箭效果: ...

  4. 星际2中复刻DOTA白虎

    2012年6月7日 19:31 星际2的编辑器相对于魔兽3最大的改进就是数据编辑器了, 也正是这个改变, 让很多有兴趣自制地图的人放弃了这个想法. 为什么呢? 因为它太复杂了, 而且资料很少, 所以上 ...

  5. [转] 当猫爱上蝴蝶

    这只高傲的猫走过美丽的花丛,他没有爱上任何一朵鲜花,他爱上了一只紫色的蝴蝶.       鲜花们向猫展示着美丽,猫却对着蝴蝶说:"我爱你"     蝴蝶用她紫色的微笑说:" ...

  6. 引用 当鱼爱上了白蝴蝶

            一段凄美的爱情,那么我们需奥的是什么,你会如何选择??? 引用 蓝色冰点 的 当鱼爱上了白蝴蝶 鱼在海里快乐地游着.当它把头露出水面时,爱上了一只偶然经过这里的白蝴蝶. "我 ...

  7. Unity3D 从入门到放弃(五)----射箭游戏

    Unity3D 从入门到放弃(五) --射箭游戏 填坑啊填坑,每周都补上周作业,啥时候才能到头啊= = 作业需求 游戏规则: 设计一个射箭小游戏,点击鼠标射箭:  靶对象为 5 环,按环计分:  ...

  8. 程序员小哥为赢过老婆打造自动瞄准弓,闭眼也能百发百中

    丰色 梦晨 发自 凹非寺 量子位 报道 | 公众号 QbitAI 油管上一位小哥最近有个烦恼:老婆射箭技术太好,我很菜又想赢怎么办? 苦练6个月.6年?No No No,不如花时间做一个自动瞄准的弓箭 ...

  9. python项目之守卫家园

    守卫家园 游戏说明 "守卫家园"是一种二维战斗类计算机游戏,游戏场景中有四个圆形城堡,是玩家要守卫的家园,垂直均匀分布在画布的左侧,位置固定.有一名战士,游戏开始时位于画布左侧中间 ...

最新文章

  1. python中scale的用法_Python Decimal scaleb()用法及代码示例
  2. 转行学python后悔了-你是多少岁转行的?转行后你后悔了吗?
  3. PHP 的 Phar 包原来性能这么强!
  4. 使用命令行建立Zend Framework项目
  5. 案例:演示exception对象的使用
  6. Centos7等保三级检查命令
  7. WIN7下运行hadoop程序报:Failed to locate the winutils binary in the hadoop binary path
  8. 只有得到祝福才是好婚姻
  9. MongoDB副本集学习(三):性能和优化相关
  10. postfix 配置
  11. docker 部署Java项目
  12. EyouCms1.0前台GetShell漏洞复现
  13. 你要的理论、法则、定律、效应都在这里了
  14. android 代码 混淆- 原来如此简单
  15. x86服务器能装64位系统吗,x86处理器能装64位系统吗_64位系统装32位的可以么
  16. 微信小程序-使用对象格式数据进行遍历的坑(对象格式的赋值及遍历顺序)
  17. ThinkPHP5_无限极分类
  18. 计算笔记本电脑PPI的JavaScript小工具
  19. 考研英语 - word-list-34
  20. 屏幕小于6英寸的手机_来!推荐几款6英寸以内“小屏手机”给你

热门文章

  1. INDEX_JOIN
  2. linux上传github项目
  3. 【知识发现】隐语义模型LFM算法python实现(一)
  4. (转载)大数据与企业的数据化运营
  5. 房地产萧条的两个标志
  6. Leetcode 137. 只出现一次的数字 II 解题思路及C++实现
  7. Leetcode 103. 二叉树的锯齿形层次遍历 解题思路及C++实现
  8. Markdown与 $\LaTeX$ 公式的使用入门指南
  9. 深度学习中张量flatten处理(flatten,reshape,reduce)
  10. js实现textarea根据内容大小自适应高度