https://nanti.jisuanke.com/t/31451

对每层的个数分块
当这个深度的节点个数>block时
暴力维护每个点的子树有多少个这个深度的节点
这样的层数最多有n/block个
预处理复杂度O(n*n/block)
修改直接修改这个层数总共加了多少

当深度的节点个数<=block时
暴力修改这个深度的每个节点
用一个bit或者线段树维护树的dfs序区间和

查询分别对大块和小块查询
贡献就是bit上的子树dfs序区间和 + 每个大块的个数*大块上的权

#include <iostream>
#include <algorithm>
#include <sstream>
#include <string>
#include <queue>
#include <cstdio>
#include <map>
#include <set>
#include <utility>
#include <stack>
#include <cstring>
#include <cmath>
#include <vector>
#include <ctime>
#include <bitset>
#include <assert.h>
using namespace std;
#define pb push_back
#define sd(n) scanf("%d",&n)
#define sdd(n,m) scanf("%d%d",&n,&m)
#define sddd(n,m,k) scanf("%d%d%d",&n,&m,&k)
#define sld(n) scanf("%lld",&n)
#define sldd(n,m) scanf("%lld%lld",&n,&m)
#define slddd(n,m,k) scanf("%lld%lld%lld",&n,&m,&k)
#define sf(n) scanf("%lf",&n)
#define sff(n,m) scanf("%lf%lf",&n,&m)
#define sfff(n,m,k) scanf("%lf%lf%lf",&n,&m,&k)
#define ss(str) scanf("%s",str)
#define ansn() printf("%d\n",ans)
#define lansn() printf("%lld\n",ans)
#define r0(i,n) for(int i=0;i<(n);++i)
#define r1(i,e) for(int i=1;i<=e;++i)
#define rn(i,e) for(int i=e;i>=1;--i)
#define mst(abc,bca) memset(abc,bca,sizeof abc)
#define lowbit(a) (a&(-a))
#define all(a) a.begin(),a.end()
#define pii pair<int,int>
#define pll pair<long long,long long>
#define mp(aa,bb) make_pair(aa,bb)
#define lrt rt<<1
#define rrt rt<<1|1
#define X first
#define Y second
#define PI (acos(-1.0))
double pi = acos(-1.0);
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
const ll mod = 1000000007;
const double eps=1e-12;
const int inf=0x3f3f3f3f;
//const ll infl = 100000000000000000;//1e17
const int maxn=  2e5+20;
const int maxm = 5e3+20;
//muv[i]=(p-(p/i))*muv[p%i]%p;
inline int in(int &ret) {char c;int sgn ;if(c=getchar(),c==EOF)return -1;while(c!='-'&&(c<'0'||c>'9'))c=getchar();sgn = (c=='-')?-1:1;ret = (c=='-')?0:(c-'0');while(c=getchar(),c>='0'&&c<='9')ret = ret*10+(c-'0');ret *=sgn;return 1;
}
int dep[maxn];
int cnt[maxn];
vector<int>g[maxn];
vector<int>had[maxn];
vector<int>big;
bool bi[maxn];
int p1[maxn],p2[maxn];
int tot;
int block;
int mxdep;
void dfs(int u,int f) {int sz = g[u].size();p1[u] = ++tot;++cnt[dep[u]];mxdep = max(mxdep,dep[u]);r0(i,sz) {int v = g[u][i];dep[v] = dep[u] + 1;dfs(v,u);}p2[u] = tot;
}
vector<int>sml[maxn];
void dfs2(int u,int f) {int sz = g[u].size();int udep = dep[u];int bs = big.size();had[u].resize(bs,0);for(int i=0; i<sz; ++i) {int v = g[u][i];dfs2(v,u);for(int j=0; j<bs; ++j)had[u][j] += had[v][j];}if(bi[udep]) {int pos = lower_bound(all(big),udep) - big.begin();++had[u][pos];} else sml[udep].pb(u);
}
ll add[maxn];
ll bit[maxn];
int n;
void upd(int x,int v) {for(;x<=n;) {bit[x] += v;x+=lowbit(x);}
}
ll query(int x) {ll r = 0 ;for(; x; x-=lowbit(x)) {r += bit[x];}return r;
}
int main() {
#ifdef LOCALfreopen("input.txt","r",stdin);
//    freopen("output.txt","w",stdout);
#endif // LOCALint q;sdd(n,q);block = sqrt(n/log2(n));r0(i,n-1) {int a,b;sdd(a,b);g[a].pb(b);}dfs(1,0);for(int i=0; i<=mxdep; ++i)if(cnt[i]>block)bi[i] = 1,big.pb(i);dfs2(1,0);for(; q--;) {int op;sd(op);if(op&1) {int x,v;sdd(x,v);if(bi[x])add[x] += v;else {int sz = sml[x].size();for(int i=0; i<sz; ++i) {int id = sml[x][i];int p = p1[id];upd(p,v);}}} else {int x;sd(x);ll ans = query(p2[x]) - query(p1[x]-1);int bs = big.size();r0(i,bs) {int cnt = had[x][i];ll v = add[big[i]];ans += v*cnt;}lansn();}}return 0;
}

