题目描述

琪露诺是拥有操纵冷气程度的能力的妖精,一天她发现了一片西瓜地。这里有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]

题解:

很巧妙的树状数组,线段树也可以

首先运用了“砍树”思想,因为当wi=0时,该边无法传递冻气。将整棵树以wi=0的

边为界,分成多棵树,每一棵树都求dfs并编号,记录一个点影响的区间(子树)

in[i]~out[i](就是子树dfs序号的范围,当然包括自己),

并记下每个点到该树的根的w之积

对于操作①,可以这么想,如果所有冷气都是从树根释放出来的,

那么冷冻值可以直接累加起来,最后乘以ki就能得到任意子节点的冷冻值

因此我们可以把每个操作①看做从树根释放的,那么冷冻值就是x/ki。

所以只要给冷气释放的节点和其子树都增加x/ki即可。

由于有线段树的支持,所以单次操作时间复杂度是O(logn)

对于操作⑨,只要输出树状数组(线段树)上对应节点的值乘以ki即可,时间复杂度也是O(logn)

如果不砍树,则该点的冻气的就会往wi=0的下面蔓延,不合题意。

(此处wi指边权,ki指树根到i的wi之积,与代码变量有出入)

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<queue>
 6 #include<cmath>
 7 #define ld double
 8 using namespace std;
 9 int n,m;
10 vector<int>G[100005];
11 vector<ld>dis[100005];
12 const ld eps=1e-8;
13 queue<int>q;
14 bool vis[100005];
15 int in[100005],cnt,out[100005];
16 ld c[100005],w[100005];
17 void add(int u,int v,ld d)
18 {
19     G[u].push_back(v);dis[u].push_back(d);
20     G[v].push_back(u);dis[v].push_back(d);
21 }
22 void dfs(int x)
23 {int i;
24     in[x]=++cnt;
25     vis[x]=1;
26     int l=G[x].size();
27     for (i=0;i<l;i++)
28     {
29         if (vis[G[x][i]]==0&&dis[x][i]>0)
30          {
31              w[G[x][i]]=1.00000000*w[x]*dis[x][i];
32              dfs(G[x][i]);
33          }
34          else if (vis[G[x][i]]==0)
35           q.push(G[x][i]);
36     }
37    out[x]=cnt;
38 }
39 void update(int x,ld d)
40 {int i;
41     for (i=x;i<=n;i+=(i&(-i)))
42       c[i]+=d;
43 }
44 ld query(int x)
45 {int i;
46     ld s=0;
47     for (i=x;i;i-=(i&(-i)))
48      s+=c[i];
49     return s;
50 }
51 int main()
52 {int i,u,v,k,x;
53   ld d,y;
54     cin>>n;
55      for (i=1;i<=n-1;i++)
56      {
57          scanf("%d%d%lf",&u,&v,&d);
58           add(u,v,d);
59      }
60      q.push(1);
61      cnt=0;
62       while (!q.empty())
63       {
64            w[q.front()]=1;
65             dfs(q.front());
66             q.pop();
67       }
68       scanf("%d",&k);
69       for (i=1;i<=k;i++)
70       {
71           int ch;
72           scanf("%d",&ch);
73           if (ch==1)
74           {
75               scanf("%d%lf",&x,&y);
76               ld p=y/w[x];
77               update(in[x],p);
78               update(out[x]+1,-p);
79           }
80           else
81           {
82               scanf("%d",&x);
83               printf("%.8lf\n",query(in[x])*w[x]);
84           }
85       }
86 }

转载于:https://www.cnblogs.com/Y-E-T-I/p/7120560.html

