首先 \(S(u)\) 显然是 \(u\) 的子树。

假如 \(u\) 是定点,问题转化为区间求平方和,十分简单。

于是我们用线段树维护区间平方和,支持区间加,然后离线问题,在 \(u\) 的位置处理即可。线段树从 \(fa\) 转移到 \(u\) 是极度简单的。

时间复杂度 \(O(n\log n)\)。

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+5,M=4e5+5,p=1e9+7;
int n,q,dfn[N],low[N],sm[M],pw[M],ad[M],as[N];
vector<int>g[N],w[N],qu[N],nm[N];int id,dis[N];
void push_up(int x){
sm[x]=(sm[x*2]+sm[x*2+1])%p;
pw[x]=(pw[x*2]+pw[x*2+1])%p;
}void down(int x,int a,int len){
pw[x]=(pw[x]+sm[x]*a*2+len*a%p*a)%p;
sm[x]=(sm[x]+len*a)%p,ad[x]=(ad[x]+a)%p;
}void push_down(int x,int ln,int rn){
down(x*2+1,ad[x],rn);
down(x*2,ad[x],ln),ad[x]=0;
}void add(int x,int l,int r,int L,int R,int v){
if(L<=l&&r<=R)
return down(x,v,r-l+1);
int mid=(l+r)/2;
push_down(x,mid-l+1,r-mid);
if(L<=mid) add(x*2,l,mid,L,R,v);
if(R>mid) add(x*2+1,mid+1,r,L,R,v);
push_up(x);
}int sum(int x,int l,int r,int L,int R){
if(L<=l&&r<=R) return pw[x];
int mid=(l+r)/2,re=0;
push_down(x,mid-l+1,r-mid);
if(R>mid) re=sum(x*2+1,mid+1,r,L,R);
if(L<=mid) re+=sum(x*2,l,mid,L,R);
return re;
}void dfs1(int x,int fa){
dfn[x]=++id;
add(1,1,n,id,id,dis[x]);
for(int i=0;i<g[x].size();i++){
int y=g[x][i],c=w[x][i];
if(y==fa) continue;
dis[y]=(dis[x]+c)%p,dfs1(y,x);
}low[x]=id;
}void dfs2(int x,int fa){
for(int i=0;i<g[x].size();i++){
int y=g[x][i],c=w[x][i];
if(y==fa) continue;
add(1,1,n,dfn[y],low[y],-c-c);
add(1,1,n,1,n,c),dfs2(y,x);
add(1,1,n,dfn[y],low[y],c+c);
add(1,1,n,1,n,-c);
}for(int i=0;i<qu[x].size();i++)
as[nm[x][i]]=2*sum(1,1,n,dfn[qu[x][i]],low[qu[x][i]])-pw[1];
}signed main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n;
for(int i=1;i<n;i++){
int x,y,z;cin>>x>>y>>z;
g[x].push_back(y),g[y].push_back(x);
w[x].push_back(z),w[y].push_back(z);
}cin>>q,dfs1(1,0);
for(int i=1;i<=q;i++){
int x,y;cin>>x>>y;
qu[x].push_back(y);
nm[x].push_back(i);
}dfs2(1,0);
for(int i=1;i<=q;i++)
cout<<(as[i]%p+p)%p<<"\n";
return 0;
}

[CF494D] Birthday 题解的更多相关文章

  1. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  2. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  3. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  4. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  5. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

  6. 2016ACM青岛区域赛题解

    A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  7. poj1399 hoj1037 Direct Visibility 题解 (宽搜)

    http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...

  8. 网络流n题 题解

    学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...

  9. CF100965C题解..

    求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...

  10. JSOI2016R3 瞎BB题解

    题意请看absi大爷的blog http://absi2011.is-programmer.com/posts/200920.html http://absi2011.is-programmer.co ...

随机推荐

  1. uniapp 消息推送

    1.前言 作为一个非原生App的开发者,对于手机系统的推送机制了解是是非有限的,只有了解清楚这些机制,后期的开发才会少踩很多坑,本文将对推送机制逻辑进行一个简单的梳理与记录 2.推送流程 推送流程1. ...

  2. 修改data数据后页面未更新渲染

    只需添加 this.$forceUpdate() 在修改数据后执行即可 this.$forceUpdate()

  3. Teable 团队 Sealos 最佳实践,创业公司的完美选择

    大家好,我是开源多维表格项目 Teable 的创始人陈加贝. 作为飞书多维表格的最早期负责人,我参与并见证了这个产品从 0 到 1 的全过程.这段经历也让我深入理解了企业在数据协作方面的真实需求. 以 ...

  4. 腾讯云携手Commvault,为云上用户提供安全存储服务

    11月2日获悉,腾讯云对象存储COS近日正式通过Commvault备份软件标准化测试,并获得官方认证. 同时,Commvault对COS的支持已经从底层打通.这意味着用户只要购买了腾讯云COS的云存储 ...

  5. 我们需要什么样的 ORM 框架

    了解我的人都知道, 本人一直非常排斥 ORM 框架, 由于对象关系阻抗不匹配, 一直觉得它没有什么用, 操作数据库最好的手段是 sql+动态语言. 但这两年想法有了重大改变. 2013 年用 js 实 ...

  6. 2024年1月Java项目开发指南12:前后端分离项目跨域问题解决

    创建config文件夹,创建WebConfig文件 代码如下(可以直接抄) package cc.xrilang.serversystem.config; import org.springframe ...

  7. 【Java高级编程】IO流学习笔记

    目录 IO流 File类 文件/文件夹基础操作 创建文件的完整步骤 IO流 - 节点流 读入文件一个字节(一个字节) [FileInputStream]字节数组的方式读取(读取全部内容) [FileI ...

  8. 冒泡排序------python实现

    if __name__ == '__main__': ''' 算法描述 1.比较相邻的元素,更具大小交互位置 2.对每一对相邻元素作同样的工作,从开始第一队到结尾的最后一对,即可选出最大的数 3.所有 ...

  9. 2024 Nuxt3 年度生态总结

    hello,大家好,我是程序员海军.很荣幸能与大家分享我今年的第三篇文章.在过去的一年里,我深入探索了Nuxt3,并在多个项目中实际应用了这一前沿框架,从而对其功能和应用有了全面而深刻的理解.今天,我 ...

  10. 用 Cursor 写出第一个程序

    大家好,我是汤师爷 最近几个月,Cursor迅速走红,成为一款强大的编程助手.Cursor不仅使用简单,而且通过集成各种大模型技术,编程能力一流. Cursor是什么? Cursor是一个类似VSCo ...