ACM-ICPC 2018 沈阳赛区网络预赛 J Ka Chang 分块相关推荐

  1. ACM-ICPC 2018 沈阳赛区网络预赛 J Ka Chang(树分块)

    思路 因为不同深度的节点数量不同,数量少的节点,可以考虑直接进行单点更新,对于数量多的节点,可以直接记录这一层增加的值,查询的时候,看每一层有多少个节点,最后乘上增加的值就行了. 具体实现 先设定一个 ...

  2. ACM-ICPC 2018 沈阳赛区网络预赛(E F G J K)

    ACM-ICPC 2018 沈阳赛区网络预赛(E F G J K) 复杂的模拟题懒癌患者表示写不动 D. Made In Heaven (K短路) 略 int head[MAXN]; int cure ...

  3. ACM-ICPC 2018 沈阳赛区网络预赛 Spare Tire(容斥+公式推)

    A sequence of integer \lbrace a_n \rbrace{an​} can be expressed as: \displaystyle a_n = \left\{ \beg ...

  4. ACM-ICPC 2018 焦作赛区网络预赛 J(二分+JAVA高精)

    传送门 题面: 65536K Jessie and Justin want to participate in e-sports. E-sports contain many games, but t ...

  5. 【ACM-ICPC 2018 沈阳赛区网络预赛 I】Lattice's basics in digital electronics

    [链接] 我是链接,点我呀:) [题意] [题解] 每个单词的前缀都不同. 不能更明示了... 裸的字典树. 模拟一下.输出一下就ojbk了. [代码] #include <bits/stdc+ ...

  6. Convex Hull (ACM-ICPC 2018 沈阳赛区网络预赛) 存个公式

    Convex Hull gay(i)={0ifi=k×x×x,x>k,k>1i×ielse}求∑i=1n∑j=1igay(j)=∑i=1n(n−i+1)gay(i)=∑i=1n(n−i+1 ...

  7. ACM-ICPC 2018 南京赛区网络预赛 J Sum(欧拉线性筛+思维)

    Sum 问题分析 题意:我们将类似于6=2⋅36=2⋅36 = 2\cdot 3这样的数称为asquare−freeintegerasquare−freeintegera\:square-free\: ...

  8. ACM-ICPC 2018 南京赛区网络预赛 J AC Challenge (状压dp)

    题意 给你n道题,在你做第ii{i}道题的时候有p[j]p[j]{p[j]}个前置条件,当这些前置条件都满足的时候,我们可以得到a[j]∗t+b[j]a[j]∗t+b[j]a[j] * t + b[j ...

  9. 【ACM-ICPC 2018 沈阳赛区网络预赛】I.Lattice's basics in digital electronics ---- 字典树

    题目传送门 做法: 用字典树存好译码词,然后模拟即可 AC代码: #include <bits/stdc++.h> using namespace std;#define IO ios_b ...

最新文章

  1. python调用api应用接口_第三方免费快递物流查询接口平台(快递鸟)api接口调用...
  2. c调用易语言串口,易语言串口API源码
  3. Array Elimination 运算,gcd,思维
  4. java iterator如何倒序输出
  5. [bzoj3532][Sdoi2014]Lis
  6. 使用Python内置集合对象和内置函数filter()过滤无效书评
  7. 电子换向电动机行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
  8. securecrt delete键向后删除
  9. 字典树-大量字符串前缀及出现次数是否存在统计(Trie树-java)算法实现
  10. a 标签 jq js 打开新页面跳转
  11. ui设计网站资料大全,你想要的都有
  12. 错误:Error:java.lang.RuntimeException: Some file crunching failed, see logs for details解决方案
  13. Deepin20.5安装maven
  14. matlab 鲁棒性分析,电液速度系统的鲁棒性分析及MATLAB计算
  15. 常用通讯电平转换电路整理
  16. 运维python要掌握到什么程度_《运》字意思读音、组词解释及笔画数 - 新华字典 - 911查询...
  17. SylixOS命令行下内存操作/测试工具
  18. EduCoder-Web程序设计基础 -web编程训练-html5-文档头部-第1关:页面标题及字符集的设置
  19. 在Vue里使用G2地图制作省级地图展示各市级数据
  20. excel根据条件列转行_excel怎么批量把行变成列

热门文章

  1. 《魔灵保卫者》服务端架构及实现
  2. 子查询(嵌套查询)——MySQL
  3. cuda 单block多线程
  4. 企业邮箱Foxmail提示错误421 too many connections
  5. linux中的dns中的hint,DNS问题
  6. RecycleView实现Gallery画廊效果,中间放大两边缩小
  7. 米兔机器人自主编程_米兔积木机器人编程指南.pdf
  8. linux 命令:su 详解
  9. 交易市场中的测不准原理
  10. html文字注释,css如何注释?