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 问题描述: 把一个正整数分成一列连续的正整数之和.这 ...
随机推荐
- 高阶函数,map,filter,sorted
Map:对列表中的每个元素进行操作 >>> def f(x): ... return x * x ... >>> map(f, [1, 2, 3, 4, 5, ...
- 备注字段长度控制JS
//变更原因备注字符长度控制 function checkChangeLength() { var field = $("#changeReasonDesc").val(); ma ...
- 【转】SVN使用教程总结
看到一篇超赞的文章,原链接:http://www.cnblogs.com/armyfai/p/3985660.html SVN简介: 为什么要使用SVN? 程序员在编写程序的过程中,每个程序员都会生成 ...
- maven 项目打包时无法解析读取properties文件
在做项目时遇见一个问题,无法解析properties文件的 内容 异常为 Could not resolve placeholder ......... 在此之前均有做相关的 配置 但是从未出现过如上 ...
- Flume+Kafka+storm的连接整合
Flume-ng Flume是一个分布式.可靠.和高可用的海量日志采集.聚合和传输的系统. Flume的文档可以看http://flume.apache.org/FlumeUserGuide.html ...
- Helm - Kubernetes包管理专家
What is Helm? - The package manager for kubernetes, Helm is the best way to find, share, and use sof ...
- SpringMVC传递参数和获取参数以及返回数据
1.传递form表单,参数接收到对象,name和对象属性对应上即可: 2.springmvc不能直接通过form表单传递多个对象的list集合,要么采用ajax传递,要么采用封装了list属性的b ...
- 关于UML方法学图中类之间的关系:依赖,泛化,关联
类与类图 1) 类(Class)封装了数据和行为,是面向对象的重要组成部分,它是具有相同属性.操作.关系的对象集合的总称. 2) 在系统中,每个类具有一定的职责,职责指的是类所担任的任务,即类要完成什 ...
- JMeter接口测试报错,反馈和postman不一样(一)
今天发现一个小的细节 同样一条请求,postman里面直接写就好 JMeter里面需要把编码加上 例如,同样一句话 postman里面这么写,返回值为 但是在JMeter里面这么写 显示结果为 在这里 ...
- Thinkpad E440个性化设置:如何/禁用关闭触摸板?
#如何禁用/关闭触摸版 默认情况下,ThinkPad E440是不支持触摸板的关闭功能,如果要关闭的话,需要去官方下载相应的鼠标驱动 UltraNav. 下载地址:http://think.lenov ...