大致思路:首先把每个点的所有操作都记录下来(我用的vector),然后从1节点开始搜,到每个节点,先添加它上边的各种操作,然后计算它的值,然后dfs它的子节点,返回来再去掉它的各种操作。
我们在处理操作的时候用到了树状数组该段求点的功能,所以我们维护一个基于深度的树状数组,到达每一个点,添加它对深度的各种加减操作(改段的首位两个点),它的值即为sum(当前深度),然后dfs它的子树,当子树都搞定之后一定要把该节点的各种操作消除,否则会作用到其它节点的孩子上。
复杂度O(nlgm),m为深度
//
比赛时一直顺着线段树的思想在想如何延迟操作。。。无果只好暴力,算了算10^10的计算量大数据是注定过不了的,然后开了个1000的数组,结果出来瞬间#¥#@¥!#@##¥真是大力出奇迹。。。只能祈祷明天了
赛后想了想线段树主要是处理子树中的一部分,是横向的,而这个题是是一部分深度的节点,是纵向的。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<vector>
using namespace std;
#define mod 1000000007
int n,m,k;
long long answ;
int C[100005];
int ans[100005];
vector<int>tree[100005];//存树
struct OP
{
int l,r,v;