[luogu U8984][新创无际夏日公开赛] 冰精冻西瓜 [树状数组]

题目背景

盛夏,冰之妖精琪露诺发现了一大片西瓜地,终于可以吃到美味的冻西瓜啦。

题目描述

琪露诺是拥有操纵冷气程度的能力的妖精,一天她发现了一片西瓜地。这里有n个西瓜,由n-1条西瓜蔓连接,形成一个有根树,琪露诺想要把它们冷冻起来慢慢吃。

这些西瓜蔓具有神奇的性质,可以将经过它的冷气的寒冷程度放大或缩小,每条西瓜蔓放大/缩小冷气寒冷程度的能力值为Wi,表示冷气经过它后,寒冷程度值x会变为x*wi。每个西瓜也有一个寒冷程度值,炎热的夏日,所有西瓜的寒冷程度值初始都为0。

琪露诺会做出两种动作:

①.对着西瓜i放出寒冷程度为x的冷气。这股冷气顺着西瓜蔓向“西瓜树”的叶子节点蔓延,冷气的寒冷程度会按照上面的规则变化。遇到一个西瓜连了多条西瓜蔓时,每条叶子节点方向的西瓜蔓均会获得与原先寒冷程度相等的冷气。途径的所有西瓜的寒冷程度值都会加上冷气的寒冷程度值。

⑨.向你询问西瓜i的寒冷程度值是多少。

等等,为什么会有⑨?因为笨蛋琪露诺自己也会忘记放了多少冰呢。

所以,帮她计算的任务就这么交给你啦。

输入输出格式

输入格式:

第一行一个整数n,表示西瓜的数量。

西瓜编号为1~n,1为这棵“西瓜树”的根。

接下来n-1行,每行有两个整数u,v和一个实数w,表示西瓜u和西瓜v之间连接有一条藤蔓,它放大/缩小冷气寒冷程度的能力值为w。

接下来一行一个整数m,表示操作的数量。

接下来m行,每行两个或三个整数。

第一个数只能是1或9。

如果为1,接下来一个整数i和一个实数x,表示对西瓜i放出寒冷程度为x的冷气。

如果为9,接下来一个整数i,表示询问编号为i的西瓜的寒冷程度值。

输出格式:

对于每个操作⑨,输出一行一个实数,表示对应西瓜的寒冷程度值。

输入输出样例

输入样例#1:

4
1 2 1.00000000
2 3 0.00000000
3 4 1.00000101
9
1 1 3.00000000
9 2
9 3
1 2 1.42856031
9 4
9 2
1 3 4.23333333
9 2
9 4

输出样例#1:

3.00000000
0.00000000
0.00000000
4.42856031
4.42856031
4.23333761

说明

子任务可能出现如下的特殊性质:

“西瓜树”退化为一条链

输入数据中的实数均保留8位小数,选手的答案被判作正确当且仅当输出与标准答案误差不超过10^-7。请特别注意浮点数精度问题。

实际数据中,冷气的寒冷程度x的范围为 [-0.1,0.1]

(样例中的冷气寒冷程度的范围为[1,5])



20分代码

n<=1000  m<=1000

好小的树