冰精冻西瓜[P3787洛谷]相关推荐

  1. [洛谷 P3787] 冰精冻西瓜

    题目描述 琪露诺是拥有操纵冷气程度的能力的妖精,一天她发现了一片西瓜地.这里有n个西瓜,由n-1条西瓜蔓连接,形成一个有根树,琪露诺想要把它们冷冻起来慢慢吃. 这些西瓜蔓具有神奇的性质,可以将经过它的 ...

  2. 洛谷-题解 P2672 【推销员】

    独门思路!链表加优先队列! 这题一望,贪心是跑不掉了,但是我贪心并不好,所以想到了一个复杂一些但思路更保稳的做法 思路: 1 因为是离线操作,所以我们可以倒着求,先求x=n的情况,因为那样直接就知道了 ...

  3. 洛谷 P1142 轰炸

    洛谷 P1142 轰炸 题目描述 "我该怎么办?"飞行员klux向你求助. 事实上,klux面对的是一个很简单的问题,但是他实在太菜了. klux要想轰炸某个区域内的一些地方,它们 ...

  4. 洛谷 P1387 最大正方形

    P1387 最大正方形 题目描述 在一个n*m的只包含0和1的矩阵里找出一个不包含0的最大正方形,输出边长. 输入输出格式 输入格式: 输入文件第一行为两个整数n,m(1<=n,m<=10 ...

  5. 洛谷P2763 试题库问题

    题目:https://www.luogu.org/problemnew/show/P2763 题目描述 «问题描述: 假设一个试题库中有n道试题.每道试题都标明了所属类别.同一道题可能有多个类别属性. ...

  6. 动态规划——洛谷_P1057传球游戏

    题目: 题目描述 上体育课的时候,小蛮的老师经常带着同学们一起做游戏.这次,老师带着同学们一起做传球游戏.游戏规则是这样的:n个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹哨子时开始传球, ...

  7. 洛谷P1417 烹调方案

    洛谷P1417 烹调方案 如果是一般的01背包的话 选的先后是没关系的 但是这题选的先后是有关系的,因为他的价值是随着时间而变化的, 而你的01背包是做不到先选2再选1的 那么我们就跟国王游戏一样 用 ...

  8. 记忆优化搜索(简单题)(洛谷P3183 [HAOI2016]食物链 )( P5635 【CSGRound1】天下第一 )

    昨天做了蓝桥杯的时候,发现自己对于记忆优化搜索甚是不熟悉,所以今天随便找了几个基础题做做,顺便写下两片题解,顺便用了一下devc++敲的代码,发现没有代码补全真的可以说是灰常难受了... 洛谷P318 ...

  9. 洛谷 - 试炼场(全部题目备份)

    整理的算法模板合集: ACM模板 目录 1.新手村 1 - 1 洛谷的第一个任务 1 - 2 顺序与分支 1 - 3 循环!循环!循环! 1 - 4 数组 1 - 5 简单字符串 1 - 6 过程函数 ...

  10. 洛谷专题训练 ——【算法1-1】模拟与高精度

    洛谷题单[算法1-1]模拟与高精度 ACM-ICPC在线模板 题单链接: [算法1-1]模拟与高精度 下面的这一坨都是洛谷题单上的东东 题单简介 恭喜大家完成了第一部分语言入门,相信大家已经可以使用 ...

最新文章

  1. linux fedora安装、运行mybase7.3.5报错:error while loading shared libraries: libpng12.so.0
  2. 【已解决】Android 如何让应用在后台运行
  3. webpack4.0各个击破(2)—— CSS篇
  4. css html基础书,htmlcss基础知识汇总,新人必看!
  5. 将多个Celery定时任务添加到Systemd
  6. 给“大学生IT博客大赛”参赛博主的一封信
  7. 北京2018年通信工程师考试报名通知
  8. 打工人福利!教你如何一秒制作日报月报
  9. PLSQL使用常用技巧
  10. Unity UnityWebRequest从网页加载图片并永久保存在本地
  11. 编写一个能将给定非负整数列表中的数字排列成最大数字的函数。
  12. 微信公众号怎么申请注册?看这一篇就够了
  13. jetbrain试用
  14. 中国 省会 地级市 经纬度 city array
  15. ThoughtWorks结对编程一面9.3(1h)二面9.8(30min)
  16. 专访强生医疗裴兴:后流量思维时代,医美行业迎来数字化大变局
  17. 2011年3月《震痛•震恫•震动》
  18. Linux网卡固件,CentOS下X710网卡升级驱动和固件脚本 | 聂扬帆博客
  19. 一般域名到期后保留多久?到期域名怎么处理?
  20. 如何打包文件及其所在目录

热门文章

  1. python使用数据画一幅画
  2. 匿名函数与闭包(珠峰版)
  3. mysql数据库中表示时间段类型_MySQL 数据库中时间字段类型的介绍 | IT工程师的生活足迹...
  4. GEM: Online Globally Consistent Dense Elevation Mapping for Unstructured Terrai
  5. 以一当十,这5个Word批量操作你要会
  6. KNN回归-预测二手车
  7. notepad++在行首行尾添加字符 | 选中列
  8. 口袋参谋:如何挑选淘宝热词?这一招很重要!
  9. Python for 循环语句详解:基础语法、range 函数、变量作用域分析
  10. 织梦及其PHP环境整合套件安装图解(详尽版)