Zijian-lv #3 树句节狗提
如你所见,这是一道狗题
一棵树,多次询问与一个点距离至少为 $k$ 的点的权值和
$n,q \leq 2525010$
sol:
长链剖分
需要注意的是这道题卡空间
我把我所有的 vector 换成链表才过了
#include <bits/stdc++.h>
#define LL long long
#define rep(i, s, t) for (register int i = (s), i##end = (t); i <= i##end; ++i)
#define dwn(i, s, t) for (register int i = (s), i##end = (t); i >= i##end; --i)
using namespace std;
inline int read() {
int x = , f = ; char ch;
for (ch = getchar(); !isdigit(ch); ch = getchar()) if (ch == '-') f = -f;
for (; isdigit(ch); ch = getchar()) x = * x + ch - '';
return x * f;
}
const int maxn = ;
int n, q, lim;/*
vector<pair<int, int> > qs[maxn];
vector<int> G[maxn];*/
int qcd[maxn];
struct Chain {
int head[maxn], nx[maxn], id[maxn], sz;
Chain() {memset(head, , sizeof(head)); sz = ;}
inline void AddItem(int pos, int Item, int other = -) {
id[++sz] = Item;
nx[sz] = head[pos];
head[pos] = sz;
if(~other) qcd[sz] = other;
}
}qs, G;
LL ans[maxn], pool[maxn], *f[maxn], *now=pool+;
int a[maxn];
void print(int q, LL* ans, int lim) {
LL res;
for(int i = ; i <= q; ) {
res = ;
for(int j = i; j <= min(q, i + lim - ); j++) res ^= ans[j];
i += lim;
printf("%lld\n", res);
}
return ;
}
int mxs[maxn], mxd[maxn];
void dfs(int x) {
mxd[x] = ;
for(int i=G.head[x];i;i=G.nx[i]) {
dfs(G.id[i]);
mxd[x] = max(mxd[x], mxd[G.id[i]] + );
if((mxd[G.id[i]] > mxd[mxs[x]])) mxs[x] = G.id[i];
}
}
void solve(int x) {
if(mxs[x]) {
f[mxs[x]] = f[x] + ;
solve(mxs[x]);
}
f[x][] = a[x];
for(int i=G.head[x];i;i=G.nx[i]) {
if(G.id[i] == mxs[x]) continue;
f[G.id[i]] = now; now += mxd[G.id[i]] + ; solve(G.id[i]);
rep(j, , mxd[G.id[i]]) f[x][j+] += f[G.id[i]][j];
//cout << "to: " << to << " " << f[x][1] << endl;
}
//cout << x << " " << f[x][1] << endl;
/*dwn(i, mxd[x]-1, 0) {
cout << f[x][i] << " jiale " << f[x][i + 1] << endl;
f[x][i] += f[x][i + 1];
}*/
f[x][] += f[x][];
for(int i=qs.head[x];i;i=qs.nx[i]) {
if(qs.id[i] > mxd[x]) ans[qcd[i]] = ;
else ans[qcd[i]] = f[x][qs.id[i]];
}/*
if(qs[x].size()) {
// cout << "DEBUG: " << qs[x].first << " " << qs[x].second << " " << f[x][qs[x].first] << endl;
// if(qs[x].first > mxd[x]) ans[qs[x].second] = 0;
// else
/*cout << "x: " << x << endl;
rep(i, 0, mxd[x])
cout << f[x][i] << " ";
cout << endl;*/
/*
for(auto ii : qs[x]) {
//cout << "DEBUG: " << ii.first << " " << mxd[x] << endl;
if(ii.first > mxd[x]) ans[ii.second] = 0;
else ans[ii.second] = f[x][ii.first];
}
}*/
}
int main() {
n = read(); int x, y;
rep(i, , n) a[i] = read();
rep(i, , n) {
//x = read(), G[x].push_back(i);
x = read();
G.AddItem(x, i);
}
q = read();
rep(i, , q) {
x = read(); y = read();
//qs[x].push_back(make_pair(y, i));
qs.AddItem(x, y, i);
} mxd[] = -;
dfs();
f[] = now; now += mxd[] + ; solve();
lim = read();
print(q, ans, lim);
//rep(i, 1, q) cout << ans[i] << endl;
}
论我的没 log 跑得没别人带 log 快
Zijian-lv #3 树句节狗提的更多相关文章
- [OJ#63]树句节够提
[OJ#63]树句节够提 试题描述 给定一棵节点数为 N 的有根树,其中 1 号点是根节点,除此之外第 i 个节点的父亲为 fi.每个节点有一个权值 Ai,所有边权均为 1. 给定 Q 个询问,每个询 ...
- Java实现二叉搜索树的添加,前序、后序、中序及层序遍历,求树的节点数,求树的最大值、最小值,查找等操作
什么也不说了,直接上代码. 首先是节点类,大家都懂得 /** * 二叉树的节点类 * * @author HeYufan * * @param <T> */ class Node<T ...
- 覆盖的面积 HDU - 1255 (线段树-扫描线)模板提
给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积. Input输入数据的第一行是一个正整数T(1<=T<=100),代表测试数据的数量.每个测试数据的第一行是一个正整数N(1& ...
- hdoj 1856 More is better【求树的节点数】
More is better Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 327680/102400 K (Java/Others) ...
- 题解 P3252 【[JLOI2012]树】
\(\Huge{[JLOI2012]树}\) 题目描述 在这个问题中,给定一个值S和一棵树.在树的每个节点有一个正整数,问有多少条路径的节点总和达到S.路径中节点的深度必须是升序的.假设节点1是根节点 ...
- 树链剖分I 原理
树链剖分(Heavy Light Decomposition, HLD)是一种将对[树上两点间的路径]上[边或点]的[修改与查询]转化到[序列]上来处理的方法. 目的:将树的边或点转化到一个线性结构( ...
- LSM树由来、设计思想以及应用到HBase的索引
讲LSM树之前,需要提下三种基本的存储引擎,这样才能清楚LSM树的由来: 哈希存储引擎 是哈希表的持久化实现,支持增.删.改以及随机读取操作,但不支持顺序扫描,对应的存储系统为key-value存储 ...
- BZOJ2783: [JLOI2012]树 dfs+set
2783: [JLOI2012]树 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 588 Solved: 347 Description 数列 提交文 ...
- BZOJ2783: [JLOI2012]树
Description 数列 提交文件:sequence.pas/c/cpp 输入文件:sequence.in 输出文件:sequence.out 问题描述: 把一个正整数分成一列连续的正整数之和.这 ...
随机推荐
- ubuntu搭建mib2c环境
1.下载net-snmphttp://net-snmp.sourceforge.net/download.html例如,下载5.5版本2.进入下载目录,解压net-snmp压缩包#tar zxf ne ...
- Django为什么要跳转到不同的页面来实现不同的功能
其实是不同将信息提交给不同的页面交给不同的页面去处理同一个数据库,不同的模块实现不同的功能,当要实现某一个功能的时候直接跳转到那一个功能下面的url,可以把要实现的功能区分开,以python面向对象的 ...
- Windows读写文件的猫腻
这里主要涉及对于回车换行的讨论. 回车:\r 换行:\n Windows读写文件分为普通文件读写和二进制文件读写. 如果以二进制的方式读写文件(如rb, wb),将会完全的把文件内容读出来,不做任何处 ...
- sudoers文件设置sudo命令无密码(root密码)登录
参考博客:http://xvshell.iteye.com/blog/1838093 1. 当用户执行sudo时,Linux系统会去寻找/etc/sudoers文件,并且这是主动的,判断用户是否有执行 ...
- JAVA 判断对象内容是否含有空值
简单判断对象是否含有NULL值,以及信息描述. package com.sicdt.sicsign.bill.api.util; import java.lang.reflect.Invocation ...
- R基本画图
参考内容:闻博,R语言的绘图功能及应用案例 https://wenku.baidu.com/view/80f22fa50029bd64783e2c22.html R画图是以函数操作为基本的画图模式. ...
- transition失效问题
关于transition,css教程中有一个很简单的例子: <!DOCTYPE html> <html> <head> <meta charset=" ...
- Go Interface概念
简单地说 Interface是一组Method的组合,可以通过Interface来定义对象的一组行为.如果某个对象实现了某个接口的所有方法,就表示它实现了该借口,无需显式地在该类型上添加接口说明.In ...
- 【P1947】笨笨当粉刷匠(DP+前缀和)
这个题乍一看觉得挺简单的,事实上却完全不是.首先,这个题看上去无脑直接刷就可以然而因为刷的次数远远大于木板的个数所以不行,然后开始考虑DP,自己一开始是这么想的,如果用f[t][i][j]表示刷t次时 ...
- Solr 报错:java.lang.NoClassDefFoundError: org/apache/http/entity/mime/content/ContentBody
HBase协处理器中使用Solr时报错,如下 2018-07-11 17:06:14,054 INFO [LruBlockCacheStatsExecutor] hfile.LruBlockCache ...