--->朴素的、完全依照题意的遍历树算法

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<vector>
 5 #include<cmath>
 6 using namespace std;
 7
 8 inline int read(){
 9     int re=0;
10     char ch;
11     bool flag=0;
12     while((ch=getchar())!=‘-‘&&(ch<‘0‘||ch>‘9‘));
13     ch==‘-‘?flag=1:re=ch-‘0‘;
14     while((ch=getchar())>=‘0‘&&ch<=‘9‘)  re=(re<<1)+(re<<3)+ch-‘0‘;
15     return flag?-re:re;
16 }
17
18 typedef long double lb;
19
20 struct edge{
21     int to,next;
22     lb w;
23     edge(int to=0,int next=0,lb w=0):
24         to(to),next(next),w(w){}
25 };
26
27 const int maxn=100001;
28
29 const lb eps=1e-8;
30 vector<edge> edges;
31 vector<edge> tree;
32 int n,m,cnt,root=1;
33 int head[maxn],tmp_head[maxn];
34 lb data[maxn];
35
36 bool oo(lb ww){
37     if(fabs(ww)<eps)  return 0;
38     return 1;
39 }
40
41 inline void add_edge(int from,int to,lb w){
42     edges.push_back(edge(to,head[from],w));
43     head[from]=++cnt;
44     edges.push_back(edge(from,head[to],w));
45     head[to]=++cnt;
46 }
47
48 inline void add_tree(int from,int to,lb w){
49     tree.push_back(edge(to,tmp_head[from],w));
50     tmp_head[from]=++cnt;
51 }
52
53 void dfs_tree(int x,int fa){
54     for(int ee=head[x];ee;ee=edges[ee].next)
55         if(edges[ee].to!=fa){
56             add_tree(x,edges[ee].to,edges[ee].w);
57             dfs_tree(edges[ee].to,x);
58         }
59 }
60
61 void dfs(int ss,lb ww){
62     data[ss]+=ww;
63     for(int ee=head[ss];ee;ee=tree[ee].next)
64         if(oo(tree[ee].w))
65             dfs(tree[ee].to,ww*tree[ee].w);
66 }
67
68 int main(){
69     //freopen("temp.in","r",stdin);
70     cnt=0;
71     n=read();
72     edges.push_back(edge(0,0,0));
73     for(int i=1;i<n;i++){
74         int from=read(),to=read();
75         lb w;scanf("%Lf",&w);
76         add_edge(from,to,w);
77     }
78     cnt=0;
79     tree.push_back(edge(0,0,0));
80     dfs_tree(root,0);
81     swap(head,tmp_head);
82     m=read();
83     for(int i=0;i<m;i++){
84         int op=read(),ss=read();
85         if(op&8){
86             printf("%.8Lf\n",data[ss]);
87         }
88         else{
89             lb ww;scanf("%Lf",&ww);
90             dfs(ss,ww);
91         }
92     }
93     return 0;
94 }

100分代码

...

标签上写树状数组来着,可是我不会啊  QwQ

过两天等题解出来再放吧

时间: 2024-12-21 23:50:41

[luogu U8984][新创无际夏日公开赛] 冰精冻西瓜 [树状数组]的相关文章

[洛谷 P3787] 冰精冻西瓜

题目描述 琪露诺是拥有操纵冷气程度的能力的妖精,一天她发现了一片西瓜地.这里有n个西瓜,由n-1条西瓜蔓连接,形成一个有根树,琪露诺想要把它们冷冻起来慢慢吃. 这些西瓜蔓具有神奇的性质,可以将经过它的冷气的寒冷程度放大或缩小,每条西瓜蔓放大/缩小冷气寒冷程度的能力值为Wi,表示冷气经过它后,寒冷程度值x会变为x*wi.每个西瓜也有一个寒冷程度值,炎热的夏日,所有西瓜的寒冷程度值初始都为0. 琪露诺会做出两种动作: ①.对着西瓜i放出寒冷程度为x的冷气.这股冷气顺着西瓜蔓向"西瓜树"的叶

冰精冻西瓜[P3787洛谷]

题目描述 琪露诺是拥有操纵冷气程度的能力的妖精,一天她发现了一片西瓜地.这里有n个西瓜,由n-1条西瓜蔓连接,形成一个有根树,琪露诺想要把它们冷冻起来慢慢吃. 这些西瓜蔓具有神奇的性质,可以将经过它的冷气的寒冷程度放大或缩小,每条西瓜蔓放大/缩小冷气寒冷程度的能力值为Wi,表示冷气经过它后,寒冷程度值x会变为x*wi.每个西瓜也有一个寒冷程度值,炎热的夏日,所有西瓜的寒冷程度值初始都为0. 琪露诺会做出两种动作: ①.对着西瓜i放出寒冷程度为x的冷气.这股冷气顺着西瓜蔓向"西瓜树"的叶

Luogu 45887 全村最好的嘤嘤刀(线段树 树状数组)

