爱之箭发射(las)
爱之箭发射(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
下发一个样例满足第一个部分分。
来源
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
*/
爱之箭发射(las)的更多相关文章
- 贪心:leetcode 870. Advantage Shuffle、134. Gas Station、452. Minimum Number of Arrows to Burst Balloons、316. Remove Duplicate Letters
870. Advantage Shuffle 思路:A数组的最大值大于B的最大值,就拿这个A跟B比较:如果不大于,就拿最小值跟B比较 A可以改变顺序,但B的顺序不能改变,只能通过容器来获得由大到小的顺 ...
- LiDAR、LAS、LAS Dataset与点云
LiDAR Light Detection And Ranging,激光探测及测距,是一种光学遥感技术,使用激光对地球表面的密集采样,产生高精度X.Y.Z测量值. 激光雷达系统的主要硬件组成部分包括一 ...
- [LeetCode] 452. Minimum Number of Arrows to Burst Balloons 最少箭数爆气球
There are a number of spherical balloons spread in two-dimensional space. For each balloon, provided ...
- [LeetCode] Minimum Number of Arrows to Burst Balloons 最少数量的箭引爆气球
There are a number of spherical balloons spread in two-dimensional space. For each balloon, provided ...
- pyqt 发射接收信号
翻页控件: 一.定义并发射信号: #!/usr/bin/python # #coding=utf-8 # __author__='' from PyQt4.QtCore import * from P ...
- Unity3D 5.x 简单实例 - 发射炮弹
1,下载.安装: http://unity3d.com/cn/get-unity/download/archive 建议直接借助 UnityDownloadAssistant 进行安装,根据需要勾选需 ...
- cc1101 ASK发射模式
cc1101 配置 433.919830Mhz 1.19948kBaud 199.951172 58.035714 #ifndef _CC1100_H_#define _CC1100_H_ ...
- 关于粒子发射(CAEmitterLayer)
技术是条长而远的路,只有不断学习丰富自己的技能才能让自己行走在路上! CAEmitterCell CAEmitterCell: CAEmitterCell是粒子发射系统里的粒子,用CAEmitterC ...
- (视频)《快速创建网站》 4.2 完结篇 – 应用运营vs.发射卫星,遥测(Telemetry) 技术
本文是<快速创建网站>系列的第10篇(完结篇),如果你还没有看过之前的内容,建议你点击以下目录中的章节先阅读其他内容再回到本文.访问本系列目录,请点击:http://devopshub.c ...
随机推荐
- java Socket 客户端服务端对接正确写法(BIO)
之前在工作中写过一些Socket客户端与服务端的代码,但是当时没有时间仔细研究,只能不报错先过的态度,对其细节了解不深,写的代码有各种问题也浑然不知,只是业务量级以及对接方对接代码没有出现出格的情况所 ...
- 借鉴一些关于js框架的东西
八款Js框架介绍及比较,Dojo .Scriptaculous .Prototype .yui-ext .Jquery .Mochikit.mootools .moo.fx,componentartu ...
- 2018年ElasticSearch6.2.2教程ELK搭建日志采集分析系统(教程详情)
章节一 2018年 ELK课程计划和效果演示1.课程安排和效果演示 简介:课程介绍和主要知识点说明,ES搜索接口演示,部署的ELK项目演示 es: localhost:9200 k ...
- 01_14_Struts2_结果类型_result_type
01_14_Struts2_结果类型_result_type 1. result类型 result类型 说明 dispatcher 默认服务端转发jsp chain 服务端action转发 redir ...
- 黑马基础阶段测试题:创建Phone(手机)类,Phone类中包含以下内容:
package com.swift; public class Phone { private String pinpai; private int dianliang; public String ...
- centos 6 安装VMware Tools
开启虚拟机的centos系统, 在虚拟机工具栏点击 “虚拟机”=>VMwareTools安装, centos系统内的桌面会有一个VMware Tools的驱动光驱, 双击打开后,有一个tar. ...
- 第1 章初识Python
1.print()—输出 print()函数的基本用法如下: print(输出内容) 其中,输出内容可以是数字和字符串(使用引号括起来),此类内容将直接输出,也可以是包含运算符的表达式,此类内容将计算 ...
- Iframe父子间元素操作
1.在父页面 获取iframe子页面的元素 (在同域的情况下 且在http://下测试,且最好在iframe onload加载完毕后 dosomething...) js写法 a.通过contentW ...
- oracle中常用的两个伪列
伪列 伪列就行oracle中的一个列表,但世界上它并未存储在表中,伪列可以被查询但是不能被插入或者更改. rowID 该伪列返回该行地址,可以使用rowID值来定位表中的一行.通常rowID值可以标识 ...
- 06.VUE学习之非常实用的计算属性computed实例
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...