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 问题描述: 把一个正整数分成一列连续的正整数之和.这 ...
随机推荐
- matlab 读取nc
在这里做个记录,这几个是matlab用来读取.nc格式数据的函数.只是函数,参数和变量为了便于理解,取括号中的名字. fid=netcdf.open('fname','nowriter');%打开 ...
- DataTable Group By或运算 Linq Aggregate的使用
class Program { static void Main(string[] args) { DataTable dt = new DataTable(); dt.Columns.Add(&qu ...
- awk的内置函数
常见awk内置数值函数
- Django基础知识MTV
Django简介 Django是使用Python编写的一个开源Web框架.可以用它来快速搭建一个高性能的网站. Django也是一个MVC框架.但是在Django中,控制器接受用户输入的部分由框架自行 ...
- Windows下MarialDB使用
命令行控制启动和关闭:mysqld --console #这样启动ctrl+c即为关闭 启动:双击mysqld.exe即可 #此为后台启动 关闭:mysqladmin -uroot -pr ...
- 使用awk来提取内容
1.提取gff文件中的HLA基因的相关bed文件. gff的格式: zcat *gz|gawk 'BGIN{FS="\t";OFS="\t"}$3==" ...
- JAVAWeb学习总结(一)
一.基本概念 1.1.WEB开发的相关知识 WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. Internet上供外界访问的Web资源分为: 静态web资源( ...
- Entity Framework 7 动态 DbContext 模型缓存 ModelCaching
EF7里实例化DbContext变的有点麻烦了, 下面这个基类会有所帮助: public abstract class BaseDbContext : DbContext { private stri ...
- JMeter学习(七)聚合报告之 90% Line 正确理解
90% Line 参数正确的含义: 虽然,我的上面理解有一定的道理,显然它是错误的.那看看JMeter 官网是怎么说的? 90% Line - 90% of the samples took no m ...
- H3C 交换机设置telnet WEB用户
huwei : local-user admin password cipher @#$@#$ service-type telnet ssh service-type telnet ssh leve ...