https://www.luogu.org/problemnew/show/T45887 题目背景 重阳节到了,我们最好的八重樱拥有全村最好的嘤嘤刀…… 题目描述 在绯玉丸力量的影响下,八重村成了一条长度为 nnn 的八重街,并且绯玉丸可以带着八重樱出现在街上的任意地点.而我们的八重樱则会在街上任意穿梭来获取某一地点上的嘤嘤嘤能量,用以升级她的嘤嘤刀. 在每个时刻,都会发生以下 333 个事件: 111 xxx valvalval 表示在 xxx 地点出现了携带着 valvalval 点嘤嘤嘤能

luogu P1972 [SDOI2009]HH的项链 树状数组

之前只做过分块做法,补一下树状数组做法. 我们先考虑一个问题,如何求从[1,x]这一区间内元素不同的个数?显然我们只要从到到位,遇到一个新的元素,就在对应位置+1,然后使用树状数组求前缀和即可. 这里我们需要去求[x,y],所求区间的左端点也会发生变化.我们先按照[1,x]的方法预处理出这个前缀和数组.我们考虑对询问区间按照左端点排序.然后对于当前的区间[x0,y0],query(y0) - query(x0 - 1)与正确答案相比有所区别,是因为有些元素在x0左侧计算过了,而在这段区间中,对应

[Luogu 3787] 冰精冻西瓜

Description 琪露诺是拥有操纵冷气程度的能力的妖精,一天她发现了一片西瓜地.这里有n个西瓜,由n-1条西瓜蔓连接,形成一个有根树,琪露诺想要把它们冷冻起来慢慢吃. 这些西瓜蔓具有神奇的性质,可以将经过它的冷气的寒冷程度放大或缩小,每条西瓜蔓放大/缩小冷气寒冷程度的能力值为Wi,表示冷气经过它后,寒冷程度值x会变为x*wi.每个西瓜也有一个寒冷程度值,炎热的夏日,所有西瓜的寒冷程度值初始都为0. 琪露诺会做出两种动作: ①.对着西瓜i放出寒冷程度为x的冷气.这股冷气顺着西瓜蔓向"西瓜树&

【Luogu】P3787冰精冻西瓜(线段树)

题目链接 我脑子怕不是有坑qwqqq 用前缀和思想,dis[i]表示i离根的距离,那么修改操作其实是对x的子树区间加y/dis[x],查询的时候*dis[to]即可. 对付/0错的思路是建森林,然而这个地方我犯蠢了. qwq. #include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> #include<cctype> #include<cmath>

luogu P3787 冰精冻西瓜

嘟嘟嘟 好题,好题-- 看这个修改和询问,就知道要么是求完dfs序后线段树维护,要么是树剖.又因为这道题都是子树的操作,没有链上的,所以线段树就够了. 然而重点不是这个.这道题最麻烦的是线段树pushdown时对于每一个节点打的标记都不一样,因为每一条边上的能力值不一样.这也是这道题最巧妙的一点:我们把每一次对节点 i 放的冷气都转移到从根节点放的,这样pushdown的标记就统一了. 具体操作是啥咧:假如u到跟要经过w1, w2, w3这三条边,那么我们对u放x的冷气,就相当于从根节点放Div

Luogu【模板】树状数组

https://www.luogu.org/problemnew/show/P3374 单点修改, 区间查询 1 //2018年2月18日17:58:16 2 #include <iostream> 3 #include <cstdio> 4 using namespace std; 5 6 const int N = 500001; 7 int n, m; 8 int a[N], c[N]; 9 10 inline int lowbit(int x){ 11 return x &

[luogu P3801] 红色的幻想乡 [线段树][树状数组]

题目背景 蕾米莉亚的红雾异变失败后,很不甘心. 题目描述 经过上次失败后,蕾米莉亚决定再次发动红雾异变,但为了防止被灵梦退治,她决定将红雾以奇怪的阵势释放. 我们将幻想乡看做是一个n*m的方格地区,一开始没有任何一个地区被红雾遮盖.蕾米莉亚每次站在某一个地区上,向东南西北四个方向各发出一条无限长的红雾,可以影响到整行/整列,但不会影响到她所站的那个地区.如果两阵红雾碰撞,则会因为密度过大而沉降消失.灵梦察觉到了这次异变,决定去解决它.但在解决之前,灵梦想要了解一片范围红雾的密度.可以简述为两种操