ACM-ICPC 2018 沈阳赛区网络预赛 J Ka Chang
思路:
dfs序+树状数组+分块
先dfs处理好每个节点的时间戳
对于每一层,如果这一层的节点数小于sqrt(n),那么直接按照时间戳在树状数组上更新
如果这一层节点个数大于sqrt(n),那么直接存一下这一层每个节点的大小(都是一样的),这样的层数不会超过sqrt(n)层
然后查询的时候先在树状数组查询答案,然后再遍历第二种层数,加到答案中
复杂度:n*sqrt(n)*log(n)
代码:
- #pragma GCC optimize(2)
- #pragma GCC optimize(3)
- #pragma GCC optimize(4)
- #include<bits/stdc++.h>
- using namespace std;
- #define fi first
- #define se second
- #define pi acos(-1.0)
- #define LL long long
- #define mp make_pair
- #define pb push_back
- #define ls rt<<1, l, m
- #define rs rt<<1|1, m+1, r
- #define ULL unsigned LL
- #define pll pair<LL, LL>
- #define pii pair<int, int>
- #define piii pair<pii, int>
- #define mem(a, b) memset(a, b, sizeof(a))
- #define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
- #define fopen freopen("in.txt", "r", stdin);freopen("out.txt", "w", stout);
- //head
- const int N = 1e5 + ;
- vector<int>g[N];
- int in[N], out[N], deep[N], n, tot = ;
- LL val[N], bit[N];
- vector<int>dfn[N];
- vector<int>big;
- void add(int x, int v) {
- while(x <= n) bit[x] += v, x += x&-x;
- }
- LL query(int x) {
- LL ans = ;
- while(x) ans += bit[x], x -= x&-x;
- return ans;
- }
- void dfs(int o, int u, int d) {
- deep[u] = d;
- in[u] = ++tot;
- dfn[d].pb(tot);
- for (int v:g[u]) {
- if(v != o) dfs(u, v, d+);
- }
- out[u] = tot;
- }
- int main() {
- int q, u, v, blo, ty, l, x;
- scanf("%d %d", &n, &q);
- blo = sqrt(n);
- for (int i = ; i < n; i++) {
- scanf("%d %d", &u, &v);
- g[u].pb(v);
- g[v].pb(u);
- }
- dfs(, , );
- for(int i = ; i < n; i++) {
- if(dfn[i].size() > blo) big.pb(i);
- }
- while(q--) {
- scanf("%d", &ty);
- if(ty == ) {
- scanf("%d %d", &l, &x);
- if(dfn[l].size() <= blo) {
- for (int i = ; i < dfn[l].size(); i++) {
- add(dfn[l][i], x);
- }
- }
- else val[l] += x;
- }
- else {
- scanf("%d", &x);
- LL ans = query(out[x]) - query(in[x]-);
- for (int i = ; i < big.size(); i++) {
- int d = big[i];
- int t = upper_bound(dfn[d].begin(), dfn[d].end(), out[x]) - lower_bound(dfn[d].begin(), dfn[d].end(), in[x]);
- ans += 1LL * t * val[d];
- }
- printf("%lld\n", ans);
- }
- }
- return ;
- }
ACM-ICPC 2018 沈阳赛区网络预赛 J Ka Chang的更多相关文章
- ACM-ICPC 2018 沈阳赛区网络预赛 J. Ka Chang (分块思想)
题目链接:https://nanti.jisuanke.com/t/31451 题意: 给你一颗树,树上各点有初始权值,你有两种操作: 1. 给树中深度为l的点全部+x,(根节点为1,深度为0) 2. ...
- ACM-ICPC 2018 沈阳赛区网络预赛 J. Ka Chang(树状数组+分块)
Given a rooted tree ( the root is node 1 ) of N nodes. Initially, each node has zero point. Then, yo ...
- ACM-ICPC 2018 沈阳赛区网络预赛 J. Ka Chang (树分块)
题意:一个树,支持两种操作:1.将深度为L的节点权置加上X;2.求以x为根节点的子树上节点权置之和.根节点深度为0. 分析:考虑用树状数组维护节点权置,按dfs序下标查询.记录每个深度节点的个数.如果 ...
- ACM-ICPC 2018 沈阳赛区网络预赛 J. Ka Chang(树上分块+dfs序+线段树)
题意 链接:https://nanti.jisuanke.com/t/A1998 给出一个有根树(根是1),有n个结点.初始的时候每个结点的值都是0.下面有q个操作,操作有两种,操作1.将深度为L(根 ...
- ACM-ICPC 2018 沈阳赛区网络预赛 J树分块
J. Ka Chang Given a rooted tree ( the root is node 11 ) of NN nodes. Initially, each node has zero p ...
- ACM-ICPC 2018 徐州赛区网络预赛 J. Maze Designer (最大生成树+LCA求节点距离)
ACM-ICPC 2018 徐州赛区网络预赛 J. Maze Designer J. Maze Designer After the long vacation, the maze designer ...
- ACM-ICPC 2018 沈阳赛区网络预赛 K Supreme Number(规律)
https://nanti.jisuanke.com/t/31452 题意 给出一个n (2 ≤ N ≤ 10100 ),找到最接近且小于n的一个数,这个数需要满足每位上的数字构成的集合的每个非空子集 ...
- ACM-ICPC 2018 沈阳赛区网络预赛-K:Supreme Number
Supreme Number A prime number (or a prime) is a natural number greater than 11 that cannot be formed ...
- ACM-ICPC 2018 沈阳赛区网络预赛-D:Made In Heaven(K短路+A*模板)
Made In Heaven One day in the jail, F·F invites Jolyne Kujo (JOJO in brief) to play tennis with her. ...
随机推荐
- Golang错误处理函数defer、panic、recover、errors.New介绍
在默认情况下,当发生错误(panic)后,程序就会终止运行 如果发生错误后,可以捕获错误,并通知管理人员(邮件或者短信),程序还可以继续运行,这当然无可厚非 errors.New("错误信息 ...
- 【题解】Luogu P3871 [TJOI2010]中位数
平衡树板题 原题传送门 这道题要用Splay,我博客里有对Splay的详细介绍 每次加入一个数,把数插入平衡树中 并且要记录一共有多少个数 每次查询就查询平衡树中第(总数-1)/2+1个数 十分暴力 ...
- 【Python026--字典内键方法】
一,内键方法 1.fromkeys(...) 语法:dict1.fromkeys(s[,v]):s指的是字典的键值,[,v]指的是可选项(值),[,v]不填写的话默认为none #不填写第二个值,默认 ...
- 2018年11月10日 input,print,pass 用法,条件语句+字符串
name=input('请输入用户名')#永远等待用户输入 password=input('请输入密码') print(name) print(password) 变量定义的规则: 变量名只能是 字母 ...
- Python3 tkinter基础 Label imag显示图片
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...
- Python3基础 dict in/not in 查询一个字符是否指定字典的键或者值
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...
- noip模拟【ping】
70:很容易想到的是枚举每一个可能的答案来判断是否可行,取最优即可,贪心选择. 100:满足题目条件的这个距离是满足单调性的.如果x不行,那么大于x的距离都不行,二分答案. 学会运用二分,by ws_ ...
- LightOJ 1030 Discovering Gold(概率DP)题解
题意:1~n每格都有金子,每次掷骰子,掷到多少走几步,拿走那格的金子,问你金子的期望 思路:dp[i]表示从i走到n金子的期望,因为每次最多走1<=x<=6步,所以dp[i] = a[i] ...
- [nginx] - 使用nginx实现反向代理,动静分离,负载均衡,session共享
反向代理概念 先说正向代理,比如要访问youtube,但是不能直接访问,只能先找个FQ软件,通过FQ软件才能访问youtube. FQ软件就叫做正向代理.所谓的反向代理,指的是用户要访问youtube ...
- MPI 环境搭建问题-运行程序闪退
安装后smpd无法运行,进程中没有smpd.exe.注册过程也完成了.运行自带的测试程序cpi.exe,提示:Error: No smpd passphrase specified through t ...