愛之箭發射(las)

2022-08-01 20:18:12 字數 2228 閱讀 2295

小海是弓道部的成員,非常擅長射箭(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 21 3

2 42 541

2 3

55305

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#include#include#include#include#include#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)

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)

int merge(int x,int y,int la)

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[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<>n>>m;

for(int i=1;i<=n;i++)

for(int i=1;i=1;i--)

for(int i=1;ireturn 0;}/*

5 52 2 1 4 5

1 21 3

2 42 541

2 3*/

LA 4253 箭術(二分列舉)

題意 有n個平行於x軸的線段,每條線段代表乙個靶子。判斷是否可以站在x軸上 0,w 區間內的某個位置射箭。思路 二分列舉座標點,這道題需要用到atan2函式,它返回乙個角度值,對於每個靶子,利用atan2函式確定能射中靶子的區間,如果靶子之間區間沒有重合部分,說明該座標點不能射中所有靶子。在下面的 ...

超越美俄!印度成功發射一箭104星 創造新世界紀錄

超越美俄!印度成功發射一箭104星 創造新世界紀錄,印度當地時間 2 月 15 日 9 時 28 分 北京時間 2 月 15 日 11 時 58 分 印度空間研究組織 isro 在該國南部薩迪什 達萬航天中心成功發射一箭 104 星,打破俄羅斯在 2014 年 6 月創造的 一箭 37 星 世界紀錄...