test20181016 B君的第二题
题意


分析
考场暴力50分。
考虑bfs序,一个点的儿子节点的bfs序一定连续,所以对bfs序建线段树,努力打一下就行了。
时间复杂度\(O(n \log n + m \log n)\)
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#include<string>
#include<vector>
#include<list>
#include<deque>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<bitset>
#include<algorithm>
#include<complex>
#define rg register
#define co const
#define il inline
#pragma GCC optimize ("O0")
using namespace std;
template<class T> inline T read(T&x)
{
T data=0;
int w=1;
char ch=getchar();
while(!isdigit(ch))
{
if(ch=='-')
w=-1;
ch=getchar();
}
while(isdigit(ch))
data=10*data+ch-'0',ch=getchar();
return x=data*w;
}
typedef long long ll;
const int INF=0x7fffffff;
const int MAXN=2e5+7;
struct Edge
{
int nx,to;
}E[MAXN<<1];
int head[MAXN],ecnt;
il void addedge(rg co int&x,rg co int&y)
{
E[++ecnt].to=y;
E[ecnt].nx=head[x],head[x]=ecnt;
}
const int mod=1e9+7;
struct node
{
int sumv;
il node(rg co int&s=0):sumv(s){}
il node operator+(rg const node&rhs)const
{
return node((sumv + rhs.sumv) % mod);
}
};
int ql,qr,v;
struct SegTree
{
node data[MAXN<<2];
int addv[MAXN<<2],mulv[MAXN<<2];
#define lson (now<<1)
#define rson (now<<1|1)
il void build(rg int now,rg int l,rg int r)
{
addv[now]=0,mulv[now]=1;
if(l==r)
{
data[now].sumv=0;
return;
}
rg int mid=(l+r)>>1;
build(lson,l,mid);
build(rson,mid+1,r);
data[now]=data[lson]+data[rson];
}
il void pushdown(rg int now,rg int l,rg int r)
{
if(mulv[now]!=1)
{
data[lson].sumv = (ll) data[lson].sumv * mulv[now] % mod,
addv[lson] = (ll) addv[lson] * mulv[now] % mod;
mulv[lson] = (ll) mulv[lson] * mulv[now] % mod;
data[rson].sumv = (ll) data[rson].sumv * mulv[now] % mod,
addv[rson] = (ll) addv[rson] * mulv[now] % mod;
mulv[rson] = (ll) mulv[rson] * mulv[now] % mod;
mulv[now] = 1;
}
if(addv[now])
{
rg int mid=(l+r)>>1;
(data[lson].sumv += (ll) (mid - l + 1) * addv[now] % mod ) %= mod,
(addv[lson] += addv[now]) %= mod;
(data[rson].sumv += (ll) (r - mid) * addv[now] % mod) %= mod,
(addv[rson] += addv[now]) %= mod;
addv[now]=0;
}
}
il node query(rg int now,rg int l,rg int r)
{
if(ql<=l&&r<=qr)
{
return data[now];
}
pushdown(now,l,r);
rg int mid=(l+r)>>1;
if(qr<=mid)
return query(lson,l,mid);
if(ql>=mid+1)
return query(rson,mid+1,r);
return query(lson,l,mid)+query(rson,mid+1,r);
}
il void mul(rg int now,rg int l,rg int r)
{
if(ql<=l&&r<=qr)
{
data[now].sumv = (ll)data[now].sumv * v % mod,
addv[now] = (ll)addv[now] * v % mod,
mulv[now] = (ll)mulv[now] * v % mod;
return;
}
pushdown(now,l,r);
rg int mid=(l+r)>>1;
if(ql<=mid)
mul(lson,l,mid);
if(qr>=mid+1)
mul(rson,mid+1,r);
data[now]=data[lson]+data[rson];
}
il void add(rg int now,rg int l,rg int r)
{
if(ql<=l&&r<=qr)
{
(data[now].sumv += (ll)(r - l + 1) * v % mod) %= mod,
(addv[now] += v) %= mod;
return;
}
pushdown(now,l,r);
rg int mid=(l+r)>>1;
if(ql<=mid)
add(lson,l,mid);
if(qr>=mid+1)
add(rson,mid+1,r);
data[now]=data[lson]+data[rson];
}
}T;
int fa[MAXN],s1[MAXN],s2[MAXN];
il void dfs(rg co int&x,rg co int&f)
{
fa[x]=f;
for(rg int i=head[x];i;i=E[i].nx)
{
rg int y=E[i].to;
if(y==f)
continue;
if(!s1[x]) // edit 1:cannot add fa
s1[x]=y;
s2[x]=y;
dfs(y,x);
}
}
int bfn[MAXN],clk;
il void bfs()
{
rg queue<int>Q;
Q.push(1);
while(!Q.empty())
{
rg int x=Q.front();
Q.pop();
bfn[x]=++clk;
for(rg int i=head[x];i;i=E[i].nx)
{
rg int y=E[i].to;
if(y==fa[x])
continue;
Q.push(y);
}
}
}
int main()
{
freopen("ruby.in","r",stdin);
freopen("ruby.out","w",stdout);
rg int n,m;
read(n);read(m);
for(rg int i=1;i<n;++i)
{
rg int x,y;
read(x);read(y);
addedge(x,y);
addedge(y,x);
}
dfs(1,0);
bfs();
T.build(1,1,n);
while(m--)
{
rg int x,k,b;
read(x);read(k);read(b);
rg int ans=0;
if(bfn[fa[x]]) // edit 1:fa[root]=NULL
{
ql=qr=bfn[fa[x]];
v=k;
T.mul(1,1,n);
v=b;
T.add(1,1,n);
(ans += T.query(1,1,n).sumv) %= mod;
}
ql=qr=bfn[x];
v=k;
T.mul(1,1,n);
v=b;
T.add(1,1,n);
(ans += T.query(1,1,n).sumv) %= mod;
if(bfn[s1[x]]) // edit 2:leaf has no son
{
ql=bfn[s1[x]],qr=bfn[s2[x]];
v=k;
T.mul(1,1,n);
v=b;
T.add(1,1,n);
(ans += T.query(1,1,n).sumv) %= mod;
}
printf("%d\n",ans);
}
// fclose(stdin);
// fclose(stdout);
return 0;
}
Hint
第一次打bfs序的题,有些细节需要注意。
一个点可能没有父节点或没有子节点,需要特判。
dfs的首尾子节点的赋值注意不要赋值成fa了。
test20181016 B君的第二题的更多相关文章
- test20181020 B君的第二题
题意 分析 考场70分 一看就是裸的kmp,直接打上去. #include<cstdlib> #include<cstdio> #include<cmath> #i ...
- B 君的第二题 (hongkong)
B 君的第二题 (hongkong) 题目大意: 一个长度为\(n(n\le2\times10^5)\)的数组,给定一个数\(k(k\le40)\).用\(a[i][j]\)表示该数组\(i\)次前缀 ...
- test20181017 B君的第二题
题意 分析 考场50分 旁边的L君告诉我,求的就是非升子序列的个数,于是写了个树状数组. 但是\(\mod{2333} > 0\)还需要组合数中没有2333的倍数,所以实际上只得了\(a_i \ ...
- test20181016 B君的第一题
题意 分析 考场爆零做法 考虑位数少的一定更小,高位小的一定更少. 然后计算一定位数下不同数字的个数,然后从高到低依次确定数位. 特例:如果确定的高位的后缀出现了x,那么要把x调整到后缀去,这样一定更 ...
- test20181015 B君的第二题
题意 分析 考场85分 用multiset暴力,由于教练的机子飞快,有写priority_queue水过了的人. #include<cstdlib> #include<cstdio& ...
- test20181019 B君的第二题
题意 分析 快速子集和变换以及快速超集和变换的裸题. 用\(f(s)\)表示集合s的方案数,初始化为输入中s出现的次数. 做一遍快速子集和变换,此时f(s)表示s及其子集在输入中出现的次数. 对所有f ...
- Java蓝桥杯02——第二题集锦:生日蜡烛、星期一、方格计数、猴子分香蕉
第二题 生日蜡烛(结果填空) 某君从某年开始每年都举办一次生日party,并且每次都要吹熄与年龄相同根数的蜡烛. 现在算起来,他一共吹熄了236根蜡烛. 请问,他从多少岁开始过生日party的? 请填 ...
- 05:统计单词数【NOIP2011复赛普及组第二题】
05:统计单词数 总时间限制: 1000ms 内存限制: 65536kB 描述 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次 ...
- 常见面试第二题之什么是Context
今天的面试题,也就是我们常见面试题系列的第二题,我们来讲一讲android中的context.我相信大家android开发者一定对于这个context非常熟悉,肯定都有使用过,肯定没有没使用过的.但是 ...
随机推荐
- jsp动作之 forward
forward说明了,就想当于php的include,require函数.(但是它是跳转.forward之前的数据都不会显示) 这么说你明白了吗.就是包含,说的好听点就是跳转,但是url地址栏却是没有 ...
- sql一些语句性能及开销优化
1.应用程序中,保证在实现功能的基础上,尽量减少对数据库的访问次数:通过搜索参数,尽量减少对表的访问行数,最小化结果集,从而减轻网络负担:能够分开的操作尽量分开处理,提高每次的响应速度:在数据窗口使用 ...
- 真核生物基因结构 & mRNA结构
参考: 分子生物学教材 再一次,翻看真核生物基因结构! mRNA基本结构特点 Structure and function of Messenger RNA (mRNA ) 基因结构 其实这个结构不完 ...
- 清空mailq 队列里面的邮件
tmp_=`mailq | grep -E "root" | awk '{print $1}'` for i in $tmp_;do postsuper -d $i;done po ...
- Confluence 6 LDAP 用户组结构设置
用户组对象类(Group Object Class) 这是在 LDAP 用户组对象中使用的类的名字.例如: groupOfUniqueNames group 用户组对象过滤器(Group Object ...
- Idea改项目名
1.点开.idea文件夹,找到 modules.xml,更改里面的项目名 2.根目录下对应的.iml文件 3.右击 pom.xml 文件,选择最下面的 “ Add as maven build fil ...
- Codeforces Round #449 (Div. 1)C - Willem, Chtholly and Seniorious
ODT(主要特征就是推平一段区间) 其实就是用set来维护三元组,因为数据随机所以可以证明复杂度不超过O(NlogN),其他的都是暴力维护 主要操作是split,把区间分成两个,用lowerbound ...
- python-day8-循环补充
# msg='hello'# msg=[1,2,3,4,5,6]# msg=(1,2,3,4,5,6) # index=0# while index < len(msg):# print(msg ...
- Leetcode 92
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode ...
- quartz---(1)
Quartz Quartz是什么? 简单的一些例子 Quartz是什么 简单的认为Quartz是是一个定时器. 1.1. 下载 http://www.quartz-scheduler.org/down ...