【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>
#define left (rt<<1)
#define right (rt<<1|1)
#define mid ((l+r)>>1)
#define lson l,mid,left
#define rson mid+1,r,right
#define maxn 2000020
#define eps 1e-8
using namespace std; inline long long read(){
long long num=,f=;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-') f=-;
ch=getchar();
}
while(isdigit(ch)){
num=num*+ch-'';
ch=getchar();
}
return num*f;
} struct Edge{
int next,to;
double val;
}edge[maxn*];
int head[maxn],num;
inline void add(int from,int to,double val){
edge[++num]=(Edge){head[from],to,val};
head[from]=num;
} double tree[maxn*];
double tag[maxn*];
int dfn[maxn];
int root[maxn];
int father[maxn];
int top[maxn];
int son[maxn];
int deep[maxn];
int size[maxn];
double dis[maxn];
int tme,n,m; void unifnd(int x,int fa){
if(x==fa){
dis[x]=;
root[x]=x;
}
else root[x]=root[fa];
deep[x]=deep[fa]+; size[x]=;
for(int i=head[x];i;i=edge[i].next){
int to=edge[i].to;
if(deep[to]) continue;
if(fabs(edge[i].val)>eps){
father[to]=x;
dis[to]=dis[x]*edge[i].val;
unifnd(to,x);
size[x]+=size[to];
if(son[x]==||size[son[x]]<size[to]) son[x]=to;
}
else unifnd(to,to);
}
return;
} void unionn(int x,int Top){
dfn[x]=++tme; top[x]=Top;
if(son[x]==) return;
unionn(son[x],Top);
for(int i=head[x];i;i=edge[i].next){
int to=edge[i].to;
if(to==father[x]||to==son[x]) continue;
if(edge[i].val==) continue;
unionn(to,to);
}
} inline void prepare(){
unifnd(,);
for(int i=;i<=n;++i)
if(dfn[i]==) unionn(root[i],root[i]);
} inline void pushup(int rt){ tree[rt]=tree[left]+tree[right]; } void pushdown(int rt,int m){
if(fabs(tag[rt])<=eps) return;
tag[left]+=tag[rt]; tag[right]+=tag[rt];
tree[left]+=tag[rt]*(m-(m>>));
tree[right]+=tag[rt]*(m>>);
tag[rt]=;
} void update(int from,int to,double num,int l,int r,int rt){
if(from<=l&&to>=r){
tree[rt]+=num*(r-l+);
tag[rt]+=num;
return;
}
pushdown(rt,r-l+);
if(from<=mid) update(from,to,num,lson);
if(to>mid) update(from,to,num,rson);
} double query(int o,int l,int r,int rt){
if(l==r) return tree[rt];
double ans=;
pushdown(rt,r-l+);
if(o<=mid) ans+=query(o,lson);
else ans+=query(o,rson);
return ans;
} void add(int x,double num){
update(dfn[x],dfn[x]+size[x]-,num/dis[x],,n,);
return;
} inline double ask(int x){
return query(dfn[x],,n,)*dis[x];
} int main(){
n=read();
for(int i=;i<n;++i){
int x=read(),y=read();
double z; scanf("%lf",&z);
add(x,y,z);
add(y,x,z);
}
prepare();
m=read();
for(int i=;i<=m;++i){
int opt=read(),x=read();
if(opt==){
double y; scanf("%lf",&y);
add(x,y);
}
else printf("%.8lf\n",ask(x));
}
return ;
}
【Luogu】P3787冰精冻西瓜(线段树)的更多相关文章
- luogu P3787 冰精冻西瓜
嘟嘟嘟 好题,好题…… 看这个修改和询问,就知道要么是求完dfs序后线段树维护,要么是树剖.又因为这道题都是子树的操作,没有链上的,所以线段树就够了. 然而重点不是这个.这道题最麻烦的是线段树push ...
- [Luogu 3787] 冰精冻西瓜
Description 琪露诺是拥有操纵冷气程度的能力的妖精,一天她发现了一片西瓜地.这里有n个西瓜,由n-1条西瓜蔓连接,形成一个有根树,琪露诺想要把它们冷冻起来慢慢吃. 这些西瓜蔓具有神奇的性质, ...
- [洛谷 P3787] 冰精冻西瓜
题目描述 琪露诺是拥有操纵冷气程度的能力的妖精,一天她发现了一片西瓜地.这里有n个西瓜,由n-1条西瓜蔓连接,形成一个有根树,琪露诺想要把它们冷冻起来慢慢吃. 这些西瓜蔓具有神奇的性质,可以将经过它的 ...
- luogu P2574 XOR的艺术 (线段树)
luogu P2574 XOR的艺术 (线段树) 算是比较简单的线段树. 当区间修改时.\(1 xor 1 = 0,0 xor 1 = 1\)所以就是区间元素个数减去以前的\(1\)的个数就是现在\( ...
- 【原创】洛谷 LUOGU P3373 【模板】线段树2
P3373 [模板]线段树 2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格式: 第 ...
- 【原创】洛谷 LUOGU P3372 【模板】线段树1
P3372 [模板]线段树 1 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.求出某区间每一个数的和 输入输出格式 输入格式: 第一行包含两个整数N.M,分别 ...
- [luogu P3787][新创无际夏日公开赛] 冰精冻西瓜 [树状数组][dfs序]
题目背景 盛夏,冰之妖精琪露诺发现了一大片西瓜地,终于可以吃到美味的冻西瓜啦. 题目描述 琪露诺是拥有操纵冷气程度的能力的妖精,一天她发现了一片西瓜地.这里有n个西瓜,由n-1条西瓜蔓连接,形成一个有 ...
- 冰精冻西瓜[P3787洛谷]
题目描述 琪露诺是拥有操纵冷气程度的能力的妖精,一天她发现了一片西瓜地.这里有n个西瓜,由n-1条西瓜蔓连接,形成一个有根树,琪露诺想要把它们冷冻起来慢慢吃. 这些西瓜蔓具有神奇的性质,可以将经过它的 ...
- Luogu P1198 BZOJ 1012 最大数 (线段树)
手动博客搬家: 本文发表于20170821 14:32:05, 原地址https://blog.csdn.net/suncongbo/article/details/77449455 URL: (Lu ...
随机推荐
- AE开发关于OnMapReplaced方法的使用原理
The OnMapReplaced event is triggered whenever the IMapControl2::Map is replaced by another map, such ...
- 2002-2003 ACM-ICPC Northeastern European Regional Contest (NEERC 02) A Amusing Numbers (数学)
其实挺简单的.先直接算出之前已经排在k这个数前面的数字.比如543是三位的,那么100~543都是可以的,两位的10~54. 如果还需要往前面补的话,那么依次考虑1000~5430,5430是上界不能 ...
- OO第三次电梯作业优化
目录 第三次电梯作业个人优化 前言 优化思路 一.调度器 二.电梯 第三次电梯作业个人优化 前言 由于个人能力有限,第二次电梯作业只能完成正确性设计,没能进行优化,也因此损失了强测分数,于是第三次电梯 ...
- 判断用户ip是否在指定的一个ip段内
/** * 判断ip是否在一个ip段内 * * @param args */ public static boolean ipExistsInRange(String ip, String ipSec ...
- MVCPager学习小记
1.PageIndexParameterName怎么关联? 答:其实就是Action里面的pageindex参数 例子: @Html.Pager(Model, new PagerOptions { P ...
- 01_10_Struts2_2.1.6版本的中文问题
01_10_Struts2_2.1.6版本的中文问题 1. 由于Struts2_2.1.6存在bug 正常情况下在struts.xml配置如下一行 <constant name="st ...
- 为什么要在函数内部声明 var that = this 呢
看一个例子 $('#conten').click(function(){ //this是被点击的#conten var that =this; $('.conten').each(function() ...
- Redis 和缓存技术
Redis 是什么?什么作用?优点和缺点? https://blog.csdn.net/weixin_42295141/article/details/81380633 Redis 的主要功能哨兵+复 ...
- 【贪心 计数】bzoj2006: [NOI2010]超级钢琴
这么经典的贪心我怎么现在才做啊…… Description 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的 音乐. 这架超级钢琴可以弹奏出n个 ...
- 图解一致性协议2PC和3PC
原图地址:https://www.processon.com/diagraming/5b89f6ace4b0d4d65bf10786